介紹
- 本文基于ant命令創建工程使用android sdk提供的工具進行手動打包
- 打包基本流程
- 手動命令打包實操
- 后續學習gradle打包、python腳本打包及點擊build As的工作過程等
圖解打包過程
手動打包用的工具及環境配置
-
android.bat
位于sdk的tools目錄下
-
配置環境變量:
在電腦 --> 屬性 --> 高級 --> 環境變量 -->path中加入Android SDK目錄中tools目錄的路徑。實質上就是配置android.bat的目錄地址
例如:我的SDK安裝在:D:/AS_SDK/android-sdk-windows下,那就得在path中添加:D:/AS_SDK/android-sdk-windows/tools這樣android中一些命令就可以用了。
-
常用命令:
配置成功之后可以在cmd中輸入android -h 查看android命令支持的功能
android list targets 查看所有的sdk版本信息
android list device 查看所有的設備信息
android create avd 創建一個新的虛擬機
android
創建一個Android工程
-
aapt.exe
位于Android SDK build-tools目錄下不同版本中
-
配置aapt命令環境:
將某個版本下的aapt.exe的路徑加到path中即可,例如:
C:\Users\DELL\android-sdks\build-tools\26.0.2 aapt工具路徑為:你的sdk目錄\build-tools\aidl.exe
比如我的在這些工具所在地址:
D:\AS_SDK\android-sdk-windows\build-tools\26.0.2\aapt.exe
-
javac.exe
- 位置D:\jdk1.8\bin
- javac 類名.java將java文件編譯成.class文件
-
dx.bat
- 位置:D:\AS_SDK\android-sdk-windows\build-tools\23.0.0
-
keytool
生成簽名文件,進行簽名等
-
zipalign.exe
位置:D:\AS_SDK\android-sdk-windows\build-tools\23.0.0
對打的包進行壓縮優化
打包步驟分解
-
AAPT打包資源文件,生成應用的R.java文件 + resource.arsc
資源文件被AAPT(Android Asset Packaging Tool)處理為最終的resources.arsc,并生成R.java文件。以保證源碼編寫時可以方便的訪問這些資源
assets是不需要做任何處理的,res/raw只需分配id后與assets一起直接打包到應用程序中;基于下述原因,其它xml文件則會被編譯成二進制
編譯過程中,會把xml中的字符串進行收集去重,形成字符串資源池,元素中用到字符串的地方將被替換成相應的索引。另外,標簽屬性/値都會轉換為資源id,進一步減少文件大小;
二進制格式的xml把標簽屬性/値轉換為資源id后,避免了字符串解析,從而提高了解析速度;
-
經過AAPT處理后,會輸出2個文件:
一個R.java,為項目各資源分配了不同的id,將和java源碼一起參與到后續的編譯過程,id為4字節無符號整數,最高字節表示package id,次高字節表示type id,后2字節表示資源在當前類型中出現的序號,如R.string.appname=0x7f07006b中的0x7f代表當前正在編譯的資源包,0x07代表string類型,0x006b代表app_name在string類型中出現的序號
另一個為app.ap,實際上為一個壓縮包,包含了assets、res、Androidmanifest.xml與resources.arsc
資源索引表resources.arsc記錄了從資源id到文件路徑的轉換關系,當應用通過Resources類獲取res文件資源時,會先從resources.arsc中拿到文件路徑,然后通過AssetManager進行訪問。
-
源碼編譯,打包class文件和jar包為dex文件
-
當項目中包含AIDL時,AIDL文件通過AIDL工具轉換成編譯器能處理的Java接口文件。
編譯AIDL文件的工具在:你的sdk目錄\build-tools\aidl.exe。
-
javac命令將java源碼編譯成.class字節碼,用以編譯的classpath包含以下內容:
android.jar,具體版本由targetSdkVersion指定;
build.gradle中添加的第三方依賴;
編譯后可對代碼進行混淆處理,主要包括刪除無用類、字節碼優化、重命名等操作,只需在build.gradle中配置混淆規則即可
注意在編譯java文件的時候要一同編譯R.java文件,否則會出現找不到R文件錯誤
-
將編譯后的資源和其他的資源(assets和res資源)打包為資源壓縮包(例如res.zip ,名字可以自己定義)
組合classses.dex和res.zip生成未簽名的APK,使用apkbuilder
生成有簽名的APK
進行zipAlign優化
-
創建Android工程目錄結構
android create project -n test -t 1 -p ./CommandBuildApk -k com.thc -a MainActivity
Options:
-n --name 應用程序的名字
-t --target SDK Target ID
-p --path 應用程序的工作目錄
-k --package 應用程序的包名
-a --activity 默認創建的Activity的名字提示:通過 tree 命令可以查看生成的Android工程目錄結構
-
生成R.java文件
aapt p -m -J ./gen -M AndroidManifest.xml -S res -I D:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar
Options:
-f 如果編譯出來的文件已經存在,強制覆蓋。
-m 使生成的包的目錄放在-J參數指定的目錄。
-J 指定生成的R.java的輸出目錄
-S res文件夾路徑
-A assert文件夾的路徑
-M AndroidManifest.xml的路徑
-I 某個版本平臺的android.jar的路徑
-F 具體指定apk文件的輸出
-
編譯所有的java文件為Java虛擬機認識的.class文件
使用JDK提供的javac命令進行編譯
javac src/com/thc/apkbuild/*.java gen/com/thc/apkbuild/R.java -bootclasspath d:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar -d bin //命令解釋如下: javac //包下的java文件 src/com/thc/apkbuild/*.java //gen目錄下的R.java文件 gen/com/thc/apkbuild/*.java //引用android.jar 這個jar包,如果使用其他的jar包,在后面進行添加即可 -bootclasspath d:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar //打出來的class文件所在目錄 -d bin //編碼格式 -encoding GBK //添加jar包 -classpath /.../xxx.jar //例如引用Gson的jar包 javac src/com/thc/apkbuild/*.java gen/com/thc/apkbuild/R.java -d bin -bootclasspath d:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar -classpath libs/gson-2.2.jar
遇到的問題備注: 將java文件編譯成class文件的時候一定要記得一起編譯gen目錄下的R.java文件,否則會報找不到R.java的錯誤
-
打包class文件和第三方jar包為dex文件
dx --dex --output=bin\classes.dex bin 命令釋義: output=<dex文件輸出地址,如上為當前目錄的bin目錄下> bin<是class文件和jar包所在的目錄>
-
編譯資源文件生成resources文件
aapt package -f -M AndroidManifest.xml -S res -A assets -I d:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar -F bin/resources
-
將編譯后的資源和其他的資源(assets和res資源)打包為資源壓縮包
使用aapt工具,命令如下:
aapt package -f -M AndroidManifest.xml -I d:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar -S res -F my.apk
參數釋義在生成R文件的時候有說明。
到這一步就在你當前目錄生成了一個my.apk文件
-
將classes.dex和resources加入到生成的apk中
java -claspath D:\AS_SDK\android-sdk-windows\tools\lib\sdklib.jar com.android.sdklib.build.ApkBuilderMain my.apk -v -u -z bin\resources -f bin\classes.dex -rf src
問題說明: 以前可以直接使用apkbuilder工具直接打包,但是目前sdk將該工具移除了。其實apkbuilder最終調用的是sdklib.jar中的com.android.sdklib.build.ApkBuilderMain類來做事情的,所以這里直接通過 java <class地址> 來使用ApkBuilderMain這個類,來把resources和classes.dex加入到apk文件中
-
生成有簽名的APK
-
生成簽名:
keytool -genkey -alias <別名> -keyalg RSA -validity 20000 -keystore <簽名.keystore>
-
給apk簽名
jarsigner -verbose -keystore <簽名.keystore> -signedjar <簽名ed.apk> <未簽名.apk> <別名>
注意: 在給apk簽名的時候的命令是-signedjar
-
-
進行zipAlign優化
zipalign -f 4 my_signed.apk my_signed_optimizated.apk
-
安裝到手機
adb install -r my_signed_optimizated.apk