使用Gradle构建多版本app

####资源文件个性化处理
res目录下的都算资源文件(layout、values、drawable、mipmap)java

  1. 在build.gradle中定义productFlavorsandroid

    android {
         compileSdkVersion 23
         buildToolsVersion "24.0.2"
         defaultConfig {
             applicationId "com.atearsan.multiflavors"
     	    minSdkVersion 14
             targetSdkVersion 23
             versionCode 1
     	    versionName "1.0"
         }
         buildTypes {...}
         productFlavors {
             free {
             }
             pro {
             }
         }  
     }
  2. (在src目录下)建立与productFlavors对应的文件夹git

  3. 将个性化处理的资源文件放到productFlavors对应的资源目录中(没有资源目录就按照main/res的结构建立) "说明"github

  4. 资源文件个性化处理规则
          命名要同样
          文件路径要同样
          好比productFlavors-pro的app_name要改为"MultiFlavors-PRO", 就在pro下建立strings.xml, 而后添加<string name="app_name">MultiFlavors-PRO</string>就行了
          ![](http://7xqmjb.com1.z0.glb.clouddn.com/2016091810427截图 2016-09-18 16时57分25秒.png?imageView2/2/w/900)app

####AndroidManifest.xml内容个性化处理ide

  1. 新增属性 (新增的属性按照正常的写法就行了)
        <activity android:name=".view.activity.ProActivity" />
  2. 覆盖main/AndroidManifest.xml中的属性 (好比覆盖meta-data的值)
        文字很差描述, 直接看图片对比吧.     ![](http://7xqmjb.com1.z0.glb.clouddn.com/2016091866407截图 2016-09-18 17时32分55秒.png?imageView2/2/w/1100)
        AndroidManifest.xml内容的合并, 关键是tools:replace的使用. 更多内容参考: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger

####java文件性化处理
java文件处理起来会麻烦不少, 并且不适合项目大范围的修改. 由于改起来比较累 :(
假如如今`main`中有一个java类:NextActivity.class, 如今要改为在`pro`中toast提示"pro", 在`free`中toast提示"free".
1.把NextActivity.class复制到freepro对应的包路径下 (包路径保持一致)
2.删除main中的NextActivity.class类. (不删除的话, 编译的时候会提示NextActivity类重复)
3.在freepro中分别实现本身须要的逻辑         ####'包名'个性化处理
首先, 咱们要弄懂Android程序中applicationIdpackageName的区别.
简单粗暴的理解, packageName是咱们能看到的程序的资源文件的路径. 好比:com.atearsan.multiflavors, 这个就是程序的包结构, 每一个类的第一句是package com.atearsan.multiflavors.view.activity. 引用某个类的时候会有一句import com.atearsan.multiflavors.R.
applicationId是APK的惟一标识, 在Android系统中, applicationId才表明一个惟一的应用. 建立一个project的时候, applicationId默认就是咱们指定的包结构路径. 能够在build.gradle中找到. 经过代码获取到的packageName就是applicationId, 可是反编译APK就会发现看到的目录结果跟applicationId不一致, 而是咱们编写代码的时候的目录结构.
因此, 本段内容的标题中'包名'实际是指applicationId. 咱们通常说一份代码发布多个版本的APK, 修改的也是applicationId.
注意: 程序代码获取到的packageName其实是applicationId, 因此第三方服务(好比各类推送、各类分享、各类登陆)要在AndroidManifest.xml中配置包名的时候也是指applicationIdpost

android {
	compileSdkVersion 23
	buildToolsVersion "24.0.2"

    defaultConfig {
	    //applicationId "com.atearsan.multiflavors"     // 默认值. 改为在productFlavors中定义
        minSdkVersion 14
	    targetSdkVersion 23
    	//versionCode 1                                 // 改为在productFlavors中定义
        //versionName "1.0"
	}
    buildTypes {...}

	productFlavors {
    	free {
        	applicationId "com.free.xx.oo"
            versionCode 1
	        versionName "v1.0"
    	}

        pro {
	        applicationId "com.atearsan.multiflavors.pro"
    	    versionCode 2
        	versionName "v1.1"
        }
	}
}

####依赖库(lib)及混淆个性化处理 android { buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { free { applicationId "com.free.xx.oo" versionCode 1 versionName "v1.0" } pro { applicationId "com.atearsan.multiflavors.pro" versionCode 2 versionName "v1.1" proguardFiles 'proguard-rules-pro.pro' // 混淆个性化处理 } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' proCompile 'com.android.support:appcompat-v7:23.4.0' // 依赖库个性化处理 }gradle

####demo源码 (git.osc) http://git.oschina.net/atearsan/MultiFlavorsDemoui

####参考内容 如何使用Gradle构建不一样版本的app?
Manifest Merger
android基础:applicationId与packageName的区别
[Android] 应用的包名:ApplicationId vs PackageName.net

相关文章
相关标签/搜索