手动命令行编译APK
平時開發(fā)為了提高效率,我們都喜歡使用集成開發(fā)工具,如Android Studios、Eclipse 等等。效率是提高了,但往往會忽略一些基本原理。現(xiàn)在我們拋開這些工具,自己通過打包命令,手動編譯APK。
APK解壓
不知道大家有沒有了解,APK其實(shí)是一個zip格式文件。我們將一個app.apk 后綴名改成app.zip,然后用unzip 解壓它。
如圖所示:
app.zip.jpg
解壓后的得到了以下幾個重要的文件。
- resources.arsc :通過AAPT編譯后的資源索引表文件。
- AndroidMainfest.xml:編譯后的壓縮文件,包括了一些應(yīng)用的信息如包名、版本號、權(quán)限、組件注冊等等。
- res目錄: 存放APP的資源,包括圖片,字符串、布局等等文件。
- classes.dex:java 源碼編譯后生成的java 字節(jié)碼文件。
- META-INF目錄:存放的是簽名信息,用來保證apk包的完整性和系統(tǒng)的安全。
unzip.jpg
通過以上簡單的解壓,簡單了了解最終得到的文件,大家可以帶著疑惑往下看,這些文件是怎么來的。
編譯流程
我們都知道,一個基本的Android工程是由 Mainifest、Resources、Assets、Sourcescode、Libraries、等組成。那么他們是怎么構(gòu)建起來的呢?看以下這張來自google官方經(jīng)典的流程圖。
build.png
編譯成.class Files.
手動打包
了解打包流程后,我們通過例子手動驗(yàn)證一下。手動建立以下幾個文件。結(jié)構(gòu)如下:
android-project/ ├── AndroidManifest.xml ├── gen/ ├── lib/ │ └── android-support-v4.jar ├── out/ ├── res/ │ ├── drawable-xhdpi/ │ │ └── icon.png │ ├── drawable-xxhdpi/ │ │ └── icon.png │ ├── drawable-xxxhdpi/ │ │ └── icon.png │ └── layout/ │ └── activity_main.xml └── src/└── cn/└── androidblog/└── testbuild/└── MainActivity.java第一步:資源編譯
使用aapt工具。aapt命令網(wǎng)上很多,我就不說了。
jomeslu@jomeslu:~$ aapt package -f -M AndroidManifest.xml -I "$ANDROID_HOME/platforms/android-N/android.jar" -S res/ -J gen/ -m然后生成的R.java 在gen/cn/androidblog/testbuild/R.java文件
/* AUTO-GENERATED FILE. DO NOT MODIFY.** This class was automatically generated by the* aapt tool from the resource data it found. It* should not be modified by hand.*/ package com.androidblog.testbuild;public final class R {public static final class attr {}public static final class drawable {public static final int ic_launcher=0x7f020000;}public static final class layout {public static final int activity_main=0x7f030000;} }aapt 參數(shù)的
-f 如果編譯出來的文件已經(jīng)存在,強(qiáng)制覆蓋。
-m 使生成的包的目錄放在-J參數(shù)指定的目錄。
-J 指定生成的R.java的輸出目錄
-S res文件夾路徑
-A assert文件夾的路徑
-M AndroidManifest.xml的路徑
-I 某個版本平臺的android.jar的路徑
-F 具體指定apk文件的輸出
關(guān)于資源編譯這塊涉及很多很有趣的地方。比如打包的時候,資源沖突的解決,動態(tài)修改資源的ID等等。插件化需要用到這個技術(shù),所以我會單獨(dú)寫一篇文章詳細(xì)介紹,本文先不講。
第二步:代碼編譯
通過javac 將java文件編譯成.class 文件 命令如下:
jomeslu@jomeslu:~$ javac -encoding GBK -bootclasspath /home/jomeslu/Android/Sdk/platforms/android-22/android.jar -d ./testBuild/out/ ./testBuild/src/com/androidblog/testbuild/*.java ./testBuild/gen/com/androidblog/testbuild/*.java -classpath ./testBuild/libs/android-support-v4.jar在.class 在out/cn/androidblog/testbuild/目錄下
class.png
備注:javac 的參數(shù)
-g 生成所有調(diào)試信息-g:none 不生成任何調(diào)試信息-g:{lines,vars,source} 只生成某些調(diào)試信息-nowarn 不生成任何警告-verbose 輸出有關(guān)編譯器正在執(zhí)行的操作的消息-deprecation 輸出使用已過時的 API 的源位置-classpath <路徑> 指定查找用戶類文件和注釋處理程序的位置-cp <路徑> 指定查找用戶類文件和注釋處理程序的位置-sourcepath <路徑> 指定查找輸入源文件的位置-bootclasspath <路徑> 覆蓋引導(dǎo)類文件的位置-extdirs <目錄> 覆蓋所安裝擴(kuò)展的位置-endorseddirs <目錄> 覆蓋簽名的標(biāo)準(zhǔn)路徑的位置-proc:{none,only} 控制是否執(zhí)行注釋處理和/或編譯。-processor <class1>[,<class2>,...] 繞過默認(rèn)的搜索進(jìn)程-processorpath <路徑> 指定查找注釋處理程序的位置-parameters 生成元數(shù)據(jù)以用于方法參數(shù)的反射-d <目錄> 指定放置生成的類文件的位置-s <目錄> 指定放置生成的源文件的位置-h <目錄> 指定放置生成的本機(jī)標(biāo)頭文件的位置-implicit:{none,class} 指定是否為隱式引用文件生成類文件-encoding <編碼> 指定源文件使用的字符編碼-source <發(fā)行版> 提供與指定發(fā)行版的源兼容性-target <發(fā)行版> 生成特定 VM 版本的類文件-profile <配置文件> 請確保使用的 API 在指定的配置文件中可用-version 版本信息-help 輸出標(biāo)準(zhǔn)選項(xiàng)的提要-A關(guān)鍵字[=值] 傳遞給注釋處理程序的選項(xiàng)-X 輸出非標(biāo)準(zhǔn)選項(xiàng)的提要-J<標(biāo)記> 直接將 <標(biāo)記> 傳遞給運(yùn)行時系統(tǒng)-Werror 出現(xiàn)警告時終止編譯@<文件名> 從文件讀取選項(xiàng)和文件名第三步:生成.dex文件
將工程out目錄下的所有文件編譯成classes.dex文件。通過dex工具編譯,詳細(xì)的dx命令去網(wǎng)上查查。
jomeslu@jomeslu:~$ ./dx --dex --output=./testBuild/out/classes.dex ./testBuild/out/cn/androidblog/testbuild/第四步:生成APK文件
這個階段要分兩步走 :1.資源文件初始包 2.加入classes.dex
第五步:加入簽名
大家都知道apk都是必須加入簽名的,不管是debug的簽名還是公開版的簽名,都需要安裝,否者是不能安裝使用的。SDK 提供了一個的debug key,路徑在~/.android/debug.keystore.
默認(rèn)的簽名信息如下
所以用JDK提供的工具jarsigner 進(jìn)行簽名
jomeslu@jomeslu:~$ jarsigner -verbose -keystore ~/.android/debug.keystore -storepass android -keypass android ./testbuild/out/testbuild.apk androiddebugkey這樣,APK就已經(jīng)完成了簽名。
第六步:對簽名的APK優(yōu)化
這是最后一步了,APK簽名完成后,需要對未壓縮的數(shù)據(jù)進(jìn)行4個字節(jié)的邊界對齊。這樣提高了APK的性能,主要體現(xiàn)在文件的操作、資源的讀取等等。使用Zipalign工具幫我們處理這樣的事情。
jomeslu@jomeslu:~$ zipalign -f 4 ./testbuild/out/testbuild.apk ./testbuild/out/testbuild-optimizated.apk總結(jié)
打包過程是很好理解的。總結(jié)以下的3個部分
好了,打包就先介紹道這里,希望對大家有幫助
作者:Jomeslu
鏈接:https://www.jianshu.com/p/d2dc78eb7bd9
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。
總結(jié)
以上是生活随笔為你收集整理的手动命令行编译APK的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迁移学习简介(tranfer learn
- 下一篇: 如何手动完成一次APK打包?----AP