Android應用程序(APK)的編譯打包過程


流程圖:
 
 
我們重點關心的是 (1)這個過程的輸入是什么?(2)這個過程的輸出是什么?(3)這個過程使用了什么工具? 至於使用什么參數,可以自己去看對應命令的幫助文件,或者在網上搜索,這不是本文的重點。
aapt->
aidl -> javac-> dx(dex)-> apkbuilder-> jarsigner-> zipalign
 
步驟中提到的工具如下表:
名稱 功能介紹 在操作系統中的路徑
aapt Android資源打包工具 ${ANDROID_SDK_HOME}/platform-tools/appt
aidl Android接口描述語言轉化為.java文件的工具 ${ANDROID_SDK_HOME}/platform-tools/aidl
javac Java Compiler ${JDK_HOME}/javac或/usr/bin/javac
dex 轉化.class文件為Davik VM能識別的.dex文件 ${ANDROID_SDK_HOME}/platform-tools/dx
apkbuilder 生成apk包 ${ANDROID_SDK_HOME}/tools/opkbuilder
jarsigner .jar文件的簽名工具 ${JDK_HOME}/jarsigner或/usr/bin/jarsigner
zipalign 字節碼對齊工具 ${ANDROID_SDK_HOME}/tools/zipalign
第一步:打包資源文件,生成R.java文件
編譯R.java類需要用到AndroidSDK提供的aapt工具,aapt參數眾多,以下是主要參數:
  1. -d  one or more device assets to include, separated by commas  
  2.  -f  force overwrite of existing files  
  3.  -g  specify a pixel tolerance to force images to grayscale, default 0  
  4.  -j  specify a jar or zip file containing classes to include  
  5.  -k  junk path of file(s) added  
  6.  -m  make package directories under location specified by -J  
  7.  -u  update existing packages (add new, replace older, remove deleted files)  
  8.  -v  verbose output  
  9.  -x  create extending (non-application) resource IDs  
  10.  -z  require localization of resource attributes marked with  
  11.      localization="suggested"  
  12.  -A  additional directory in which to find raw asset files  
  13.  -G  A file to output proguard options into.  
  14.  -F  specify the apk file to output  
  15.  -I  add an existing package to base include set  
  16.  -J  specify where to output R.java resource constant definitions  
  17.  -M  specify full path to AndroidManifest.xml to include in zip  
  18.  -P  specify where to output public resource definitions  
  19.  -S  directory in which to find resources.  Multiple directories will be scann  
 
aapt編譯R.java文件具體如下:
需要進入應用程序目錄,新建一個gen目錄,沒有gen目錄,命令將會出現找不到文件的錯誤!
命令成功執行后將會在gen目錄下生成成包結構的目錄樹,及R.java文件!
 
列子:
 
 
 
第二步:處理AIDL文件,生成對應的.java文件(當然,有很多工程沒有用到AIDL,那這個過程就可以省了)
 
將.aidl文件生成.java文件需要用到AndroidSDK自帶的aidl工具,此工具具體參數如下:
  1. -I<DIR>    search path for import statements.  
  2. -d<FILE>   generate dependency file.  
  3. -p<FILE>   file created by --preprocess to import.  
  4. -o<FOLDER> base output folder for generated files.  
  5. -b         fail when trying to compile a parcelable.  
  6. 值得注意的是:這個工具的參數與參數值之間不能有空格,Google也有對工資不滿意的工程師! 
例子:
 
 
 
第三步:編譯Java文件,生成對應的.class文件
 
javac命令用法如下:
  1. 其中,可能的選項包括:  
  2.   -g                         生成所有調試信息  
  3.   -g:none                    不生成任何調試信息  
  4.   -g:{lines,vars,source}     只生成某些調試信息  
  5.   -nowarn                    不生成任何警告  
  6.   -verbose                   輸出有關編譯器正在執行的操作的消息  
  7.   -deprecation               輸出使用已過時的 API 的源位置  
  8.   -classpath <路徑>            指定查找用戶類文件和注釋處理程序的位置  
  9.   -cp <路徑>                   指定查找用戶類文件和注釋處理程序的位置  
  10.   -sourcepath <路徑>           指定查找輸入源文件的位置  
  11.   -bootclasspath <路徑>        覆蓋引導類文件的位置  
  12.   -extdirs <目錄>              覆蓋安裝的擴展目錄的位置  
  13.   -endorseddirs <目錄>         覆蓋簽名的標准路徑的位置  
  14.   -proc:{none,only}          控制是否執行注釋處理和/或編譯。  
  15.   -processor <class1>[,<class2>,<class3>...]要運行的注釋處理程序的名稱;繞過默認的搜索進程  
  16.   -processorpath <路徑>        指定查找注釋處理程序的位置  
  17.   -d <目錄>                    指定存放生成的類文件的位置  
  18.   -s <目錄>                    指定存放生成的源文件的位置  
  19.   -implicit:{none,class}     指定是否為隱式引用文件生成類文件  
  20.   -encoding <編碼>             指定源文件使用的字符編碼  
  21.   -source <版本>               提供與指定版本的源兼容性  
  22.   -target <版本>               生成特定 VM 版本的類文件  
  23.   -version                   版本信息  
  24.   -help                      輸出標准選項的提要  
  25.   -Akey[=value]              傳遞給注釋處理程序的選項  
  26.   -X                         輸出非標准選項的提要  
  27.   -J<標志>                     直接將 <標志> 傳遞給運行時系統  
 
