Android 多渠道打包原理和使用

Android 多渠道打包原理和使用

2015年12月11日 標籤:Mobile Insight, Android

每次中午吃飯總會和技術同學聊天。當做 iOS 開發的做安卓開發的人員在一起的時候,他們中間又多了一個話題:iOS 開發難還是安卓開發難。

這個時候做安卓開發的同學最激動說安卓開發要自己畫界面、機型複雜、操作系統多 rom 又被各家改的四不像....開發一個安卓 APP 的時間將近是開發 iOS 所需時間的 2 倍。iOS 開發的同學可能就會反駁說 iOS 開發入門難度比安卓高,開發中第三方庫不像安卓那麼多,開發設備又必須是 MAC,而安卓隨便一臺 PC 即可...筆者認爲,這個問題因人而異,不想再引起一場爭論。其實,今天想說的是,安卓開發中還有一件事情比較痛苦那就是打包。

做過 APP 開發的人都知道安卓的渠道林立,筆者記得曾經工作的一家公司每次發包都要運行腳本去打包,每次打幾百個 APK,花費幾個小時,電腦都累的風扇呼呼叫。而 iOS 由於其封閉性,渠道除了 AppStore 之外幾乎很少了。所以,安卓 APP 開發之後要把 APP 分發出去要做的事情要比 iOS 多這個是一定的。這篇文章咱們就和做安卓開發的同學聊一下安卓 APP 多渠道打包的事情。

APP多渠道打包原理講解

要多渠道打包,我們就來說一下渠道如何標識。一般來說渠道標識有兩個地方可以做: 1、在代碼中寫,例如 TalkingData 就提供了這種方式

//啓動代碼
init(final Context context, final String appId,  final String partnerId);  
//這種方式不需要在 AndroidManifext.xml 裏的 meta-data 申明瞭 TD_APP_ID 和 TD_CHANNEL_ID

2、在 AndroidManifext.xml 中填寫,還拿 TalkingData 舉例子

//啓動代碼
init(final Context context);  
//這種方式可以使用多渠道打包工具,方便一次打包多個發佈渠道

//AndroidManifext.xml中這樣寫
<meta-data android:name="TD_CHANNEL_ID" android:value="Your_channel_id" />  

如果是單獨打一個 APP 包加上上面的配置直接 IDE 中導出 APK 就行了,如果打很多個 APK 用 IDE 就很費力。 要想多渠道打包,就需要對 Android 的整體的打包編譯過程有所瞭解。下面認識下 Android 的 java 代碼、XML 格式的資源文件、圖片文件等資源是如何轉換成爲一個 APK 的。 Android多渠道打包原理和使用


大家從圖中可以看出,大體分爲以下 7 個大步: 1、打包資源文件,生成 R.java 文件
2、處理 aidl 文件,生成相應 java 文件
3、編譯工程源代碼,生成相應 class 文件
4、轉換所有 class 文件,生成 classes.dex 文件
5、打包生成 apk
6、對 apk 文件進行簽名
7、對簽名的 apk 進行 zipalign 對其操作

說明:這裏只是大致表明大致的打包編譯過程,其實如果細分每一部分還有很多細節。

結合原理和渠道的 1、2 兩種設置方法我們分別來說.

1、如果渠道信息是通過 Java 的硬編碼方式來做的,我們可以在打包之前預處理 Java 源文件,找到渠道設置關鍵字,從渠道列表中找到一個渠道設置進去即可。由於腳本這塊兒,不同的語言的實現方式不同,這裏不做過多的說明。如果有需要的我可以把自己之前 shell 寫的一段代碼分享了。


2、如果使用寫在 AndroidManifext.xml 中,這個就可以通過讀取 XML 文件的方式定位到 meta-data 並且 android:name 的值爲 TDCHANNELID 的元節點。把這個元節點的值設置成某一個渠道即可。這裏推薦大家看一下友盟開源的一個多渠道打包工具中有相關的實現細 [1]。這個過程發生在上圖中的 aapt 階段,這個階段做的事情還比較多沒有分來來說。


大致原理就是這樣,其實也很簡單~,就是在正常的 Android 打包編譯過程中進行干涉,加入一些邏輯來替換相關的渠道信息,保證打包之後的 APK 中的渠道信息各不相同。 其實這個過程是這樣的: Android多渠道打包原理和使用說明:圖片來源網絡

然後編寫腳本或者工具來循環的這個過程....

Android Studio多渠道打包

Android Studio 發佈已經好長時間了,Google 也一直在維護在更新,Android 開發的小夥伴你們用起來了嗎?聽說身邊做開發的很多都轉向了這個神器。這裏,我們就重點說一下如何在 Android Studio 中實現多渠道打包,後續給出一個 Demo來做演示,筆者覺得這樣更實用。
第一步在 AndroidManifext.xml 中配置渠道


   <meta-data android:name="TD_CHANNEL_ID" android:value="${ONEAPM_TEST_CHANNEL}" />

第二步,在 APP 下的 build.gradle 中添加


   productFlavors {
        wandoujia{}
        "1234Test"{}
        "1test111"{}
    }

    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [ONEAPM_TEST_CHANNEL: name]
    }

解釋:productFlavors 類似於一個產品的不同特性的配置[2]. productFlavors.all 是一個遍歷,每一個 productFlavors 中的值,其中productFlavors 的每一個值都有一個 name ,就是類似 wandoujia 這樣的字符,每次循環的時候會替換掉 AndroidManifext.xml 中的${ONEAPMTESTCHANNEL}。 第三步,執行打包命令 打開命令行定位到 project 目錄,執行

  gradlew assembleRelease

不出意外的話 bulid->outputs->apk 下面會有各個渠道的包,如下圖 打包結果


注意事項: 1、productFlavors 定義的時候裏面的類似 wandoujia,不能是數字開頭,不能是關鍵字 test 等,因爲你要意識到你在寫 gradle 腳本,要符合 groovy 語法。如下面的就不合法
Android多渠道打包原理和使用2、flavor.manifestPlaceholders = [ONEAPMTESTCHANNEL: name]中的ONEAPMTESTCHANNEL 一定要和 AndroidManifext.xml 定義的一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章