快速打渠道包(分享整理)
快速打渠道包
何為渠道包
每當發新版本時,Android客戶端會被分發到各個應用市場,比如豌豆莢,360手機助手等。為了第三方統計平臺以及自身服務端統計這些市場的效果(活躍數,下單數等),需要對各個不同的渠道市場所發的apk包用一些方法來唯一標識它們。
此外,有一些渠道作為首發渠道,也需要單獨打出不一樣的包(一般是splash頁面有對應渠道的首發標識)。
Maven式打包
Maven是一個軟件項目管理和自動構建工具,配合使用android-maven-plugin插件,以及maven-resources-plugin插件可以較為自動化地生成渠道包。
在AndroidManifest.xml的節點中添加如下元素,用來定義渠道的來源
<!-- 使用Maven打包時會用具體的渠道號替換掉${channel} -->
<meta-data
android:name="channel"
android:value="${channel}" />
再在程序啟動時讀取渠道號:
PackageManager pm = context.getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
return appInfo.metaData.getString("channel");
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
缺點:每打一個包都要執行一遍構建過程,效率太低。
apktool式打包
apktool是一個逆向工程工具,可以用它解碼并修改apk中的資源。接下來詳細介紹如何使用apktool生成渠道包。
前期工作和用Maven打包一樣,也需要在AndroidManifest.xml文件中定義元素,并在應用啟動的時候讀取清單文件中的渠道號。具體請參考前面的代碼。
和Maven不一樣的是,每次打包時不再需要重新構建項目。打包時,只需生成一個apk,然后在該apk的基礎上生成其他渠道包即可。
小結:相當于Maven式的改進,不用每次都執行一次構建,節省了不少時間,但方式不太好,且也不夠快。
Gradle 打渠道包
基本原理是利用Gradle的 manifest merger 功能
這個功能的主要用途是能夠在運行時替換AndroidManifest.xml里面的內容
第一步 在AndroidManifest.xml里配置meta-data
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
第二步 在模塊的build.gradle文件的defaultConfig里加上PlaceHolder定義
android {
...
defaultConfig {
...
manifestPlaceholders = [ UMENG_CHANNEL_VALUE:"default_channel" ]
}
}
這里的作用有兩個,一是聲明UMENG_CHANNEL_VALUE是可替換值的PlaceHolder,二是為其設置默認值。
第三步 在模塊的build.gradle文件里添加ProductFlavors配置
android {
productFlavors {
default_channel{}
wandoujia{}
_360{}
yingyongbao{}
xiaomi{}
baidu{}
huawei{}
jifeng{}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
}
}
第四步 一次生成所有渠道包
到工程目錄下運行gradlew assembleRelease。
可以看到這次編譯一共產生了對應productFlavors段的不同渠道包。
可以反編譯每個apk,打開AndroidManifest.xml看看,發現友盟這一段的配置已經相應的被修改了。
<meta-data
android:name="UMENG_CHANNEL"
android:value="default_channel" />
還可以利用Gradle生成單獨的渠道包
如 gradlew assembleWandoujiaRelease
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
META-INF 式打包
可以只修改已有apk的渠道標志
快,批量,原理簡單
使用APK注釋字段保存渠道信息和MAGIC字節,從文件末尾讀取渠道信息,讀取速度快
打包速度快,可用于網站后臺動態生成渠道包
packerNg 式打包
Android應用使用的APK文件就是一個帶簽名信息的ZIP文件,根據 ZIP文件格式規范,每個ZIP文件的最后都必須有一個叫 Central Directory Record 的部分,這個CDR的最后部分叫”end of central directory record”,這一部分包含一些元數據,它的末尾是ZIP文件的注釋。注釋包含Comment Length和File Comment兩個字段,前者表示注釋內容的長度,后者是注釋的內容,正確修改這一部分不會對ZIP文件造成破壞,利用這個字段,我們可以添加一些自定義的數據,PackerNg項目就是在這里添加和讀取渠道信息。
為了提高性能,避免讀取整個文件,還需要在注釋的最后加入幾個MAGIC字節,這樣從文件的最后開始,讀取很少的幾個字節就可以定位渠道名的位置。
http://www.woaipu.com/shops/zuzhuan/61406
http://www.znds.com/tv-967956-1-1.html
http://www.znds.com/tv-967958-1-1.html
http://www.woaipu.com/shops/zuzhuan/61406
http://www.znds.com/tv-967956-1-1.html
http://www.znds.com/tv-967958-1-1.html
總結
以上是生活随笔為你收集整理的快速打渠道包(分享整理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux中netstat命令怎么用
- 下一篇: Windows10设备怎么使用wifi