例子:
 
javac -encoding utf-8 -target 1.5 -bootclasspath E:\Androiddev\android-sdk-windows2.2\platforms\android-3\android.jar -d bin src\com\byread\reader\*.java gen\com\byread\reader\R.java 
 
 
第四步:把.class文件轉化成Davik VM支持的.dex文件
 
將工程bin目錄下的class文件編譯成classes.dex,Android虛擬機只能執行dex文件!
 
例子:
 
 
第五步:打包生成未簽名的.apk文件
 
【輸入】打包后的資源文件、打包后類文件(.dex文件)、libs文件(包括.so文件,當然很多工程都沒有這樣的文件,如果你不使用C/C++開發的話)
【輸出】未簽名的.apk文件
【工具】apkbuilder工具
apkbuilder工具用法如下:
  1. -v      Verbose.  
  2. -d      Debug Mode: Includes debug files in the APK file.  
  3. -u      Creates an unsigned package.  
  4. -storetype Forces the KeyStore type. If ommited the default is used.  
  5.    
  6. -z      Followed by the path to a zip archive.  
  7.         Adds the content of the application package.  
  8.    
  9. -f      Followed by the path to a file.  
  10.         Adds the file to the application package.  
  11.    
  12. -rf     Followed by the path to a source folder.  
  13.         Adds the java resources found in that folder to the application  
  14.         package, while keeping their path relative to the source folder.  
  15.    
  16. -rj     Followed by the path to a jar file or a folder containing  
  17.         jar files.  
  18.         Adds the java resources found in the jar file(s) to the application  
  19.         package.  
  20.    
  21. -nf     Followed by the root folder containing native libraries to  
  22.         include in the application package.<span style="color: rgb(0, 0, 255); font-family: 楷體; line-height: 20px;font-size:18px; ">I:最后一步,通過jarsigner命令用證書文件對未簽名的APK文件進行簽名</span>  
 
列子:
apkbuilder  ${output.apk.file} -u -z  ${packagedresource.file} -f  ${dex.file}  -rf  ${source.dir}  -rj  ${libraries.dir} 
 
第六步:對未簽名.apk文件進行簽名
【輸入】未簽名的.apk文件
【輸出】簽名的.apk文件
【工具】jarsigner
 
  1. 用法:jarsigner [選項] jar 文件別名  
  2.        jarsigner -verify [選項] jar 文件  
  3.   
  4. [-keystore <url>]           密鑰庫位置  
  5.   
  6. [-storepass <口令>]         用於密鑰庫完整性的口令  
  7.   
  8. [-storetype <類型>]         密鑰庫類型  
  9.   
  10. [-keypass <口令>]           專用密鑰的口令(如果不同)  
  11.   
  12. [-sigfile <文件>]           .SF/.DSA 文件的名稱  
  13.   
  14. [-signedjar <文件>]         已簽名的 JAR 文件的名稱  
  15.   
  16. [-digestalg <算法>]    摘要算法的名稱  
  17.   
  18. [-sigalg <算法>]       簽名算法的名稱  
  19.   
  20. [-verify]                   驗證已簽名的 JAR 文件  
  21.   
  22. [-verbose]                  簽名/驗證時輸出詳細信息  
  23.   
  24. [-certs]                    輸出詳細信息和驗證時顯示證書  
  25.   
  26. [-tsa <url>]                時間戳機構的位置  
  27.   
  28. [-tsacert <別名>]           時間戳機構的公共密鑰證書  
  29.   
  30. [-altsigner <類>]           替代的簽名機制的類名  
  31.   
  32. [-altsignerpath <路徑列表>] 替代的簽名機制的位置  
  33.   
  34. [-internalsf]               在簽名塊內包含 .SF 文件  
  35.   
  36. [-sectionsonly]             不計算整個清單的散列  
  37.   
  38. [-protected]                密鑰庫已保護驗證路徑  
  39.   
  40. [-providerName <名稱>]      提供者名稱  
  41.   
  42. [-providerClass <類>        加密服務提供者的名稱  
  43. [-providerArg <參數>]] ... 主類文件和構造函數參數  
 
第七步:對簽名后的.apk文件進行對齊處理(不進行對齊處理是不能發布到Google Market的)
 
 
【輸入】簽名后的.apk文件
【輸出】對齊后的.apk文件
【工具】zipalign工具
 
 
 
知道了這些細節之后,我們就可以實現很多我們想實現東西了,比如: 自動化 ,我們可以使用某種腳本,像Windows下的批處理,linux下的Bash,Java下的Ant,Python、Perl這樣的腳本語言,甚至直接用Java、.net這們的強類型語言也是可以的。
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM