Android Walle多渠道打包

      對於app運營來說,通常需要我們的APP統計在各大應用市場的下載和具體使用情況,這個時候我們就需要引入友盟統計或者其他第三方統計,包括各個市場相對應的包,渠道一多,打包就慢了,所以Walle快速打包誕生了!!

     傳統的渠道配置方式是在AndroidManifest.xml接入配置

<meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/> 
        <meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>

然後在配置文件build.gradle裏面配置productFlavor來實現多渠道打包,這樣做,能多渠道打包,但是效率並不高。其實如果我們能傳入渠道ID,那麼自然就能統計到相關信息了,因此友盟提供了新的接入方式:

MConfigure.init(Context context, String appkey, String channel, int deviceType, String pushSecret)

這時候我們可以將之前AndroidManifest.xml中的channelId配置相關的<meta-data>刪除,只需要提供channel即可,然後就可以通過美團Walle或者其他方式來獲取到這個channel即可。

下面提供美團Walle接入步驟,主要有兩種,一種是插件方式、一種是命令行模式

插件方式:

1.接入之前需要我們有自己的簽名

buildTypes {
        debug {
            //獲取打包時間
            buildConfigField("String", "buildTime", "\""+new Date().format("yyyy/MM/dd HH:mm:ss")+"\"")
            minifyEnabled false
            signingConfig signingConfigs.debug
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-android.txt'
        }

        release {
            buildConfigField("String", "buildTime", "\""+new Date().format("yyyy/MM/dd HH:mm:ss")+"\"")
            minifyEnabled false
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-android.txt'
        }
    }

    signingConfigs {
        debug {
            storeFile file("./keystore/fanli.keystore")
            storePassword 'fanli'
            keyAlias 'fanli.keystore'
            keyPassword 'fanli2222'
        }

        release {
            storeFile file("./keystore/fanli.keystore")
            storePassword 'fanli'
            keyAlias 'fanli.keystore'
            keyPassword 'fanli2222'
        }
    }

2.在項目的根目錄 build.gradle 文件中添加Walle Gradle插件的依賴

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

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

apply plugin: 'walle'

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

4.在當前App的 build.gradle中配置Walle

walle {
    // 指定渠道包的輸出路徑
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定製渠道包的APK的文件名稱
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")
}


配置項具體解釋:
channelFile:包含渠道配置信息的文件路徑,示例 https://github.com/Meituan-Dianping/walle/blob/master/app/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 名

5.讀取渠道

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

6.上傳渠道到友盟

UMConfigure.init(Context context, String appkey, String channel, int deviceType, String pushSecret);

我們需要進行多渠道打包的時候,只需要執行

./gradlew clean assembleReleaseChannels

即可來生成所有的渠道,有時候執行該命令,我們可能會遇到R.java文件丟失的問題,可以通過AS的clean又能重新生成,這時候我們可以把上述命令中的clean去掉,變爲通過命令./gradlew assembleReleaseChannels生成

擴展:生成指定渠道包

生成單個渠道包: ./gradlew clean assembleReleaseChannels -PchannelList=meituan

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



命令行方式

1.下載walle-cli-all.jar文件

2.執行的相關命令

顯示當前apk中的渠道和額外信息:java -jar walle-cli-all.jar show /Users/fanli/app/build/outputs/apk/fanli_walle.apk


java -jar walle-cli-all.jar put -c[渠道名] [apk路徑]

java -jar walle-cli-all.jar put -c[渠道名] [apk路徑] [生成的apk路徑(可選)]

指定渠道列表
java -jar walle-cli-all.jar batch -c xiaomi,meizu,360 [apk路徑]

路徑不指定的情況下,默認在原apk包同目錄下

 

Walle多渠道打包渠道丟失的問題

爲了代碼安全app在上線的時候都會選擇給app加固,加固之後會出現渠道找不到的問題,官方有給出相關的解決方案360加固失效?
這裏我使用了ProtectedApkResignerForWalle腳本來解決這個問題

需要注意的是:

1.生成一個不帶簽名的包,可以通過執行assembleRelease這個task或者通過工具欄上面的Build下面的Generated Signed Apk

2.將生成的apk通過360網頁版進行加固(通過其提供的桌面工具加固的話會自動使用V1方式簽名),然後下載下來加固之後的apk,比如叫:fanli.encrypted.apk

3.克隆https://github.com/Jay-Goo/ProtectedApkResignerForWalle.git,然後把步驟2中生成的fanli.encrypted.apk項目的根目錄,並根據按照config.py文件中的註釋改成自己項目配置

4.根據情況看是否需要更改之前寫好的Channel文件

5.運行命令 python ApkResigner.py,即可自動生成所有渠道包。之後我們即可在該倉庫的channels文件夾下看到生成的各種渠道包了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章