使用Gradle配置打出不同的渠道包
需求如下
我们要使用一套代码打出几个包,包与包的差异如下:
1.icon不同
2.app_name不同
3.登录的机构id不同(即每个包的机构id不相同)
开始改造
打开app模块的build.gradle
我们这里虚拟两个包,苹果和香蕉
android{//android模块下创建productFlavors
defaultConfig{
applicationId ""
//...
flavorDimensions "default"//在AS3.0+,需要添加这句
}
productFlavors{
apple{
}
banana{
}
}
}
需要注意,需要在defaultConfig中添加配置项flavorDimensions "default",否则会报错
All flavors must now belong to a named flavor dimension. Learn more at…
我们可以在apple/banana中添加丰富的配置,如下
apple {
// 每个环境包名不同,单独配置的applicationId会覆盖默认值
applicationId "com.apple.dev"
// 动态添加 string.xml 字段;
// 注意,这里是添加,在 string.xml 不能有这个字段,会重名!!!
resValue "string", "app_name", "dev_myapp"
resValue "bool", "isrRank", 'false'
// 动态修改 常量 字段
buildConfigField "String", "ENVIRONMENT", '"dev"'
// 修改 AndroidManifest.xml 里渠道变量
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "dev"]
}
为我们不同的包,添加不同的app_name,BuildConfig字段
productFlavors{
apple{
resValue "string", "app_name", "苹果"//不同的appname
buildConfigField "String", "ENVIRONMENT", '"dev"'
buildConfigField "int", "VALUE", '22'
buildConfigField "boolean", "HTTPS", 'true'
}
//...
}
我们看到BuildConfig字段中的 String值,使用的是'"dev"'
我们查找了资料发现有很多种写法。如下
// 单引号写法
buildConfigField 'String', 'string1', '\"string1value\"'
// 双引号写法
buildConfigField "String", "string2", "\"string2value\""
// 单双引号的写法,最简洁不⽤转义,推荐该写法
buildConfigField 'String', 'string3', '"string3value"'
根据查阅的资料,还是推荐单引号引用双引号的
如果只是一个双引号。会直接把字串中的值,复制到BuildConfig中,丢掉双引号,如下面的int 值和boolean值,直接使用双引号即可
另外注意:
app_name在string.xml中我们要删除,不然会出现重名错误
我们再看一下如何设置不同的icon
<application
android:icon="${app_icon}"
android:label="@string/app_name"
android:theme="@style/AppTheme">
...
<meta-data
android:name="UMENG_CHANNEL"
android:value="${ENVIRONMENT}" />
...
</application>
设置如下:
productFlavors {
apple {
manifestPlaceholders = [ENVIRONMENT: "apple",
app_icon : "@drawable/icon_apple"]
}
banana {
manifestPlaceholders = [ENVIRONMENT: "banana",
app_icon : "@drawable/icon_banana"]
}
}
重要的一点
因为上面的apple|banana是我们另添加的配置,我们运行代码时也会使用到,所以我们在defaultConfig 也要添加一份相同配置
问题解决
问题1:
在使用resValue时,我们发现在<manifest标签中,使用
android:label="@string/app_name" 时,会显示我们引用的三方库中的app_name,怎么也无法显示我们定义的”苹果“,”香蕉“这个应用名称
resValue "string", "app_name", "苹果"
我们使用下面的方式解决
使用manifestPlaceholders,不再使用res/string的资源
huawen{
manifestPlaceholders=[app_icon:"@mipmap/ic_launcher",gpis_app_name:"苹果"]
buildConfigField "int", "org_id", '20'
}
在Manifist.xml中使用如下
<application
android:name=".MainApplication"
android:allowBackup="true"
android:icon="${app_icon}"
android:label="${gpis_app_name}"
...
tools:replace="android:allowBackup,android:theme,android:name,android:label"
tools:targetApi="n">
关键点在添加:
tools:replace="android:label"
否则会报错误。
暂无评论
要发表评论,您必须先 登录