當前各大渠道使用的打包技術在Eclipse項目的前提下無非就是經過母包與渠道資源合併,並從新打包生成APK。java
Android apk文件其實就是一個以apk後綴的壓縮包,由Android SDK下的工具編譯生成。Android編譯過程可經過下圖瞭解;android
使用壓縮工具解壓APK文件,可獲得下圖結構目錄;安全
一、assets目錄:assets目錄裏是項目對應的assets目錄,原封不動;框架
二、lib目錄:lib目錄裏會存放項目的各個框架的so文件,jar文件不會在裏面,由於已經將jar文件編譯;工具
三、META-INF目錄:存放的是簽名信息,用來保證apk包的完整性和系統的安全;優化
四、res目錄:項目資源目錄,該目錄下的資源文件在項目中會一一對應生成R.java的資源引用;spa
五、AndroidManifest.xml:二進制後的AndroidManifest.xml文件;3d
六、classes.dex:java源碼編譯後生成的java字節碼文件;code
七、resources.arsc:編譯後的二進制資源文件;orm
Ok,大概文件中的內容就這麼多,那麼進行打包流程中,咱們須要使用一些Android SDK工具進行打包;
Android SDK目錄
那麼如今就解析打包過程的具體步驟吧:
一、apktool工具可將apk進行反編譯。使用apktool工具,將母包進行反編譯,獲得一個母包反編譯目錄,反編譯目錄如:
二、反編譯後獲得咱們的母包資源,而後對應目錄,將渠道資源的資源assets目錄,libs目錄,res目錄中的資源一一對應拷貝到母包資源目錄中,jar文件不用拷貝,待會會進行編譯,編譯後的smali文件拷貝到smali文件目錄中便可;
將jar文件編譯成smali文件步驟爲:
一、jar==>dex:"java" -jar -Xms1024m -Xmx1024m "dx.jar" --no-warning --dex --multi-dex --output="output_path" "jar_file_list"
解析:一、java:就是JDK環境咯;二、dx.jar:Android SDK下的工具;三、output_path:輸出路徑;四、jar_file_list:jar文件,可多個jar文件,以空格隔開;
二、dex==>smali:"java" -jar "baksmali.jar" -o ".../decompile/smali" "classes.dex"
解析:一、java:同上;二、baksmali.jar:將dex編譯成smali的工具;三、.../decompile/smali:smali文件輸出目錄,通常可直接輸出到母包反編譯smali目錄中,由於smali文件有包目錄路徑,避免了再次的多文件夾拷貝;四、classes.dex:由1生成的dex文件;
三、代碼文件基本上就搞定了,一個比較重要的就是,jar文件裏,不少渠道會往jar文件裏放文件,記得須要解壓一下jar文件,而後遍歷jar文件目錄,若是裏面有除了class文件的其餘文件,須要拷貝出來,在jar文件根目錄的直接拷貝到母包根目錄中,其餘的根據對應目錄拷貝到母包對應目錄便可,這個操做其實寫個簡單的腳本便可;
四、接下來,就是打包根據不一樣包的需求,修改應用名稱,修改包名,修改ICON,修改版本號等等,這些都是修改文件的,沒什麼好講的哈;
五、從新生成資源R文件,這個是整個打包過程的重點:"aapt" p -f -m -J "temp/gen" -S "temp/res" -I "android.jar" -M "decompile/AndroidManifest.xml"
-f 若是編譯出來的文件已經存在,強制覆蓋
-m 使生成的包的目錄存放在-J參數指定的目錄
-J 指定生成的R.java 的輸出目錄
-S res文件夾路徑
-I 某個版本平臺的android.jar的路徑
-M AndroidManifest文件路徑
-F 具體指定APK文件的輸出
六、R文件生成以後是java文件類型,經過javac編譯成class文件: "javac" -source 1.7 -target 1.7 -encoding UTF-8 "R.java";而後同2步驟,將class文件編譯成smali文件;
七、一些須要注意的地方:一、資源名稱不能相同;二、框架armeabi與框架armeabi-v7a內容保持一致;
八、Ok,大概這些步驟都能解決掉大部分的需求了,如今就將母包目錄進行回編譯,一樣是使用apktool工具;
九、簽名、對齊優化;
打包流程大概就是這樣了,這樣能夠將渠道資源跟母包資源合併在一塊兒,如今大概打包都是這樣操做;記錄一下,之後用到就方便了;
——————————————————————————————————————————————————————————
記:
問題一:今天有個渠道打應用寶渠道的包時候老是,遊戲運行不正常,加載資源時卡了,而後拋出ANR錯誤
緣由:assets文件夾下的遊戲文件被壓縮了。Android Asset Packaging Tool(aapt)使用這個工具可打包全部數據 Image XML文件 任何資源文件.在生成APK時aapt選擇性的壓縮各類資源來節省設備空間,aapt使用後綴來決定哪一個資源須要壓縮,aapt源碼定義一些不須要壓縮的文件後綴。
view plainprint? /* these formats are already compressed, or don't compress well */ static const char* kNoCompressExt[] = { ".jpg", ".jpeg", ".png", ".gif", ".wav", ".mp2", ".mp3", ".ogg", ".aac", ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet", ".rtttl", ".imy", ".xmf", ".mp4", ".m4a", ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2", ".amr", ".awb", ".wma", ".wmv" };
那麼其餘文件就會被壓縮。在使用apktool工具的狀況下,在apktool.yml下有個doNotCompress節點,在這裏能夠配置打包時忽略壓縮的文件。經過配置,遊戲文件不會被壓縮,就正常了。
配置例如:
doNotCompress: - arsc - sfd - esa