為什么要打多個渠道的包略贮?
大家都知道甚疟,android應(yīng)用商店大大小小有幾百個,作為一個有志向的app刨肃,就需要做到統(tǒng)計各個應(yīng)用商店的下載量古拴,不同渠道下的app使用時長、安裝數(shù)量真友、使用用戶數(shù)等等信息黄痪,這個時候就需要打多個渠道包。渠道包的原理大致就是往apk中寫入不同的渠道信息盔然,對這個問題有疑問的同學(xué)可以看看gradle官網(wǎng)或者看看這篇文章
桅打。
傳統(tǒng)多渠道打包
用android studio開發(fā)的同學(xué)都知道,傳統(tǒng)的多渠道打包方法是通過gradle配置productFlavors愈案,在配合grade的manifestPlaceholders插件挺尾,就可以實現(xiàn)task打多渠道包了,具體如下站绪。
//app目錄下在build.gradle文件中添加如下代碼
productFlavors {
yingyongbao {
manifestPlaceholders = [CUSTOM_CHANNEL_VALUE: "yingyongbao"]
}
baidu {
manifestPlaceholders = [CUSTOM_CHANNEL_VALUE: "baidu"]
}
}
//在AndroidManifest.xml中添加如下代碼 如果有使用友盟把CUSTOM_CHANNEL換成UMENG_CHANNEL即可
<meta-data
android:name="CUSTOM_CHANNEL"
android:value="${CUSTOM_CHANNEL_VALUE}" />
這個時候就可以用task要打包了遭铺,雙擊即可』肿迹或者直接在命令行輸入
./gradlew assembleRelease//打包所有渠道
./gradlew assembleWandoujiaRelease//打包單個渠道 Wandoujia
沒出現(xiàn)渠道打包task的同學(xué)請點擊左上角的刷新按鈕魂挂。
Walle多渠道打包
這種方法是很簡單省事,但是并不省時澳倏稹涂召!通過這種方式打包,gradle每次都要從資源文件開始到生成apk重新走一遍敏沉,所以很耗時果正,每次打包一次要等十幾分鐘,如果渠道多的app估計要等上半小時以上盟迟。這時候我們就要想想有沒有其他的打包方式了秋泳,剛好在推酷上看到了美團開源的Android Signature V2 Scheme 簽名下的新一代渠道包打包神器Walle,跟gradle打包不一樣攒菠,walle是在APK Signature Block區(qū)塊添加自定義的渠道信息迫皱,具體如下。
當然了要尔,Walle并不是為了解決打包速度而產(chǎn)生的一個工具舍杜,美團研究walle的原因是因為在Android 7.0(Nougat)推出了新的應(yīng)用簽名方案APK Signature Scheme v2后新娜,之前快速生成渠道包的方式(美團Android自動化之旅—生成渠道包)已經(jīng)行不通了,具體可以看看Walle自己是怎么說的既绩。
Walle簡單使用
Gradle 插件使用方式
//配置 build.gradle
//在位于項目的根目錄 build.gradle 文件中添加Walle Gradle插件的依賴概龄, 如下:
buildscript {
dependencies {
classpath 'com.meituan.android.walle:plugin:1.0.3'
}
}
//并在當前App的 build.gradle 文件中apply這個插件,并添加上用于讀取渠道號的AAR饲握,
apply plugin: 'walle'
//如果不需要通過walle獲取渠道號 則不需要加
dependencies {compile 'com.meituan.android.walle:library:1.0.3'}
Walle信息配置
//在當前App的 build.gradle 中添加如下信息
walle {
// 指定渠道包的輸出路徑
apkOutputFolder = new File("${project.buildDir}/outputs/channels");
// 定制渠道包的APK的文件名稱 ${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk
apkFileNameFormat = '${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
// 渠道配置文件
channelFile = new File("${project.getProjectDir()}/channel")
}
配置項具體解釋:
apkOutputFolder:指定渠道包的輸出路徑私杜, 默認值為new File("${project.buildDir}/outputs/apk")
apkFileNameFormat:定制渠道包的APK的文件名稱, 默認值為'{buildType}-${channel}.apk'
可使用以下變量:
projectName - 項目名字
appName - App模塊名字
packageName - applicationId (App包名packageName)
buildType - buildType (release/debug等)
channel - channel名稱 (對應(yīng)渠道打包中的渠道名字)
versionName - versionName (顯示用的版本號)
versionCode - versionCode (內(nèi)部版本號)
buildTime - buildTime (編譯構(gòu)建日期時間)
fileSHA1 - fileSHA1 (最終APK文件的SHA1哈希值)
flavorName - 編譯構(gòu)建 productFlavors 名
channelFile:包含渠道配置信息的文件路徑,channel文件放在module的同級目錄下救欧。 具體內(nèi)容格式詳見:渠道配置文件示例衰粹,支持使用#號添加注釋。
獲取渠道
在需要獲取渠道信息的地方使用如下代碼獲取渠道信息
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
通過讀取<meta-data>來獲取渠道號
private void readMetaDataFromApplication() {
try {
ApplicationInfo appInfo = this.getPackageManager()
.getApplicationInfo(getPackageName(),
PackageManager.GET_META_DATA);
String mTag = appInfo.metaData.getString("mTag");
Log.e(TAG, "mTag=" + mTag);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
打包
生成渠道包的方式是和assemble${variantName}Channels指令結(jié)合笆怠,渠道包的生成目錄默認存放在 build/outputs/apk/铝耻,也可以通過walle閉包中的apkOutputFolder參數(shù)來指定輸出目錄
用法示例:
- 生成渠道包
mac ./gradlew clean assembleReleaseChannels
win gradlew clean assembleReleaseChannels
- 支持 productFlavors
mac ./gradlew clean assembleMeituanReleaseChannels
win gradlew clean assembleMeituanReleaseChannels
- 生成單個渠道包
mac ./gradlew clean assembleReleaseChannels -PchannelList=google
win gradlew clean assembleReleaseChannels -PchannelList=google
- 生成多個渠道包
mac ./gradlew clean assembleReleaseChannels -PchannelList=google,dianping
win gradlew clean assembleReleaseChannels -PchannelList=google,dianping
釋放你的雙手,讓商務(wù)運營自己打包
walle-cli 是walle 提供的命令行工具 蹬刷,簡單的用法:
獲取信息
顯示當前apk中的渠道和額外信息:
java -jar walle-cli-all.jar show /Users/Meituan/app/build/outputs/apk/app.apk
寫入信息
寫入渠道
java -jar walle-cli-all.jar put -c meituan /Users/Meituan/Downloads/app.apk
寫入額外信息瓢捉,不提供渠道時不寫入渠道
java -jar walle-cli-all.jar put -c meituan -e buildtime=20161212,hash=xxxxxxx /Users/xxx/Downloads/app.apk
指定輸出文件,自定義名稱办成。 不指定時默認與原apk包同目錄泡态。
java -jar walle-cli-all.jar put -c meituan /Users/Meituan/Downloads/app.apk /Users/xxx/Downloads/app-new-hahha.apk
批量寫入
命令行指定渠道列表
java -jar walle-cli-all.jar batch -c meituan,meituan2,meituan3 /Users/walle/app/build/outputs/apk/app.apk
指定渠道配置文件
java -jar walle-cli-all.jar batch -f /Users/Meituan/walle/app/channel /Users/Meituan/walle/app/build/outputs/apk/app.apk
配置文件示例 支持使用#號添加注釋
輸出目錄可指定,不指定時默認在原apk包同目錄下迂卢。
指定渠道&額外信息配置文件
java -jar walle-cli-all.jar batch2 -f /Users/Meituan/walle/app/config.json /Users/Meituan/walle/app/build/outputs/apk/app.apk
輸出目錄可指定某弦,不指定時默認在原apk包同目錄下。
更多用法
獲取cli所有功能
java -jar walle-cli-all.jar -h