-
APK
鎖定
APK(全稱:Android application package,Android應用程序包)是Android操作系統使用的一種應用程序包文件格式,用於分發和安裝移動應用及中間件。一個Android應用程序的代碼想要在Android設備上運行,必須先進行編譯,然後被打包成為一個被Android系統所能識別的文件才可以被運行,而這種能被Android系統識別並運行的文件格式便是“APK”。 一個APK文件內包含被編譯的代碼文件(.dex 文件),文件資源(resources), 原生資源文件(assets),證書(certificates),和清單文件(manifest file)
[1]
。
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結構
- META-INF文件夾:Jar文件中常見
- 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=
- AndroidManifest.xml: 一個傳統的Android清單文件,用於描述該應用程序的名字、版本號、所需權限、註冊的服務、鏈接的其他應用程序。該文件使用XML文件格式,可以編譯為二進制的XML,使用的工具為AXMLPrinter2或apktool [3] 。
APK文件格式
APK格式定義
在Android平台中,dalvikvm的執行文件被打包為apk格式,最終運行時加載器會解壓,然後獲取編譯後的androidmanifest.xml文件中的permission分支相關的安全訪問,但仍然存在很多安全限制,如果你將apk文件傳到/system/app文件夾下,會發現執行是不受限制的。安裝的文件可能不是這個文件夾,而在androidrom中,系統的apk文件默認會放入這個文件夾,它們擁有着root權限。
[4]
APK開發環境
獲取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反編譯方法
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 -v 4c:\ShowlmageProject.apkc:\ShowlmageProject_aligned.apk
zipalign優化的最根本目的是幫助操作系統更高效率地根據請求索引資源,Resource Handling Code統一將Data Structure Alignment(數據結構對齊標準:DSA)限定為4-byte Boundaries。如果不採取對齊的標準,處理器無法準確和快速地在內存地址中定位相關資源。目前的系統中使用Fallback Mechanism機制處理那些沒有應用DSA標準的應用程序,這大大方便了普通開發者,使其無需關注繁瑣的內存操作問題。但是相反,這種處理機制將給普通用户帶來一定的麻煩,不但影響程序運行的效率,而且使系統的整體執行效率下降,使程序佔用大量不必要的內存資源,甚至消耗一定的電池資源。
[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頁