谈谈我的Android多渠道打包方式
2017-02-13 18:26
363 查看
谈谈我的Android多渠道打包方式
概述
每当发新版本时,Android客户端会被分发到各个应用市场,比如应用宝,360手机助手,小米应用市场等。为了统计这些市场的效果(活跃数,下单数等),需要有一种方法来唯一标识它们。给每一个应用市场设置一个channel ID,用来区分不同的应用市场;客户端访问API时会在请求参数中带上渠道号和设备信息,以便后台接下来计算不同渠道的效果。
根据渠道列表,在每次发版时,都会打包相对应的渠道包发布到对应的应用市场,下面是我项目中使用到的方式和一些工具。
gradle自带的productFlavor方式
在AndroidManifest.xml的< application >节点中添加如下< meta-data >元素,用来定义渠道的来源:<!-- 使用gradle打包时会用具体的渠道号替换掉${channel} --> <meta-data android:name="CHANNEL" android:value="${CHANNEL_VALUE}" />
在app对应的build.gradle中配置productFlavor:
android { defaultConfig { manifestPlaceholders = [CHANNEL_VALUE: "x2"] } productFlavors { x2 {} x3 {} x4 {} x5 {} x6 {} x7 {} x7 {} x8 {} x9 {} x10 {} } productFlavors.all { flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name] } }
输出的APK文件名格式(可选项):
android.applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { File outputDirectory = new File(outputFile.parent); def fileName if (variant.buildType.name == "release") { fileName = "lrzm${variant.productFlavors[0].name}.apk" } else { fileName = "lrzm${variant.productFlavors[0].name}_beta.apk" } output.outputFile = new File(outputDirectory, fileName) } } }
app下build.gradle配置截图:
配置就完成了,遍历渠道列表,逐个替换并打包:
程序启动时读取渠道号:
private String getChannel(Context context) { try { PackageManager pm = context.getPackageManager(); ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); return appInfo.metaData.getString("CHANNEL"); } catch (PackageManager.NameNotFoundException ignored) { } return ""; }
Packer-Ng
新一代多渠道打包神器,github 地址简直就是神器,作者说 【100个渠道包只需10秒】。其实真的有这么快!
修改项目根目录的 build.gradle :
buildscript { repositories { mavenCentral() } dependencies{ classpath 'com.mcxiaoke.gradle:packer:1.0.+' } }
修改Android项目的 build.gradle :
apply plugin: 'packer'
创建多渠道文件markets.txt
渠道打包的命令行参数格式示例(在项目根目录执行):
./gradlew -Pmarket=markets.txt clean archiveApkRelease
其他配置可参考github上的使用说明。
最后打包运行:
速度就比打包单个apk慢一点点,看下结果:
输出的名字有进行了配置,所以apk的名字很长。
archiveNameFormat = ‘${appPkg}-${flavorName}-${buildType}-v${versionName}-${versionCode}-${fileMD5}’
其他工具
360加固保腾讯云·乐固
在使用这两个工具加固应用,他们都有多渠道打包这个辅助功能,貌似360加固保多渠道支持的多一些。
总结
对于多渠道打包,如果能直接修改apk的渠道号,而不需要再重新签名能节省不少打包的时间。幸运的是我们找到了这种方法。直接解压apk,解压后的根目录会有一个META-INF目录,如下图所示:![](http://tech.meituan.com/img/dzh/apk_packaging2.jpg)
如果在META-INF目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。
也看来很多相关的文章,目前推荐还是Packer-Ng方式,节省不少的时间,可以玩玩!
相关文章推荐
- Android几种常见的多渠道(批量)打包方式介绍
- Android常用多渠道打包方式实践
- Android进阶之路 - AndroidStudio内自带的精简多渠道打包方式
- 借腾讯开源 VasDolly,谈谈 Android 签名和多渠道打包的原理!
- Android几种常见的多渠道(批量)打包方式介绍
- Android多渠道打包三种方式
- Android多渠道打包汇总(五)—— 友盟的多渠道打包方式
- android 中三种多渠道打包方式
- Android几种常见的多渠道(批量)打包方式介绍
- 【Android 进阶】美团的多渠道打包方式
- Android多渠道打包两种方式(带秒速打包)
- Android多渠道打包汇总(六)—— 美团的多渠道打包方式
- Android美团多渠道打包方式
- android 中三种多渠道打包方式
- Android高阶之Android studio-友盟多渠道打包方式
- 【Android 进阶】友盟的多渠道打包方式
- 借腾讯开源 VasDolly,谈谈 Android 签名和多渠道打包的原理!
- Android几种常见的多渠道(批量)打包方式介绍
- android gradle两种多渠道打包方式
- android中的两种打包方式,及多渠道打包