一步步集成热修复框架Tinker--多渠道

前言

在上一篇文章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的文件,存放所有渠道

一步步集成热修复框架Tinker--多渠道_第1张图片

如何获取渠道信息

在需要渠道等信息时可以通过下面代码进行获取

String channel = WalleChannelReader.getChannel(this.getApplicationContext());

如何生成渠道包

生成渠道包的方式是和assemble${variantName}Channels指令结合,渠道包的生成目录默认存放在 build/outputs/apk/,也可以通过walle闭包中的apkOutputFolder参数来指定输出目录

用法示例:

生成渠道包 ./gradlew clean assembleReleaseChannels
支持 productFlavors ./gradlew clean assembleMeituanReleaseChannels

  • 生成渠道包,运行命令gradlew clean assembleReleaseChannels


    一步步集成热修复框架Tinker--多渠道_第2张图片
  • 生成渠道包成功


    一步步集成热修复框架Tinker--多渠道_第3张图片

    可以看到,在channels目录下,生成了各个渠道包,同事在bakApk目录下,生成了用于打修复补丁的文件,要保存好。


    一步步集成热修复框架Tinker--多渠道_第4张图片

更多API和命令可参考

更多用法

源码下载
https://github.com/baojie0327/HotFixTinker

你可能感兴趣的:(一步步集成热修复框架Tinker--多渠道)