Walle爲了android多渠道打包而生的工具,廢話很少說直接上用法android
在項目的build.gradle文件中添加walle插件依賴json
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的時候會出現這樣的錯誤app
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 { // 指定渠道包的輸出路徑 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("
{appName}-{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:包含渠道配置信息的文件路徑。gradle
其中channelFile文件,每行是一個渠道名,支持使用#註釋,具體的格式以下:ui
360 #百度 baidu develoer.huawei #華爲
在須要渠道等信息時能夠經過下面代碼進行獲取spa
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命令行
支持 productFlavors gradle clean assemblevariantNameChannels指令結合,渠道包的生成目錄默認存放在build/outputs/apk/,也能夠經過walle代碼塊中的apkOutputFolder參數來指定輸出目錄,在AndroidStudio的終端中執行構建指令便可。
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單獨配置額外的寫入信息。具體內容格式詳見:渠道&額外信息配置文件示例。
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區塊進行讀寫操做的模塊進行了封裝。
讀寫模塊的使用說明詳見:
APK Signing Block讀取模塊: payload_reader
APK Signing Block寫入模塊: payload_writer
最後介紹個QQ羣:979045005,Android開發的朋友能夠加一下,有什麼新技術你們一塊兒交流學習一下,整理了一些乾貨,須要的話,能夠進羣找管理免費領取,很少說直接上圖吧!