前段时间有个坑,项目发布到Google应用市场后,apk被Google二次签名了,导致在Google市场上面下载的用户无法替换安装OTA上面的最新版本(无法互相替换安装),只能通过Google市场更新。目前发布渠道有Google、和官网二维码下载(官网OTA)。
然而用户群体都是“刁钻的”、“不讲理的”。无法更新这是个非常严重的问题,直接影响体验,增加卸载率和不良口碑。
经过一番研究,决定采用多渠道打包的方式,区分渠道包。不同的渠道包采用不同的更新方式。例如Google市场的渠道包,引导跳转到Google应用市场更新;而其他安装不存在签名问题的包则可以通过官网链接下载替换安装的方式更新。
接下来我们来看看如何操作,基于Android Studio3.1+版本:
1、在 AndroidManifest.xml 中加入meta值,设置为变量名为:APP_CHANNEL_VALUE
<meta-data android:name="APP_CHANNEL" android:value="${APP_CHANNEL_VALUE}"/>
2、 app的 build.gradle 配置(这里只配置打包两个渠道,分别是google和小米商城):
android {
//...
defaultConfig {
// 版本信息...
// 维度,解决报错
flavorDimensions "versionCode"
}
buildTypes {
// 混淆配置...
}
// 配置打包渠道的APP_CHANNEL_VALUE值
productFlavors{
wandoujia{
manifestPlaceholders = [APP_CHANNEL_VALUE: "google"]
}
xiaomi{
manifestPlaceholders=[APP_CHANNEL_VALUE: "xiaomi"]
}
}
// 获取渠道名
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [APP_CHANNEL_VALUE: name]
}
// 生成打包apk的文件名
applicationVariants.all { variant ->
variant.outputs.all {
// 日期信息
def fileName
def date = new Date()
def formattedDate = date.format('yyyyMMdd')
if (variant.buildType.name.equals('release')) {
fileName = "${defaultConfig.versionName}_release_${formattedDate}.apk"
} else if (variant.buildType.name.equals('debug')) {
fileName = "${defaultConfig.versionName}_debug_${formattedDate}.apk"
}
outputFileName = fileName;
}
}
}
dependencies {
// 依赖...
}
如果 defaultConfig 中没有 flavorDimensions "versionCode",会报一下错误。
3、在代码中获取渠道名(APP_CHANNEL_VALUE)
/**
* 获取渠道名
*/
private String getChannel() {
try {
PackageManager pm = getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
return appInfo.metaData.getString("APP_CHANNEL");
} catch (PackageManager.NameNotFoundException ignored) {
}
return "";
}
4、根据渠道名,进行其他操作,如区分访问链接,更新途径,用户群体来源统计信息等等。
...
5、打包,Build > Generate Signed Apk,app目录下将生成渠道目录,以及里面包含的apk
6、运行结果:
将获取的 APP_CHANNEL 显示
总结,其实多渠道打包并不神秘,只是通过meta标识apk,不同的渠道包,APP_CHANNEL值也不同。