每次中午吃飯總會(huì)和技術(shù)同學(xué)聊天掂碱。當(dāng)做 iOS 開發(fā)的做安卓開發(fā)的人員在一起的時(shí)候,他們中間又多了一個(gè)話題:iOS 開發(fā)難還是安卓開發(fā)難吮铭。
這個(gè)時(shí)候做安卓開發(fā)的同學(xué)最激動(dòng)說安卓開發(fā)要自己畫界面霹抛、機(jī)型復(fù)雜熬词、操作系統(tǒng)多 rom 又被各家改的四不像....開發(fā)一個(gè)安卓 APP 的時(shí)間將近是開發(fā) iOS 所需時(shí)間的 2 倍栅表。iOS 開發(fā)的同學(xué)可能就會(huì)反駁說 iOS 開發(fā)入門難度比安卓高笋鄙,開發(fā)中第三方庫不像安卓那么多,開發(fā)設(shè)備又必須是 MAC怪瓶,而安卓隨便一臺(tái) PC 即可...筆者認(rèn)為萧落,這個(gè)問題因人而異,不想再引起一場(chǎng)爭(zhēng)論洗贰。其實(shí)找岖,今天想說的是,安卓開發(fā)中還有一件事情比較痛苦那就是打包敛滋。
做過 APP 開發(fā)的人都知道安卓的渠道林立许布,筆者記得曾經(jīng)工作的一家公司每次發(fā)包都要運(yùn)行腳本去打包,每次打幾百個(gè) APK绎晃,花費(fèi)幾個(gè)小時(shí)蜜唾,電腦都累的風(fēng)扇呼呼叫。而 iOS 由于其封閉性箕昭,渠道除了 AppStore 之外幾乎很少了灵妨。所以,安卓 APP 開發(fā)之后要把 APP 分發(fā)出去要做的事情要比 iOS 多這個(gè)是一定的落竹。這篇文章咱們就和做安卓開發(fā)的同學(xué)聊一下安卓 APP 多渠道打包的事情。
APP多渠道打包原理講解
要多渠道打包货抄,我們就來說一下渠道如何標(biāo)識(shí)述召。一般來說渠道標(biāo)識(shí)有兩個(gè)地方可以做:
1、在代碼中寫蟹地,例如 TalkingData 就提供了這種方式
//啟動(dòng)代碼
init(final Context context, final String appId, final String partnerId);
//這種方式不需要在 AndroidManifext.xml 里的 meta-data 申明了 TD_APP_ID 和 TD_CHANNEL_ID
2积暖、在 AndroidManifext.xml 中填寫,還拿 TalkingData 舉例子
//啟動(dòng)代碼
init(final Context context);
//這種方式可以使用多渠道打包工具怪与,方便一次打包多個(gè)發(fā)布渠道
//AndroidManifext.xml中這樣寫
<meta-data android:name="TD_CHANNEL_ID" android:value="Your_channel_id" />
如果是單獨(dú)打一個(gè) APP 包加上上面的配置直接 IDE 中導(dǎo)出 APK 就行了夺刑,如果打很多個(gè) APK 用 IDE 就很費(fèi)力。 要想多渠道打包,就需要對(duì) Android 的整體的打包編譯過程有所了解遍愿。下面認(rèn)識(shí)下 Android 的 java 代碼存淫、XML 格式的資源文件、圖片文件等資源是如何轉(zhuǎn)換成為一個(gè) APK 的沼填。

大家從圖中可以看出桅咆,大體分為以下 7 個(gè)大步:
1、打包資源文件坞笙,生成 R.java 文件
2岩饼、處理 aidl 文件,生成相應(yīng) java 文件
3薛夜、編譯工程源代碼籍茧,生成相應(yīng) class 文件
4、轉(zhuǎn)換所有 class 文件梯澜,生成 classes.dex 文件
5寞冯、打包生成 apk
6、對(duì) apk 文件進(jìn)行簽名
7腊徙、對(duì)簽名的 apk 進(jìn)行 zipalign 對(duì)其操作
說明:這里只是大致表明大致的打包編譯過程简十,其實(shí)如果細(xì)分每一部分還有很多細(xì)節(jié)。
結(jié)合原理和渠道的 1撬腾、2 兩種設(shè)置方法我們分別來說.
1螟蝙、如果渠道信息是通過 Java 的硬編碼方式來做的,我們可以在打包之前預(yù)處理 Java 源文件民傻,找到渠道設(shè)置關(guān)鍵字胰默,從渠道列表中找到一個(gè)渠道設(shè)置進(jìn)去即可。由于腳本這塊兒漓踢,不同的語言的實(shí)現(xiàn)方式不同牵署,這里不做過多的說明。如果有需要的我可以把自己之前 shell 寫的一段代碼分享了喧半。
2奴迅、如果使用寫在 AndroidManifext.xml 中,這個(gè)就可以通過讀取 XML 文件的方式定位到 meta-data 并且 android:name 的值為 TD_CHANNEL_ID 的元節(jié)點(diǎn)挺据。把這個(gè)元節(jié)點(diǎn)的值設(shè)置成某一個(gè)渠道即可取具。這里推薦大家看一下友盟開源的一個(gè)多渠道打包工具中有相關(guān)的實(shí)現(xiàn)細(xì) 1。這個(gè)過程發(fā)生在上圖中的 aapt 階段扁耐,這個(gè)階段做的事情還比較多沒有分來來說暇检。
大致原理就是這樣,其實(shí)也很簡(jiǎn)單~婉称,就是在正常的 Android 打包編譯過程中進(jìn)行干涉块仆,加入一些邏輯來替換相關(guān)的渠道信息构蹬,保證打包之后的 APK 中的渠道信息各不相同。
其實(shí)這個(gè)過程是這樣的:

說明:圖片來源網(wǎng)絡(luò)
然后編寫腳本或者工具來循環(huán)的這個(gè)過程....
Android Studio多渠道打包
Android Studio 發(fā)布已經(jīng)好長(zhǎng)時(shí)間了悔据,Google 也一直在維護(hù)在更新庄敛,Android 開發(fā)的小伙伴你們用起來了嗎?聽說身邊做開發(fā)的很多都轉(zhuǎn)向了這個(gè)神器蜜暑。這里铐姚,我們就重點(diǎn)說一下如何在 Android Studio 中實(shí)現(xiàn)多渠道打包,后續(xù)給出一個(gè) Demo來做演示肛捍,筆者覺得這樣更實(shí)用隐绵。
第一步在 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 類似于一個(gè)產(chǎn)品的不同特性的配置[2]. productFlavors.all 是一個(gè)遍歷拙毫,每一個(gè) productFlavors 中的值依许,其中productFlavors 的每一個(gè)值都有一個(gè) name ,就是類似 wandoujia 這樣的字符缀蹄,每次循環(huán)的時(shí)候會(huì)替換掉 AndroidManifext.xml 中的${ONEAPM_TEST_CHANNEL}峭跳。
第三步,執(zhí)行打包命令
打開命令行定位到 project 目錄缺前,執(zhí)行
gradlew assembleRelease
不出意外的話 bulid->outputs->apk 下面會(huì)有各個(gè)渠道的包蛀醉,如下圖

注意事項(xiàng):
1、productFlavors 定義的時(shí)候里面的類似 wandoujia衅码,不能是數(shù)字開頭拯刁,不能是關(guān)鍵字 test 等,因?yàn)槟阋庾R(shí)到你在寫 gradle 腳本逝段,要符合 groovy 語法垛玻。如下面的就不合法

2、flavor.manifestPlaceholders = [ONEAPM_TEST_CHANNEL: name]中的ONEAPM_TEST_CHANNEL 一定要和 AndroidManifext.xml 定義的一致奶躯。
打包發(fā)布之后還要做什么
開發(fā)者花費(fèi)了很大的心血做出一款 APP 為的就是希望這款 APP 產(chǎn)生它應(yīng)有的價(jià)值帚桩。所以我們會(huì)集成一些統(tǒng)計(jì)例如友盟、talking data嘹黔,有了它每日活躍账嚎、新增、留存就有地方看了儡蔓,這個(gè)估計(jì)每個(gè)開發(fā)者都會(huì)做醉锄。單更重要的是,我們做出的 APP 要保證在每臺(tái)手機(jī)都能正常的打開和使用浙值,特別是在 APP 同質(zhì)化越來越嚴(yán)重的今天,你要保證 APP 能夠脫穎而出就要保證 APP 穩(wěn)定檩小,所以我們可以順手添加以下 OneAPM[3] 就能監(jiān)控到應(yīng)用程序運(yùn)行緩慢开呐、ANR、Crash、WebView筐付、Activity卵惦、網(wǎng)絡(luò)請(qǐng)求等方面的性能,能讓開發(fā)者第一時(shí)間掌握 APP 監(jiān)控狀況瓦戚。更讓人喜歡的是沮尿,這款產(chǎn)品只需開發(fā)者填入一行代碼即可,真可謂是「神器」较解。
OneAPM Mobile Insight 以真實(shí)用戶體驗(yàn)為度量標(biāo)準(zhǔn)進(jìn)行 Crash 分析畜疾,監(jiān)控網(wǎng)絡(luò)請(qǐng)求及網(wǎng)絡(luò)錯(cuò)誤,提升用戶留存印衔。訪問 OneAPM 官方網(wǎng)站感受更多應(yīng)用性能優(yōu)化體驗(yàn)啡捶,想閱讀更多技術(shù)文章,請(qǐng)?jiān)L問 OneAPM 官方技術(shù)博客奸焙。
本文轉(zhuǎn)自 OneAPM官方技術(shù)博客