一步步集成熱修復框架Tinker--多渠道

前言

在上一篇文章http://www.lxweimin.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和命令可參考

更多用法

源碼下載
https://github.com/baojie0327/HotFixTinker

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容