Android 多渠道打包原理和使用

每次中午吃飯總會(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 的沼填。


Android多渠道打包原理和使用
Android多渠道打包原理和使用

大家從圖中可以看出桅咆,大體分為以下 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è)過程是這樣的:


Android多渠道打包原理和使用
Android多渠道打包原理和使用

說明:圖片來源網(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è)渠道的包蛀醉,如下圖


打包結(jié)果
打包結(jié)果

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

Android多渠道打包原理和使用
Android多渠道打包原理和使用

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ù)博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞎暑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子与帆,更是在濱河造成了極大的恐慌了赌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玄糟,死亡現(xiàn)場(chǎng)離奇詭異勿她,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茶凳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門嫂拴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贮喧,你說我怎么就攤上這事筒狠。” “怎么了箱沦?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵辩恼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我谓形,道長(zhǎng)灶伊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任寒跳,我火速辦了婚禮聘萨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘童太。我一直安慰自己米辐,他們只是感情好胸完,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翘贮,像睡著了一般赊窥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狸页,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天锨能,我揣著相機(jī)與錄音,去河邊找鬼芍耘。 笑死址遇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的齿穗。 我是一名探鬼主播傲隶,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼窃页!你這毒婦竟也來了跺株?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤脖卖,失蹤者是張志新(化名)和其女友劉穎乒省,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畦木,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袖扛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了十籍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛆封。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勾栗,靈堂內(nèi)的尸體忽然破棺而出惨篱,到底是詐尸還是另有隱情,我是刑警寧澤围俘,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布砸讳,位于F島的核電站,受9級(jí)特大地震影響界牡,放射性物質(zhì)發(fā)生泄漏簿寂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一宿亡、第九天 我趴在偏房一處隱蔽的房頂上張望常遂。 院中可真熱鬧,春花似錦挽荠、人聲如沸烈钞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毯欣。三九已至,卻和暖如春臭脓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工旷偿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懂扼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓嘹锁,卻偏偏與公主長(zhǎng)得像葫录,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子领猾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • 1米同、為什么要進(jìn)行多渠道打包? 安卓應(yīng)用商店(一個(gè)商店也叫做一個(gè)渠道摔竿,如豌豆莢面粮,360手機(jī)助手,應(yīng)用寶)眾多继低,大大小...
    閑庭閱讀 5,379評(píng)論 1 13
  • 目錄一熬苍、Python打包及優(yōu)化(美團(tuán)多渠道打包)二、Gradle打包三袁翁、其他打包方案:修改Zip文件的commen...
    守望君閱讀 5,694評(píng)論 4 17
  • 來啊粱胜,撩撥我 世界那么大柄驻,我想去看看 ———————————————————————————— 我們城里人 工作起...
    圖驢閱讀 227評(píng)論 0 0
  • 生命生機(jī)有活力, 創(chuàng)始成終動(dòng)善工年柠。 一點(diǎn)一線一觀念凿歼, 可圈可點(diǎn)亦可變。
    先謙虛后受益閱讀 196評(píng)論 2 2