1. 多渠道的概念
- APP发布到不同的应用平台,监测用户是从哪个平台安装的。
2. 为什么要多渠道打包
- 统计用户安装APP来源
- 批量修改生成的apk文件名
- 可更改包名
- 生成不同应用名称或图标
有的时候你会在不同平台看到XX-小米版,XX-魅族版等等,或者beta版的图标和正式的不一样,其实代码还是那个代码,无非做点小小的改动
3.多渠道怎么打包呢
- 一般是通过gradle来实现的
1. 在AndroidManifest.xml中添加占位符
一般都是像友盟,腾讯统计分析SDK中使用的方案,网上友盟的较多,我实际用的是腾讯分析所以就拿腾讯的来说(其实都一样)。
首先,在AndroidManifest.xml的application标签里添加一个meta-data标签定义MTA_CHANNEL占位符,腾讯分析SDK会读取里面的value值传到后台,便于我们日后分析。
<meta-data android:name="MTA_CHANNEL"
android:value="${MTA_CHANNEL_VALUE}" />
2. 修改app下的build.gradle文件,在android闭包中添加productFlavors属性配置占位符
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.aimerd.channel"
minSdkVersion 11
targetSdkVersion 21
versionCode 1
versionName "1.0.0"
multiDexEnabled true
}
buildTypes {
release {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//启用混淆代码的功能
minifyEnabled true
//压缩对齐生成的apk包
zipAlignEnabled true
//指定混淆规则,需要压缩优化的混淆要把proguard-android.txt换成proguard-android.txt
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//移除无用的资源文件
shrinkResources true
//启用multidex的支持
multiDexEnabled true
}
}
productFlavors
baidu {
manifestPlaceholders = [MTA_CHANNEL_VALUE: "baidu"]
}
_91 {
manifestPlaceholders = [MTA_CHANNEL_VALUE: "91"]
}
wandoujia {
manifestPlaceholders = [MTA_CHANNEL_VALUE: "wandoujia"]
}
xiaomi {
manifestPlaceholders = [MTA_CHANNEL_VALUE: "xiaomi"]
}
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (variant.buildType.name.equals('release')) {
//生成apk名字的格式:Channel1.0.0_2016-06-22_baidu.apk
//可自定义自己想要生成的格式
def fileName = "Channel${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
- ps : 如果觉得productFlavors重复代码太多,还可以这样写:
productFlavors {
baidu {}
_91 {}
wandoujia {}
xiaomi {}
}
//批量处理
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [MTA_CHANNEL_VALUE: name]
}
注意:像91和360这种数字的是不可以的,我试过”91”虽然可以编译通过,但打包的时候会报错
Error:Execution failed for task ':app:transformClassesWithRetrolambdaFor91Release'.
> java.lang.NullPointerException (no error message)
3. build->Generate Signed APK…打包即可
如何生成不同包的app,更改百度地图等key,sercert、启动页面img、应用图标等文件
- 1.修改productFlavors 配置即可生成不同包名的app(需要注意Manifest.xml中的依赖于包名的属性同样可以用占位符 ${applicationId})
1. 更改包名
productFlavors {
changelife_app { //畅E生活
applicationId "info.xinfu.o2o"
versionCode 71
versionName "3.3.7.1"
}
jinchen_app { //金晨物业
applicationId "cn.jinchen.o2o"
versionCode 71
versionName "1.0.0"
}
}
${applicationId}如图:
- 例子
- 微信
- 极光
2. 如何生成不同应用名称或图标
- 在app模块,src目录下,新建一个与main目录同级的jinchen_app目录(这里的名字跟productFlavors中定义的渠道名要一致):
- 把values下strings.xml中的”app_name”改成自己想要的应用名称。
- 其他的需要更改的资源只需要把对应的资源复制过来,替换即可。
- 打包时候出现你的渠道选型即成功了: