快速打渠道包(分享整理)
快速打渠道包
何為渠道包
每當(dāng)發(fā)新版本時(shí),Android客戶(hù)端會(huì)被分發(fā)到各個(gè)應(yīng)用市場(chǎng),比如豌豆莢,360手機(jī)助手等。為了第三方統(tǒng)計(jì)平臺(tái)以及自身服務(wù)端統(tǒng)計(jì)這些市場(chǎng)的效果(活躍數(shù),下單數(shù)等),需要對(duì)各個(gè)不同的渠道市場(chǎng)所發(fā)的apk包用一些方法來(lái)唯一標(biāo)識(shí)它們。
此外,有一些渠道作為首發(fā)渠道,也需要單獨(dú)打出不一樣的包(一般是splash頁(yè)面有對(duì)應(yīng)渠道的首發(fā)標(biāo)識(shí))。
Maven式打包
Maven是一個(gè)軟件項(xiàng)目管理和自動(dòng)構(gòu)建工具,配合使用android-maven-plugin插件,以及maven-resources-plugin插件可以較為自動(dòng)化地生成渠道包。
在AndroidManifest.xml的節(jié)點(diǎn)中添加如下元素,用來(lái)定義渠道的來(lái)源
<!-- 使用Maven打包時(shí)會(huì)用具體的渠道號(hào)替換掉${channel} -->
<meta-data
android:name="channel"
android:value="${channel}" />
再在程序啟動(dòng)時(shí)讀取渠道號(hào):
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
缺點(diǎn):每打一個(gè)包都要執(zhí)行一遍構(gòu)建過(guò)程,效率太低。
apktool式打包
apktool是一個(gè)逆向工程工具,可以用它解碼并修改apk中的資源。接下來(lái)詳細(xì)介紹如何使用apktool生成渠道包。
前期工作和用Maven打包一樣,也需要在AndroidManifest.xml文件中定義元素,并在應(yīng)用啟動(dòng)的時(shí)候讀取清單文件中的渠道號(hào)。具體請(qǐng)參考前面的代碼。
和Maven不一樣的是,每次打包時(shí)不再需要重新構(gòu)建項(xiàng)目。打包時(shí),只需生成一個(gè)apk,然后在該apk的基礎(chǔ)上生成其他渠道包即可。
小結(jié):相當(dāng)于Maven式的改進(jìn),不用每次都執(zhí)行一次構(gòu)建,節(jié)省了不少時(shí)間,但方式不太好,且也不夠快。
Gradle 打渠道包
基本原理是利用Gradle的 manifest merger 功能
這個(gè)功能的主要用途是能夠在運(yùn)行時(shí)替換AndroidManifest.xml里面的內(nèi)容
第一步 在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" ]
}
}
這里的作用有兩個(gè),一是聲明UMENG_CHANNEL_VALUE是可替換值的PlaceHolder,二是為其設(shè)置默認(rèn)值。
第三步 在模塊的build.gradle文件里添加ProductFlavors配置
android {
productFlavors {
default_channel{}
wandoujia{}
_360{}
yingyongbao{}
xiaomi{}
baidu{}
huawei{}
jifeng{}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
}
}
第四步 一次生成所有渠道包
到工程目錄下運(yùn)行g(shù)radlew assembleRelease。
可以看到這次編譯一共產(chǎn)生了對(duì)應(yīng)productFlavors段的不同渠道包。
可以反編譯每個(gè)apk,打開(kāi)AndroidManifest.xml看看,發(fā)現(xiàn)友盟這一段的配置已經(jīng)相應(yīng)的被修改了。
<meta-data
android:name="UMENG_CHANNEL"
android:value="default_channel" />
還可以利用Gradle生成單獨(dú)的渠道包
如 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的渠道標(biāo)志
快,批量,原理簡(jiǎn)單
使用APK注釋字段保存渠道信息和MAGIC字節(jié),從文件末尾讀取渠道信息,讀取速度快
打包速度快,可用于網(wǎng)站后臺(tái)動(dòng)態(tài)生成渠道包
packerNg 式打包
Android應(yīng)用使用的APK文件就是一個(gè)帶簽名信息的ZIP文件,根據(jù) ZIP文件格式規(guī)范,每個(gè)ZIP文件的最后都必須有一個(gè)叫 Central Directory Record 的部分,這個(gè)CDR的最后部分叫”end of central directory record”,這一部分包含一些元數(shù)據(jù),它的末尾是ZIP文件的注釋。注釋包含Comment Length和File Comment兩個(gè)字段,前者表示注釋內(nèi)容的長(zhǎng)度,后者是注釋的內(nèi)容,正確修改這一部分不會(huì)對(duì)ZIP文件造成破壞,利用這個(gè)字段,我們可以添加一些自定義的數(shù)據(jù),PackerNg項(xiàng)目就是在這里添加和讀取渠道信息。
為了提高性能,避免讀取整個(gè)文件,還需要在注釋的最后加入幾個(gè)MAGIC字節(jié),這樣從文件的最后開(kāi)始,讀取很少的幾個(gè)字節(jié)就可以定位渠道名的位置。
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
總結(jié)
以上是生活随笔為你收集整理的快速打渠道包(分享整理)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux中netstat命令怎么用
- 下一篇: Windows10设备怎么使用wifi