参考 github 项目:https://github.com/mcxiaoke/packer-ng-plugin

背景

随着项目的发展,android 需要打包的渠道也变得月来越多。不仅仅包括外部应用商店的渠道,同时与友商合作以及内部渠道也月来越多,动不动就数十个渠道包。
同时由于 android 自带的 productFlavors 来进行打包需要每个渠道都打包一次,速度显得过慢,由此需要一个快速打包的方案。

为什么用 PackerNg

优点

缺点

其实对于我们来说打包速度快,并且配置灵活,同时支持自定义输出文件,方便持续集成,这些东西就够了。

PackerNg 原理

这个在我看来就是把 apk 文件当成是带签名的 zip 文件,同时将末尾的 zip 文件注释修改成自己的渠道相关注释,然后缓存起来,方便在代码中根据渠道统计工具去设置渠道。

集成过程

其实作者是提供了几种方式,不过其实本质都差不多,一种是需要增加 gradle 依赖,另一种的就是通过脚本修改不增加依赖

Gradle

dependencies {
//增加依赖
compile 'com.mcxiaoke.gradle:packer-helper:1.0.7'
}

android {
//...
signingConfigs {
release {
// 同时满足下面两个条件需要此配置
// 1. Gradle 版本 >= 2.14.1
// 2. Android Gradle Plugin 版本 >= 2.2.0
// 作用是只使用旧版签名,禁用 V2 版签名模式
v2SigningEnabled false
}
}
}

> packer-ng 和 packer-helper 的版本号需要保持一致

* 在Java代码中获取当前渠道,并且根据渠道统计工具进行渠道设置,这里以友盟为例,在app的入口文件onCreate方法中加入代码
```java
// 如果没有使用PackerNg打包添加渠道,默认返回的是""
final String market = PackerNg.getMarket(Context)
// 或者使用 PackerNg.getMarket(Context,defaultValue)
// 这里是友盟的设置渠道
AnalyticsConfig.setChannel(market)

market 是你的渠道名列表文件,market 文件是基于项目根目录的相对路径

渠道名列表文件是纯文本文件,每行一个渠道号,列表解析的时候会自动忽略空白行和格式不规范的行,请注意看命令行输出,渠道名和注释之间用 # 号分割开,可以没有注释,示例:

Google_Play#play store market
Gradle_Test#test
SomeMarket#some market
HelloWorld

至此渠道包便可以成功打包完成了,打包完成后你可以在${项目根目录}/build/archives/ 目录找到最终的渠道包。

若想要指定其他配置,如 apk 输出目录,输出文件格式等等,可以通过 packer 这个插件去指定,格式如下:

packer {
    // 指定渠道打包输出目录
    // archiveOutput = file(new File(project.rootProject.buildDir.path, "archives"))
    // 指定渠道打包输出文件名格式
    // 默认是 `${appPkg}-${flavorName}-${buildType}-v${versionName}-${versionCode}`
    // archiveNameFormat = ''
    // 是否检查Gradle配置中的signingConfig,默认不检查
    // checkSigningConfig = false
    // 是否检查Gradle配置中的zipAlignEnabled,默认不检查
    // checkZipAlign = false
}

脚本方式

下面说下第二种方式,可以直接通过脚本方式,这种方式好处就是不需要增加额外的依赖,比较灵活

与第一种方式差不多,就是打包是用的脚本进行打包

要注意的是,这里的 apkFile 是原始的 release 包,也就是说你还是需要先用 android 原生的命令打一个线上渠道包,然后根据指定这个渠道包去打出所有的渠道包。


特别提示:如果你同时使用其它的资源压缩工具或应用加固功能,请使用命令行脚本打包增加渠道信息,增加渠道信息需要放在 APK 处理过程的最后一步

最后说一句

现在已经运用到项目中速度还是不错的,而且兼容性也发现什么问题,由原来数十分钟,到现在几分钟就可以了。同时集成到持续集成系统中也基本不需要改动太多。

吐槽下作者说的 100 个渠道包 10s,这个我不知道是什么电脑才可以这么牛,或者是个 demo。虽然技术上没什么很大创新,不过思路很不错,这个轮子可以有。。。


↙↙↙阅读原文可查看相关链接,并与作者交流