最近要做一个 android 产品的变种版本,需要编出不同版本,每个版本有不同的包名、图标等等,和一些特有的逻辑。

很久之前做过类似的工作,当时没有 gradle, 用的方法是把公共代码抽成一个 library,不同版本建一个工程引用公共 libery。但是这种方法每个版本要建一个工程,工作量较大,并且会有一些重复代码,不好维护。

现在的工程是用 gradle 构建的,网上查了一下应该用 product flavors 做这个事情,之前没接触过,现在把方法记录在这里。

定义多版本

Product flavors 用法很简单。在 build.gradle 的 android 段中加入

android
{
...

productFlavors {
demo1 {
applicationId "com.mycompany.demo1"
}
demo2 {
applicationId "com.mycompany.demo2"
}
}
}

gradle 的任务里就会多了 assembleDemo1 和 assembleDemo2,可以编出不同的版本。applicationId 是 apk 的包名,而且这个 applicationId 不会影响资源类 R 所在的包,在代码里不同版本引用的 class R 都是在 AndroidManifest.xml 所指定的 package 里,所以很方便。

Android Studio 界面左下角有个Build Variants 的选项,可以选择当前编那个版本。

添加多版本的资源文件目录

在 sourceSets段中可以设置不同版本的代码和资源位置。

 sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src/main/java']
resources.srcDirs = ['src/main/java']
aidl.srcDirs = ['src/main/java']
renderscript.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
demo1.java.srcDirs = ['src/demo1/java']
demo1.res.srcDirs = ['src/demo1/res']
demo2.java.srcDirs = ['src/demo2/java']
demo2.res.srcDirs = ['src/demo2/res']
}

这里 main 是公共的代码和资源,demo1 及 demo2 中找不到的文件会在 main 中查找,因此每个版本下只要放自己改动过的文件就可以了。

多版本配置

在 productFlavors 中,可以指定配置

productFlavors {
demo1 {
applicationId "com.mycompany.demo1"
buildConfigField 'String', 'HOST', '"http://www.baidu.com"'
}
demo2 {
applicationId "com.mycompany.demo2"
buildConfigField 'String', 'HOST', '"http://www.google.com"'
}

在代码中可以用 BuildConfig.HOST 来访问不同的配置。

控制不同权限

如果不同版本权限不同,可以用 manifestPlaceholders 修改 AndroidManifest.xml 中的内容来实现。

AndroidManifest.xml 中:

    <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="${billPermission}" />

对 billPermission 设置不同的值,可以控制有没有内购权限:

    productFlavors {
demo1 {
applicationId "com.mycompany.demo1"
manifestPlaceholders = [
"billPermission": "com.android.vending.BILLING",
]
}
demo2 {
applicationId "com.mycompany.demo2"
manifestPlaceholders = [
"billPermission": "android.permission.INTERNET",
]
}

只有 demo1 有 com.android.vending.BILLING 权限。demo2 由于 INTERNET 权限和前面重复,会被忽略掉

Product Flavor 还有许多可以控制的地方,了解更多可以访问Android Plugin DSL Referrence

更多相关文章

  1. react native 0.49 android版本热更新
  2. Android低版本使用ActionBar导入v7-appcompat出现的问题
  3. 同时兼容高低版本的setBackground跟setTextColor方法
  4. Android高版本使用照相机报错 Camera error
  5. 不同Android版本设备正确获取屏幕分辨率的通用方法
  6. eclipse中修改工程的Android版本
  7. 【边做项目边学Android】手机安全卫士04_02:从服务器下载并安装新
  8. Android SDK需要ADT 23或更高版本
  9. Android实现一键复制粘贴,兼容低版本系统(api 11以下)

随机推荐

  1. github项目解析(五)-->android日志框架
  2. Android(安卓)Retrofit 2.0(一)初次见面请
  3. Android不完全退出主Activity的方法
  4. 10个 iOS 用户暂可以嘲笑 Android 的特点
  5. android高仿抖音、点餐界面、天气项目、
  6. Windows电脑:Android Studio 连接不上设备
  7. 2017年起至今的android各版本占比(持续更
  8. Android图表引擎aiCharts for Android v1
  9. Android之设置EditText输入类型(setInput
  10. Android 线性布局