Walle —— Android多渠道打包神器

圖片只為致敬斯坦·李
Walle為了android多渠道打包而生的工具,廢話不多說直接上用法
配置build.gradle
在專案的 build.gradle
檔案中新增walle外掛依賴
dependencies { classpath 'com.meituan.android.walle:plugin:1.1.6' }
然後,在app的 build.gradle
檔案中 apply
外掛,同時新增一個用於讀取渠道名的依賴庫
apply plugin: 'walle' dependencies { //walle implementation 'com.meituan.android.walle:library:1.1.6' }
按照以上配置,基本上這裡就可以使用了,還有一個小問題,build的時候會出現這樣的錯誤
Plugin requires 'APK Signature Scheme v2 Enabled' for release.
這是因為 release
變體的構建沒有開啟 v2
簽名的原因,在 build.gradle
檔案的 android
程式碼塊中新增 signingConfigs
簽名配置資訊,然後在 buildTypes
中對應的變體中配置 signingConfig
。
v1SigningEnabled
和 v2SigningEnabled
的程式碼會注視掉,是因為預設為 true
同時 signingConfigs
還可以配置打包時簽名的 keystore
相關資訊
android{ //... signingConfigs { debug { //... } release { //v1SigningEnabled true //v2SigningEnabled true keyAlias 'alias名字' keyPassword '對應alias密碼' storeFile file('keystore的檔案路徑') storePassword 'keystore的密碼' } } buildTypes { debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.debug } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } } }
配置walle
walle { // 指定渠道包的輸出路徑 apkOutputFolder = new File("${project.rootDir}/output/channels/") // 定製渠道包的APK的檔名稱 apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk' // 渠道配置檔案 channelFile = new File("${project.getProjectDir()}/channel") }
配置項具體解釋:
- 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:包含渠道配置資訊的檔案路徑。
其中 channelFile
檔案,每行是一個渠道名,支援使用 #
註釋,具體的格式如下:
360 #百度 baidu develoer.huawei #華為
獲取渠道資訊
在需要渠道等資訊時可以通過下面程式碼進行獲取
public class ChannelUtil { public static String getChannelName(Context context){ if(context == null){ return ""; } return WalleChannelReader.getChannel(context,""); } }
如何生成渠道包
生成渠道包的方式是和 assemble${variantName}Channels
指令結合,渠道包的生成目錄預設存放在 build/outputs/apk/
,也可以通過 walle
程式碼塊中的 apkOutputFolder
引數來指定輸出目錄,在 AndroidStudio
的終端中執行構建指令即可。具體指令:
gradle clean assembleReleaseChannels gradle clean assemble${variantName}ReleaseChannels
Window環境可能需要使用 gradlew
才能執行
以上指令都是在walle配置好的基礎上進行打包,也可以通過指令臨時生成某個或某個渠道檔案對應的渠道包
//單個渠道 gradle clean assembleReleaseChannels -PchannelList=baidu //多個渠道 gradle clean assembleReleaseChannels -PchannelList=baidu,360 gradle clean assembleReleaseChannels -PchannelFile=/user/mrtrying/AS_WorkSpace/ReleaseExample/channel
更多使用方式
官方文件還提到 configFile
的使用, configFile
是包含渠道資訊和額外資訊的配置檔案路徑。配置檔案採用json格式,支援為每個channel單獨配置額外的寫入資訊。具體內容格式詳見: Dianping/walle/blob/master/app/config.json" target="_blank" rel="nofollow,noindex">渠道&額外資訊配置檔案示例 。
walle { // 渠道&額外資訊配置檔案,與channelFile互斥 configFile = new File("${project.getProjectDir()}/config.json") }
- 此配置項與
channelFile
功能互斥,開發者在使用時選擇其一即可,兩者都存在時configFile
優先執行。 -
extraInfo
不要出現以channel
為key的情況
可以通過如下方法獲取對應key的資訊:
public static String getExtraInfo(Context context,String key){ if(context == null){ return ""; } ChannelInfo channelInfo= WalleChannelReader.getChannelInfo(context.getApplicationContext()); if (channelInfo != null) { //如果要獲取渠道 //String channel = channelInfo.getChannel(); Map<String, String> extraInfo = channelInfo.getExtraInfo(); return extraInfo.get(key); }else { return ""; } // 或者也可以直接根據key獲取 //return WalleChannelReader.get(context, key); }
指令也還有其他的用法:
-
生成渠道包&寫入額外資訊:
gradle clean assembleReleaseChannels -PchannelList=baidu -PextraInfo=buildtime:20161212,hash:xxxxxxx
-
使用臨時
configFile
生成渠道包:gradlew clean assembleReleaseChannels -PconfigFile=/user/mrtrying/AS_WorkSpace/ReleaseExample/config.json
-
使用上述
-P
引數後,本次打包channelFile/configFile
配置將會失效,其他配置仍然有效。-PchannelList
,-PchannelFile
,-PconfigFile
三者不可同時使用。
注意: 上述的 extraInfo
以key:value形式提供,多個以 ,
分隔。
命令列工具使用方式
可以使用命令列工具來支援各類自定義的需求,具體使用方式詳見: Walle CLI 使用說明
其他使用方式
為了更好的滿足大家的各類自定義需求,我們把對APK Signing Block區塊進行讀寫操作的模組進行了封裝。
讀寫模組的使用說明詳見: