複製鏈接
請複製以下鏈接發送給好友

APK

鎖定
APK(全稱:Android application package,Android應用程序)是Android操作系統使用的一種應用程序包文件格式,用於分發和安裝移動應用及中間件。一個Android應用程序的代碼想要在Android設備上運行,必須先進行編譯,然後被打包成為一個被Android系統所能識別的文件才可以被運行,而這種能被Android系統識別並運行的文件格式便是“APK”。 一個APK文件內包含被編譯的代碼文件(.dex 文件),文件資源(resources), 原生資源文件(assets),證書(certificates),和清單文件(manifest file) [1] 
APK 文件基於 ZIP 文件格式,它與JAR文件的構造方式相似,互聯網媒體類型是:application/vnd.android.package-archive。
中文名
Android應用程序包
外文名
AndroidPackage
分    類
文件格式
特    點
能被Android系統識別並運行
縮    寫
apk
用    於
分發和安裝移動應用中間件

APK介紹

APK是Android application package的縮寫,即Android安裝包(apk)。APK是類似SymbianSis或Sisx的文件格式。通過將APK文件直接傳到Android模擬器Android手機中執行即可安裝。 [2] 
apk文件和sis一樣,把androidsdk編譯的工程打包成一個安裝程序文件,格式為apk。 APK文件其實是zip格式,但後綴名被修改為apk,通過UnZip解壓後,可以看到Dex文件,Dex是DalvikVM executes的簡稱,即Android Dalvik執行程序,並非Java ME的字節碼而是Dalvik字節碼。Android在運行一個程序時首先需要UnZip,然後類似Symbian那樣直接, [2]  但不同於Windows mobile中的PE文件,程序的保密性和可靠性不是很高,通過dexdump命令可以反編譯它,但這種架構符合發展規律,微軟的WindowsGadgets(WPF)也採用了這種架構方式。在Android平台中,dalvikvm的執行文件被打包為apk格式,最終運行時加載器會先解壓,然後獲取編譯後的androidmanifest.xml文件中的permission聲明對安全訪問的限制,要知道仍然存在很多安全限制,但將apk文件傳到/system/app文件夾下會發現執行是不受限制的。也許我們平時安裝都不會選用這個文件夾,但在androidrom中,系統的apk文件默認會放入這個文件夾,它們擁有root權限 [2] 

APK結構

一個APK文件通常包含以下文件: [3] 
  • META-INF文件夾:Jar文件中常見
    • MANIFEST.MF:清單文件(Manifest file) [3] 
    • CERT.RSA: 保存着該應用程序的證書和授權信息。 [3] 
    • CERT.SF: 保存着SHA-1信息資源列表,比如: [3]  Signature-Version: 1.0Created-By: 1.0(Android)SHA1-Digest-Manifest : wxqnEAI0UA5nO5QJ8CGMwjkGGWE =... Name: res/ layout/ exchange_ component _back _bottom. xmlSHA1- Digest: eACjMjESj7Zkf0cBFTZ0nqWrt7w = ...Name:res/drawable-hdpi/icon.pngSHA1-Digest: DGEqylP8W0n0iV/ZzBx3MW0WGCA=
  • res: APK所需要的資源文件夾 [3] 
  • AndroidManifest.xml: 一個傳統的Android清單文件,用於描述該應用程序的名字、版本號、所需權限、註冊的服務、鏈接的其他應用程序。該文件使用XML文件格式,可以編譯為二進制的XML,使用的工具為AXMLPrinter2或apktool [3] 
  • classes.dex: classes文件通過DEX編譯後的文件格式,用於在Dalvik虛擬機上運行的主要代碼部分。 [3] 
  • resources.arsc:程序的語言文件,可以透過這軟件用(AndroidResEdit等工具)來進行翻譯,也可以用ApkTool等工具反編譯後再開始進行軟件修改。 [3] 

APK文件格式

APK格式定義

在Android平台中,dalvikvm的執行文件被打包為apk格式,最終運行時加載器會解壓,然後獲取編譯後的androidmanifest.xml文件中的permission分支相關的安全訪問,但仍然存在很多安全限制,如果你將apk文件傳到/system/app文件夾下,會發現執行是不受限制的。安裝的文件可能不是這個文件夾,而在androidrom中,系統的apk文件默認會放入這個文件夾,它們擁有着root權限。 [4] 

APK開發環境

