對於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文件夾下看到生成的各種渠道包了