Android 多渠道打包配置
前言
为统计渠道数据和利用渠道进行操作,需进行渠道打包。本文目旨在熟悉原生gradle多渠道打包的方式,了解android基本的gradle构建配置,熟悉代码构建目录,设置输出apk的位置和名字,切换工作渠道环境。gradle打包可以详细的自定义配置,但渠道过多会导致构建费时。
1.多渠道打包的方式
1.android studio 原生gradle多渠道打包(本文)
2.友盟多渠道打包 https://github.com/umeng/umeng-muti-channel-build-tool
3.美团多渠道打包 https://github.com/GavinCT/AndroidMultiChannelBuildTool
4.360多渠道打包 https://github.com/seven456/MultiChannelPackageTool
关于以上方式均为github开源打包工具项目,参考https://blog.csdn.net/yancey_blog/article/details/52738817
2.原生gradle多渠道打包
原理为采用在AndroidManifest.xml的节点中添加如下元素,构建时替换value值
方式一
1.在AndroidManifest.xml中Application节点里添加meta节点,如下,其中CHANNEL_VALUE在gradle中进行配置
<meta-data
android:name="CHANNEL"
android:value="${CHANNEL_VALUE}" />
2.build.gradle中的android{}中添加渠道配置
productFlavors {
xiaomi {
applicationId "com.mmm.xiaomi"
buildConfigField('String', 'API_SERVICE_URL', MI_API_SERVICE_URL)
applicationIdSuffix ".xiaomi"
manifestPlaceholders = [CHANNEL_VALUE: "XIAOMI",
AMAP_VALUE : "xxx"]
}
huawei {
applicationId "com.mmm.huawei"
applicationIdSuffix ".huawei"
buildConfigField('String', 'API_SERVICE_URL', HUA_API_SERVICE_URL)
manifestPlaceholders = [CHANNEL_VALUE: "HUAWEI",
AMAP_VALUE : "xxx"]
}
}
直接替换所有渠道名,无需挨个写
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
applicationId不同渠道配置不同的应用id
buildConfigField 不同渠道配置相关的参数,例如调用服务器地址
manifestPlaceholders 不同渠道替换manifest配置的参数,例如渠道号,三方的key例如高德地图的key之类的
applicationIdSuffix 额外添加包名com.mmm.xiaomi.xiaomi
另一种配置如下:
a.添加channels.properties渠道信息配置文件
#默认渠道
channel.default=XIAOMI
#全部渠道列表
channel.list=XIAOMI,HUAWEI
b.添加channel.gradle文件
//获取 properties
Properties properties = new Properties()
properties.load(project.rootProject.file('channels.properties').newDataInputStream())
String channelDefault = properties.getProperty('channel.default')
String channleList = properties.getProperty('channel.list')
String[] channelArray = channleList.split(',')
android {
productFlavors {
for (int i = 0 ; i < channelArray.size(); i++) {
def channel = channelArray[i]
"${channel}"{
manifestPlaceholders = [CHANNEL_VALUE: channel]
}
}
}
}
c.应用channel.gradle文件
apply from: "../channels.gradle"
3.代码中获取渠道号
/**
* 获取渠道号
*/
private fun getChannel():String {
val applicationInfo = App.context.packageManager.getApplicationInfo(App.context.packageName,
PackageManager.GET_META_DATA)
return applicationInfo.metaData.getString("CHANNEL") ?: ""
}
4.Flavors dimension维度
android {
...
defaultConfig {
...
flavorDimensions "abi", "channel"
}
productFlavors {
freeapp {
dimension "channel"
...
}
arm {
dimension "abi"
...
}
x86 {
dimension "abi"
...
}
}
}
flavorDimensions维度, 在defaultConfig{}声明,根据顺序构建相应的风味版本
上述文件生成的渠道风味版本为
armFreeappRelease/armFreeappDebug/x86FreeappRelease/x86FreeappDebug
5.根据不同渠道配置不同的打包签名配置
一般而言,常用根据buildType配置打包签名如下
signingConfigs {
releaseConfig {
storeFile file("buildkey/release.keystore")
storePassword "123456"
keyAlias "release"
keyPassword "123456"
v1SigningEnabled true
v2SigningEnabled true
}
debugConfig {
storeFile file("buildkey/debug.keystore")
storePassword "123456"
keyAlias 'debug'
keyPassword '123456'
v1SigningEnabled true
v2SigningEnabled true
}
}
buildTypes {
debug {
...
signingConfig signingConfigs.debugConfig
}
release{
...
signingConfig signingConfigs.releaseConfig
}
}
根据渠道进行配置
signingConfigs {
xiaomi {
storeFile file('xiaomi.jks')
storePassword '123456'
keyAlias 'xiaomi
keyPassword '123456'
v1SigningEnabled true
v2SigningEnabled true
}
huawei {
storeFile file('huawei.jks')
storePassword '123456'
keyAlias 'huawei'
keyPassword '123456'
v1SigningEnabled true
v2SigningEnabled true
}
}
buildTypes {
release {
...
productFlavors.fengrun.signingConfig signingConfigs.xiaomi
productFlavors.qianxi.signingConfig signingConfigs.huawei
}
}
6.修改输出apk的包名
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.flavorName}-${defaultConfig.versionName}-${releaseTime()}.apk"
}
}
上述代码添加了渠道号-版本号-打包时间
7.不同的渠道使用不同的资源文件
添加资源文件夹 res-xiaomi;res-huawei如下所示
在android{}下配置
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
java.srcDirs = ['src/main/java']
resources.srcDirs = ['src/main/resources']
aidl.srcDirs = ['src/main/aidl']
renderscript.srcDirs = ['src/maom']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['src/main/assets']
jniLibs.srcDir 'src/main/jniLibs'
}
xiaomi.res.srcDirs = ['src/main/res-xiaomi']
huawei.res.srcDirs = ['src/main/res-huawei']
}
8.关于打包
一些打渠道包命令
./gradlew assembleRelease #打全渠道release包
./gradlew assembleDebug #debug
./gradlew assembleXiaomi #打小米的所有buildType包
./gradlew assembleXiaomiRelease #打小米的Release包
./gradlew installXiaomiRelease 小米Release模式打包并安装
希望对gradle能熟练操作,进行打包