Android客户端打包方案分享
基本介紹
Android應(yīng)用的自動(dòng)化打包是應(yīng)用持續(xù)集成以及多渠道發(fā)布的基礎(chǔ)。當(dāng)前Android客戶端自動(dòng)化打包的主要有兩種方式,Ant和Maven。兩種方式本質(zhì)上都是調(diào)用Android SDK里面提供的工具,不過(guò)各自有各自的特點(diǎn)。
1. Ant腳本
好處:開發(fā)成本較低,android sdk默認(rèn)提供ant的打包腳本,可以根據(jù)需要進(jìn)行修改和擴(kuò)展。
不足:不天然支持包的依賴管理,需要自己寫代碼控制應(yīng)用的依賴。
2. Maven
好處:天然支持包的依賴管理,依賴管理不需要寫過(guò)多的代碼。Maven插件機(jī)制容易擴(kuò)展和定制,方便實(shí)現(xiàn)自己的打包流程。
不足:從頭編寫Maven腳本,或者maven插件,大家對(duì)Maven的熟悉程度稍低,門檻稍高。
?
這里介紹一種Ant+shell腳本的自動(dòng)化打包方案。Ant腳本直接復(fù)用sdk提供的腳本并稍作擴(kuò)展,對(duì)應(yīng)用的包依賴和打包流程自動(dòng)化控制,選擇使用shell實(shí)現(xiàn)。
?
具體實(shí)施
打包整體邏輯
Shell腳本(見源碼,感謝@今為幫忙重構(gòu))
Shell腳本實(shí)現(xiàn)了上圖中的邏輯,比較簡(jiǎn)單,這里不再細(xì)述,可以看一下源碼。
Ant腳本定制
這里主要描述一下對(duì)Android自帶ant腳本的定制。
Android SDK里面自帶的ant腳本(在~/android-sdk-linux_x86/tools/ant/build.xml),如果你的Android主工程沒(méi)有支持ant構(gòu)建,那么可以在主工程根目錄下通過(guò)運(yùn)行
android update project -p . –n projectname
來(lái)增加ant構(gòu)建支持,運(yùn)行后會(huì)在根目錄下生成build.xml(通過(guò)<import file="${sdk.dir}/tools/ant/build.xml" />繼承自SDK中的build.xml)
SDK中的build.xml有release task,包括了android打包的完成流程,看代碼如下:
<target name="release"depends="-set-release-mode, -release-obfuscation-check, -package, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build"description="Builds the application in release mode."></target>由代碼可見,release任務(wù)依賴了8個(gè)其它的任務(wù),其實(shí)核心的任務(wù)就2個(gè):
l?? -package 編譯,生成未簽名APK
l?? -release-sign 簽名
總結(jié)起來(lái)整個(gè)過(guò)程分解為:編譯生成未簽名包和簽名兩個(gè)階段。我們要做的就是在這兩個(gè)階段中增加一個(gè)替換渠道號(hào)的步驟,如上圖中描述,主要過(guò)程核心流程:
?
步驟1和3其實(shí)就是原來(lái)release任務(wù)的分解,代碼如下:
<target name="release2"depends="-set-release-mode, -package, -post-package, -release-prompt-for-password, -release-nosign, -post-build"description="Builds the application in unsigned mode."></target> <target name="signapk"depends="-set-release-mode,-release-sign, -post-build"description="Sign apk.">Android應(yīng)用根目錄下自動(dòng)生成的build繼承自系統(tǒng)的ant腳本,該腳本中的ant task可以直接復(fù)用,因此有了上面自己寫的兩個(gè)任務(wù)release2和signapk,分別表示了1和3階段的任務(wù)。
步驟2的邏輯系統(tǒng)ant腳本里面沒(méi)有現(xiàn)成的任務(wù),需要自己編寫,代碼如下:
<target name="modichannel"><exec executable="${aapt}" taskName="remove"><arg value="remove" /><arg value="-v" /><arg value="./bin/${appname}-release-unsigned.apk" /><arg value="assets/channel" /></exec><exec executable="${aapt}" taskName="add"><arg value="add" /><arg value="-v" /><arg value="./bin/${appname}-release-unsigned.apk" /><arg value="assets/channel" /></exec></target>這個(gè)任務(wù)做了兩件事兒,第一,調(diào)用android sdk的aapt工具先刪除未簽名包中的默認(rèn)渠道文件,第二,添加新渠道文件到未簽名包。注意這里一定要用android自帶的aapt工具操作apk壓縮包,如果使用zip會(huì)對(duì)raw文件進(jìn)行壓縮,這個(gè)似乎并不符合apk打包的規(guī)范(aapt對(duì)raw文件的壓縮有處理,注:對(duì)于zip和aapt壓縮的區(qū)別并沒(méi)有過(guò)多深入的了解,有興趣的可以進(jìn)一步探討),導(dǎo)致打包出來(lái)的apk讀取raw目錄下的資源失敗。
?
總結(jié)
整個(gè)打包流程,代碼量不大,用shell實(shí)現(xiàn)打包流程控制,擴(kuò)展了三個(gè)ant task。用這種方案,可以做到針對(duì)多渠道發(fā)布,只需要一次編譯,多次渠道替換和簽名,因?yàn)閍ndroid編譯很耗時(shí),這樣可以大大減少渠道的打包時(shí)間。
?
源碼
http://code.taobao.org/p/android_build/src/
問(wèn)題
總的來(lái)說(shuō)還是比較簡(jiǎn)單的,當(dāng)然整個(gè)過(guò)程也遇到了一些問(wèn)題和雷區(qū),列舉一下,避免再次犯錯(cuò),也算經(jīng)驗(yàn)積累。
其實(shí)生成未簽名包之后無(wú)需解壓替換,直接aapt操作壓縮包替換就好了,這樣可以避免使用zip。
編寫shell時(shí)當(dāng)前路徑要控制好,否則會(huì)很麻煩錯(cuò)誤不斷。
轉(zhuǎn)載于:https://www.cnblogs.com/youngerbaby/archive/2013/05/18/3085548.html
總結(jié)
以上是生活随笔為你收集整理的Android客户端打包方案分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 统计通话次数和时间的软件_通话时间统计官
- 下一篇: android_驱动_qcom_【高通S