Android 多渠道打包原理和使用

jopen 9年前發布 | 138K 次閱讀 Android 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 的值為 TD CHANNEL ID 的元節點。把這個元節點的值設置成某一個渠道即可。這里推薦大家看一下友盟開源的一個多渠道打包工具中有相關的實現細 [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 中的${ONEAPM TEST CHANNEL}。 第三步,執行打包命令 打開命令行定位到 project 目錄,執行

gradlew assembleRelease

不出意外的話 bulid->outputs->apk 下面會有各個渠道的包,如下圖 Android 多渠道打包原理和使用

注意事項:1、productFlavors 定義的時候里面的類似 wandoujia,不能是數字開頭,不能是關鍵字 test 等,因為你要意識到你在寫 gradle 腳本,要符合 groovy 語法。如下面的就不合法

Android 多渠道打包原理和使用

2、flavor.manifestPlaceholders = [ONEAPM TEST CHANNEL: name]中的ONEAPM TEST CHANNEL 一定要和 AndroidManifext.xml 定義的一致。

打包發布之后還要做什么

開發者花費了很大的心血做出一款 APP 為的就是希望這款 APP 產生它應有的價值。所以我們會集成一些統計例如友盟、talking data,有了它每日活躍、新增、留存就有地方看了,這個估計每個開發者都會做。單更重要的是,我們做出的 APP 要保證在每臺手機都能正常的打開和使用,特別是在 APP 同質化越來越嚴重的今天,你要保證 APP 能夠脫穎而出就要保證 APP 穩定,所以我們可以順手添加以下OneAPM[3] 就能監控到應用程序運行緩慢、ANR、Crash、WebView、Activity、網絡請求等方面的性能,能讓開發者第一時間掌握 APP 監控狀況。更讓人喜歡的是,這款產品只需開發者填入一行代碼即可,真可謂是「神器」。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!