需求
打包多个app,App名称,应用图标,包名,启动页都不一样,如果打包一个,然后又替换一下资源,再打下一个,真的会疯了,一次还好,要是有啥bug需要改,又得重新来一遍。。。
app名称-->resValue
如下使用,需要注意的是,在string.xml中不能有相同的字段,否则会报错。 bool、color、dimen也可以使用同样的方法配置
productFlavors {
myapp1 {
resValue "string", "app_name", "myapp1"
resValue "bool", "isrRank", 'false'
}
}
string:类型 app_name:字段名 myapp1:字段的值,最后生成R.string.app_name = "myapp1"
应用图标-->manifestPlaceholders
使用manifestPlaceholders配置添加,常用于AndroidManifest中 meta-data中数据配置,比如友盟,高德地图,百度地图的key
build.gradle
productFlavors {
myapp1 {
manifestPlaceholders = [
UMENG_APPKEY:"key值",
app_icon:"@drawable/ic_launcher_myapp1"
]
}
}
AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="${app_icon}"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/AppTheme">
<meta-data
android:name="UMENG_APPKEY"
android:value="${UMENG_APPKEY}" />
</application>
包名-->applicationId
使用这个,也可以方便的区分开测试和生产的包,可以使一台手机安装两个包(Android上安装APK,看是否是同一个app,就是看包名是否一致,不一致则认为是两个不同的app)
productFlavors {
myapp1 {
applicationId 'com.myapp1'
}
}
启动页图片-->buildConfigField
buildConfigField这个应该用得也挺多的,比如生产环境和开发环境,接口地址肯定是不一样的,这时候,就可以通过buildConfigField去配置接口地址,配置完成之后会在BuildConfig.java中生成对应的字段,比如下面的代码:
productFlavors {
myapp1 {
buildConfigField 'String', "API_ENV", '"http://192.168.165.191:8081/api/"'
buildConfigField "Integer", "SPLASH", "R.drawable.screen_myapp1"
}
prod {
buildConfigField 'String', "API_ENV", '"http://xx.xx/api/"'
buildConfigField "Integer", "SPLASH", "R.drawable.screen_prod"
}
对应的在BuildConfig.java文件中会生成:
public static final String API_ENV = "http://192.168.165.191:8081/api/";
public static final Integer SPLASH = R.drawable.screen_myapp1;
使用的时候直接调用BuildConfig.API_ENV就可以获取到当前环境的地址。极大的简便了每次打包修改环境的麻烦(或许会觉得这样接口地址很容易被反编译的找到,但是接口地址,直接抓包也很容易拿到。。。)。同样的启动页也可以直接调用mIvSplash.setBackgroundResource(BuildConfig.SPLASH)设置
通过以上方式,我们基本可以 通过 gradle 动态设定应用标题,应用图标,替换常量,设置不同包名,更改渠道等等。
切换运行时环境
在左下角打开Build Variant选项,选择需要的运行配置,每个环境都有debug和release选择
完整代码
build.gradle
android {
flavorDimensions 'api'
productFlavors {
myapp1 {
resValue "string", "app_name", "myapp1"
buildConfigField 'String', "API_ENV", '"http://192.168.165.191:8081/api/"'
buildConfigField "Integer", "SPLASH", "R.drawable.screen_myapp1"
manifestPlaceholders = [
app_icon:"@drawable/ic_launcher_myapp1"
]
applicationId 'com.myapp1'
}
myapp2 {
resValue "string", "app_name", "myapp2"
buildConfigField 'String', "API_ENV", '"http://xx.xx/api/"'
buildConfigField "Integer", "SPLASH", "R.drawable.screen_myapp2"
manifestPlaceholders = [
app_icon:"@drawable/ic_launcher_myapp2"
]
applicationId 'com.myapp2'
}
}
}
AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="${app_icon}"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/AppTheme">
</application>