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

来源:http://www.cnblogs.com/sjm19910902/archive/2017/02/19/6416022.html
-Advertisement-
Play Games

流程圖: 我們重點關心的是(1)這個過程的輸入是什麼?(2)這個過程的輸出是什麼?(3)這個過程使用了什麼工具?至於使用什麼參數,可以自己去看對應命令的幫助文件,或者在網上搜索,這不是本文的重點。 aapt-> aidl -> javac-> dx(dex)-> apkbuilder-> jarsi ...


流程圖:     我們重點關心的是(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這們的強類型語言也是可以的。    
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 寫項目的時候就遇到了這個尷尬的問題,有的是需要進行網路請求的,或者有的手機有點卡頓,用戶就會連續點擊,經常出現的就是接連Push兩個同樣的控制器,當然還有重覆調用網路請求的方法,等等等等。。。。 比較笨的方法就是在每個點擊的地方把用戶交互給關掉,等到功能實現後之後再將這個按鈕的用戶交互恢復。 當然了 ...
  • 很少用DatePicker,項目需要用到DatePicker,再用時發現跟以前有些變化,重新簡單梳理一下DatePicker的用法。 先上效果圖: 首先是xml文件的用法: 以前是用android:spinnersShown和android:calendarViewShown這兩個屬性來控制Date ...
  • 現在做的項目遇到一個問題,設計給過來的圖片只有一種狀態,但是實現的需求是要求有兩個狀態,另一種選狀態為圖片背景加邊框。如圖: 剛開使用使用ImageView ,ImageViewButton 效果不是很明顯; 後來發現 layer-list 能很好的實現這個效果,先分別建 正常模式與選中模式的xml ...
  • 1.概述 在之前的博文中簡單介紹過如何實現fragment之間的信息交互:《Android中Fragment與Activity之間的交互(兩種實現方式)》,今天繼續給大家介紹一種可以實現此效果的另外一種方式EventBus。(相比於handler,介面回調,bundle傳參,這個簡單好用到哭) Ev ...
  • 轉自http://blog.csdn.net/wangyanchang21/article/details/50932191 在很多時候都會遇到錯誤, 還會帶有一些 Error Code , 比如在各種網路請求, 文件操作, cookie 錯誤等各種錯誤的代碼和錯誤代碼對應的含義. 以下目錄為 SO ...
  • 註意:刪除的時候要謹慎!別什麼圖都刪了,看看對項目有沒有作用。這個插件有時也會有一定的誤差。 具體操作步驟: 1.去github上下載LSUnusedResources(下載地址:https://github.com/tinymind/LSUnusedResources/) 2.運行LSUnused ...
  • 本篇博客就來介紹一下iOS App中主題切換的常規做法,當然本篇博客中只是提到了一種主題切換的方法,當然還有其他方法,在此就不做過多贅述了。本篇博客中所涉及的Demo完全使用Swift3.0編寫完成,並使用iOS的NSNotification來觸發主題切換的動作。本篇博客我們先對我們的主題系統進行設 ...
  • Core Location是iOS SDK中一個提供設備位置的框架。可以使用三種技術來獲取位置:GPS、蜂窩或WiFi。在這些技術中,GPS最為精準,如果有GPS硬體,Core Location將優先使用它。如果設備沒有GPS硬體(如WiFi iPad)或使用GPS獲取當前位置時失敗,Core Lo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...