日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

快速打渠道包(分享整理)

發布時間:2023/12/15 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 快速打渠道包(分享整理) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

快速打渠道包

何為渠道包

每當發新版本時,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

總結

以上是生活随笔為你收集整理的快速打渠道包(分享整理)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。