美團多管道打包以快出名,早有耳聞,但總覺得神龍見首不見尾,大多文章都是講原理的東西,卻始終難懂到底怎麼樣用,今天就以初學者的姿态一邊探索,一邊總結,也希望能幫住大家少走寫冤枉路。
首先,明白幾個問題:
一、為什麼要進行多管道打包?
安卓應用商店(一個商店也叫做一個管道,如360,baidu,xiaomi)衆多,大大小小幾百個,我們釋出應用之後需要統計各個管道的使用者下載下傳量,是以才有了多管道打包。
二、怎麼樣統計各個管道的下載下傳量呢?
現在有比較成熟的第三方應用幫我們實作統計功能(比如友盟、騰訊統計分析),統計的本質就是收集使用者資訊傳輸到背景,背景生成報表,幫助我們跟蹤分析并完善app。通過系統的方法已經可以擷取到,版本号,版本名稱,系統版本,機型,地區等各種資訊,唯獨應用商店(管道)的資訊我們是沒有辦法從系統擷取到的,是以我們就人為的在apk裡面添加管道資訊(其實就用一個字段進行辨別,如360,baidu),我們隻要把這些資訊打包到apk檔案并将資訊傳輸到背景,背景根據這個辨別,可以統計各個管道的下載下傳量了,并沒有多麼的高大上。
說了那麼多,其實多管道打包隻需要關注兩件事情:
- 将管道資訊寫入apk檔案
- 将apk中的管道資訊傳輸到統計背景
其實網上大多數文章都隻是告訴讀者“怎麼樣将管道資訊寫入apk檔案”這一個步驟,導緻一些初學者摸不着頭腦(我就是其中一個),那麼,然後呢?這樣就行了嗎?總覺得缺了點什麼。
三、Gradle打包(本例以友盟統計為例)
1:在AndroidMainfest.xml配置可動态替換的管道參數**
<meta-data
android:name="UMENG_CHANNEL"
android:value="xiaomi" /><!--管道号為:小米-->
如果想動态的替換管道号怎麼辦呢?
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_ID}" /><!--動态替換管道号-->
${CHANNEL_ID}
為占位符,其中的
CHANNEL_ID
可以自己任意定義
2:在build.gradle設定productFlavors
android {
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
}
或者批量修改
android {
productFlavors {
xiaomi {}
_360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
3:使用gradle打包
AS為我們提供了圖形界面的方式,點選菜單欄 —> Build —> Generate Signed APK (輸入相關的簽名證書路徑和密碼)—> 一步步下去 —> Flavors中全選—> Finish.
四、指令行打包(本例以友盟統計為例)
1:在AndroidMainfest.xml配置可動态替換的管道參數
<meta-data
android:name="UMENG_CHANNEL"
android:value="xiaomi" /><!--管道号為:小米-->
如果想動态的替換管道号怎麼辦呢?
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_ID}" /><!--動态替換管道号-->
${CHANNEL_ID}
為占位符,其中的
CHANNEL_ID
可以自己任意定義
2:在項目的build.gradle檔案中設定打包簽名資訊 signingConfigs:
新浪微網誌SSO登入,微信分享這些都需要簽名打包,才能看到效果,設定預設簽名檔案為自己的簽名jks,這樣就不需要打包了直接運作起來就是正式的簽名。
在android.signingConfigs{}下定義一個或者多個簽名資訊,然後在buildTypes{}配置使用即可。
在app目錄下添加你的.jks,然後app的build.gradle檔案中的增加以下内容:
(1)debug版本
android {
signingConfigs {
debug {
storeFile file("WuXiaolong.jks")
storePassword 'android'
keyAlias 'android'
keyPassword 'android'
}
}
}
buildTypes沒有配置,也是直接取得debug,是不是不配置預設取得是debug呢?
(2)release版本
android {
signingConfigs {
release {
storeFile file("WuXiaolong.jks")
storePassword 'android'
keyAlias 'android'
keyPassword 'android'
}
}
buildTypes {
debug {
signingConfig signingConfigs.release
}
}
}
3:在build.gradle設定productFlavors
android {
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
}
或者批量修改
android {
productFlavors {
xiaomi {}
_360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
4:使用指令行打包
在AS的内置終端Terminal工具中執行指令:
./gradlew assembleRelease
(所有生成的apk在項目的build\outputs\apk下)
五、文章參考
http://www.jianshu.com/p/2f2ce33e670f
http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/
http://wuxiaolong.me/2016/04/01/gradle4android3/
https://as.quanke.name/%E5%A4%9A%E6%B8%A0%E9%81%93%E6%89%93%E5%8C%85.html