前言
在上一篇文章http://www.jianshu.com/p/9db9bd3bcba4中,一步步集成了微信的热修复Tinker问题,但是我公司的项目,渠道就有十几个,这样难道需要打十几个补丁吗,很明显这不现实,有没有可能实现用一个补丁包,可以修复所有的渠道呢?
答案是有的,官方建议使用项目packer-ng-plugin或者可使用V2 Scheme的walle
下面我们用下美团的walle打包。
源码下载
https://github.com/baojie0327/HotFixTinker
什么是walle
Walle(瓦力):Android Signature V2 Scheme签名下的新一代渠道包打包神器
瓦力通过在Apk中的APK Signature Block区块添加自定义的渠道信息来生成渠道包,从而提高了渠道包生成效率,可以作为单机工具来使用,也可以部署在HTTP服务器上来实时处理渠道包Apk的升级网络请求。
集成walle
walle提供了2种使用方式:
- Gradle插件方式,方便快速集成
- 命令行方式,最大化满足各种自定义需求
下面我们用Gradle插件方式在项目里引入walle
1 在项目的build.gradle 文件中添加Walle Gradle插件的依赖
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath "com.tencent.tinker:tinker-patch-gradle-plugin:${TINKER_VERSION}"
//walle 依赖
classpath 'com.meituan.android.walle:plugin:1.1.5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
2 在app的 build.gradle 文件中apply这个插件,并添加上用于读取渠道号的AAR
// 配置开始walle===========================
apply plugin: 'walle'
dependencies {
compile 'com.meituan.android.walle:library:1.1.5'
}
// 配置结束walle===========================
3 在app的 build.gradle 文件中配置插件
// 配置开始walle===========================
walle {
apkOutputFolder = new File("${project.buildDir}/outputs/channels")
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}-${flavorName}.apk'
//configFile与channelFile两者必须存在一个,否则无法生成渠道包。两者都存在时优先执行configFile
channelFile = new File("${project.getProjectDir()}/channel")
//configFile = new File("${project.getProjectDir()}/config.json")
}
配置项具体解释:
apkOutputFolder:指定渠道包的输出路径, 默认值为new File("${project.buildDir}/outputs/apk")
apkFileNameFormat:定制渠道包的APK的文件名称, 默认值为'${appName}-${buildType}-${channel}.apk'
可使用以下变量:
projectName - 项目名字
appName - App模块名字
packageName - applicationId (App包名packageName)
buildType - buildType (release/debug等)
channel - channel名称 (对应渠道打包中的渠道名字)
versionName - versionName (显示用的版本号)
versionCode - versionCode (内部版本号)
buildTime - buildTime (编译构建日期时间)
fileSHA1 - fileSHA1 (最终APK文件的SHA1哈希值)
flavorName - 编译构建 productFlavors 名
channelFile:包含渠道配置信息的文件路径
4 在app目录下新建名为channel的文件,存放所有渠道
如何获取渠道信息
在需要渠道等信息时可以通过下面代码进行获取
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
如何生成渠道包
生成渠道包的方式是和assemble${variantName}Channels指令结合,渠道包的生成目录默认存放在 build/outputs/apk/,也可以通过walle闭包中的apkOutputFolder参数来指定输出目录
用法示例:
生成渠道包 ./gradlew clean assembleReleaseChannels
支持 productFlavors ./gradlew clean assembleMeituanReleaseChannels
-
生成渠道包,运行命令gradlew clean assembleReleaseChannels
-
生成渠道包成功
可以看到,在channels目录下,生成了各个渠道包,同事在bakApk目录下,生成了用于打修复补丁的文件,要保存好。
更多API和命令可参考