Android使用walle多渠道打包


轉載:https://github.com/Meituan-Dianping/walle


Walle









Walle(瓦力):Android Signature V2 Scheme簽名下的新一代渠道包打包神器


瓦力通過在Apk中的APK Signature Block區塊添加自定義的渠道信息來生成渠道包,從而提高瞭渠道包生成效率,可以作為單機工具來使用,也可以部署在HTTP服務器上來實時處理渠道包Apk的升級網絡請求。


Quick Start


為瞭方便大傢的使用,我們提供瞭2種使用方式:



  • Gradle插件方式,方便快速集成

  • 命令行方式,最大化滿足各種自定義需求


Gradle插件使用方式


配置build.gradle


在位於項目的根目錄 build.gradle 文件中添加Walle Gradle插件的依賴, 如下:


buildscript {
dependencies {
classpath 'com.meituan.android.walle:plugin:1.0.4'
}
}

並在當前App的 build.gradle 文件中apply這個插件,並添加上用於讀取渠道號的AAR


apply plugin: 'walle'

dependencies {
compile 'com.meituan.android.walle:library:1.0.4'
}

配置插件


walle {
// 指定渠道包的輸出路徑
apkOutputFolder = new File("${project.buildDir}/outputs/channels");
// 定制渠道包的APK的文件名稱
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
// 配置渠道文件列表,也可以通過channelList來配置
channelFile = "./channel";
}

目前插件支持下面幾個配置項:



  • apkOutputFolder:指定渠道包的輸出路徑, 默認值為new File("${project.buildDir}/outputs/apk")

  • apkFileNameFormat:定制渠道包的APK的文件名稱, 默認值為'${appName}-${buildType}-${channel}.apk'

  • channelList:渠道信息列表

  • channelFile:包含渠道配置信息的文件路徑

  • extraInfo:以key:value形式提供,多個以,分隔


可以通過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哈希值)

如何獲取渠道信息


在需要渠道等信息時可以通過下面代碼進行獲取


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

如何生成渠道包


生成渠道包的方式是和assemble指令結合,可以通過傳入參數決定是否生成渠道包,渠道包的生成目錄存放在 build/outputs/apk/


下面是各類用法示例:



  • 生成單個渠道包 ./gradlew clean assembleRelease -PchannelList=meituan

  • 支持 productFlavors ./gradlew clean assembleMeituanRelease -PchannelList=meituan

  • 生成多個渠道包 ./gradlew clean assembleRelease -PchannelList=meituan,dianping

  • 通過渠道配置文件來生成渠道包 ./gradlew clean assembleRelease -PchannelFile=channel


渠道信息的配置文件支持配置相對路徑,詳見:配置文件示例,同時配置文件支持使用#號添加註釋。


更多用法


插入額外信息

如果想插入除渠道以外的其他信息,請在生成渠道包時使用


./gradlew clean assembleRelease -PchannelList=meituan -PextraInfo=buildtime:20161212,hash:xxxxxxx

extraInfo以key:value形式提供,多個以,分隔。


註意:



  • extraInfo需要搭配channelList或者channelFile使用,plugin不支持隻寫入extraInfo。

  • extraInfo 不要出現以channel為key的情況


而對應的渠道信息獲取方式如下:


ChannelInfo channelInfo= WalleChannelReader.getChannelInfo(this.getApplicationContext());
if (channelInfo != null) {
String channel = channelInfo.getChannel();
Map<String, String> extraInfo = channelInfo.getExtraInfo();
}
// 或者也可以直接根據key獲取
String value = WalleChannelReader.get(context, "buildtime");

命令行工具使用方式


可以使用命令行工具來支持各類自定義的需求,具體使用方式詳見:Walle CLI 使用說明


其他使用方式


為瞭更好的滿足大傢的各類自定義需求,我們把對APK Signing Block區塊進行讀寫操作的模塊進行瞭封裝。


讀寫模塊的使用說明詳見:



  • APK Signing Block讀取模塊: payload_reader

  • APK Signing Block寫入模塊: payload_writer


原理介紹


對該工具的原理感興趣的同學,可以移步美團Android新一代渠道包生成工具進行瞭解。


註意事項



  • 使用apksigner重新對Apk簽名會導致渠道信息丟失,需要再次寫入渠道信息


技術支持



  • Read The Fucking Source Code

  • 通過提交issue來尋求幫助

  • 聯系我們尋求幫助


貢獻代碼



  • 歡迎提交issue

  • 歡迎提交PR


參考



  • APK Signature Scheme v2

  • Zip Format

  • Android Source Code: ApkSigner

  • Android Source Code: apksig


License


Copyright 2017 Meituan-Dianping

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

0 個評論

要回覆文章請先登錄註冊