Android是一個基於Java的開發環境,Google也在API文檔的書寫和樣例的提供上做了很出色的工作。 [4] 
獲取SDK
下載並安裝android的SDK[軟件開發套件],這套SDK主要包括有核心庫文件,一個模擬器,開發工具和一些示範的樣例文件。推薦使用Eclipse 和androideclipse 擴展。如果只是使用android,Eclipse IDE就已經足夠了,但如果是第一次開發Java應用,建議下載完整的Java SE 開發工具 (JDK) 因為它包括簽發應用程序所需要的工具。 [4] 
應用架構
android應用架構很關鍵,如果不學習它,設計出來的遊戲將是一種很難修復bug的產品。 需要了解應用程序、活動、Intents以及它們是如何互相聯繫交互的,Google在這兒提供了良好的信息架構。真正重要的是,要理解為什麼在設計的遊戲中,需要不止一個的活動進程,以及如何設計一個用户體驗良好的遊戲。這些都應當配合到應用的生命週期中。 [4] 
應用的生命週期
應用的生命週期是由Android OS操作系統進行管理的,活動進程都將做為系統命令進行創建,正確處理這些事件對一個應用程序來説是極為重要的,因為終端用户不會知道什麼是正確的。最好在開始設計遊戲之前搞明白這些,因為這有助於節省調試時間以及避免代價高昂的重新設計。對大多數應用而言,默認設置即可開始工作,但對遊戲而言,可能需要調整單態實例的信號為打開。在默認情況下,Android會新建一個活動實例進程,因為它認為這是比較合適的,而遊戲,可能只希望有一個活動的實例進程,這有一點兒影響,它需要了解一些系統狀態的管理。 [4] 

APKapk反編譯

apk反編譯就是通過使用apk編譯工具,將apk文件中的源文件和資源反編譯出來,得到的源文件和資源文件可以進行處理後再進行編譯,以達到個性化定製、漢化apk等目的。 [5] 

APK反編譯工具

1.最典型的apk編譯工具的核心是apktool,但是因為操作需要調用cmd命令,所以出現了很多具有可視化界面的各種編譯工具,像easyapk、apkdb、doapk。 [5] 
2.dex2jar.jar,將apk中的classes.dex轉化成Jar文件,再通過jd-gui工具反編譯jar文件。 [5] 

APK反編譯方法

以apkdb編譯apk文件為例,只需要在安裝apkdb後,直接右擊反編譯就可以將apk文件反編譯出來。 [5] 
1.使用原生apktool工具,需要將apktool的兩個文件釋放到window目錄下,在cmd中使用 apktool d apk文件名命令來編譯apk文件,此時命令行的執行目錄與apk文件所在目錄必須一致。 [5] 
2.首先將apk文件,將後綴改為zip,解壓,得到其中的classes.dex,它就是 java文件編譯再通過dx工具打包而成的;將classes.dex複製到dex2jar.bat所在目錄。在命令行下定位到dex2jar.bat所在目錄,運行 dex2jar.bat classes.dex。 [5] 

APKAPK優化

Android SDK中包含了一個用於優化APK的新工具zipalign,它能夠對打包的應用程序進行優化。通過zipalign優化後的應用程序可使得Android與應用程序間的交互更加有效率。 [6] 
使用zipalign優化程序的步驟如下。在cmd中輸入如下命令: [6] 
zipalign -v 4c:\ShowlmageProject.apkc:\ShowlmageProject_aligned.apk
命令行解釋如下: [6] 
  • -f表示可以覆蓋同名壓縮後的輸出文件; [6] 
  • -v代表詳細輸出; [6] 
  • 4代表對齊為4個字節,還可以用-c參數檢查對齊; [6] 
  • c:\\ShowlmageProject_aligned.apk表示優化後的文件及其存儲位置。 [6] 
zipalign優化的最根本目的是幫助操作系統更高效率地根據請求索引資源,Resource Handling Code統一將Data Structure Alignment(數據結構對齊標準:DSA)限定為4-byte Boundaries。如果不採取對齊的標準,處理器無法準確和快速地在內存地址中定位相關資源。目前的系統中使用Fallback Mechanism機制處理那些沒有應用DSA標準的應用程序,這大大方便了普通開發者,使其無需關注繁瑣的內存操作問題。但是相反,這種處理機制將給普通用户帶來一定的麻煩,不但影響程序運行的效率,而且使系統的整體執行效率下降,使程序佔用大量不必要的內存資源,甚至消耗一定的電池資源。 [6] 
注意:zipalign操作必須且僅在標記apk文件附有個人加密鑰之後。如果在標記之前進行zipalign操作,標記過程將會干擾整理。 [6] 
參考資料
  • 1.    樊如霞, 房鼎益, 湯戰勇, et al. 一種代碼碎片化的Android應用程序防二次打包方法[J]. 小型微型計算機系統, 2016, 37(9):1969-1974.
  • 2.    張元亮.ANDROID開發應用實戰詳解:中國鐵道出版社,2011.02:第518頁
  • 3.    李勝廣, 譚林, 周千里. 安卓APK代碼安全保護技術研究[J]. 警察技術, 2017(1):55-58.
  • 4.    傳智播客高教產品研發部.ANDROID項目實戰:手機安全衞士:中國鐵道出版社,2015.08:第11頁
  • 5.    原始人工作室.煮酒論Android:北方工業大學出版社,2014.08:第359頁
  • 6.    李維勇.Android項目開發實訓教程:北京航空航天大學出版社,2013.06:第120頁