1. 程式人生 > >Walle —— Android多渠道打包神器

Walle —— Android多渠道打包神器

code小生,一個專注 Android 領域的技術平臺

公眾號回覆 Android 加入我的安卓技術群

作者:MrTrying
連結:https://www.jianshu.com/p/1c7f135831a4
宣告:本文已獲
MrTrying授權發表,轉發等請聯絡原作者授權

640

圖片只為致敬斯坦·李

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("640{appName}-640{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支援 productFlavors gradle clean assemblevariantNameChannelsbuild/outputs/apk/walleapkOutputFolderAndroidStudio

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

關於360加固失效問題
https://github.com/Meituan-Dianping/walle/wiki/360%E5%8A%A0%E5%9B%BA%E5%A4%B1%E6%95%88%EF%BC%9F

參考文章

Walle-美團點評技術團隊出品
https://github.com/Meituan-Dianping/walle

640

分享技術我是認真的