apk

apk

APK(全稱:Android application package,Android應用程序包)是Android操作系統使用的一種應用程序包文件格式,用於分發和安裝移動應用及中間件。一個Android應用程序的代碼想要在Android設備上運行,必須先進行編譯,然後被打包成為一個被Android系統所能識別的文件才可以被運行,而這種能被Android系統識別並運行的文件格式便是“APK”。一個APK文件內包含被編譯的代碼文件(.dex 文件),文件資源(resources),原生資源文件(assets),證書(certificates),和清單文件(manifest file)。

APK 文件基於Zip 文件格式,它與JAR文件的構造方式相似,網際網路媒體類型是:application/vnd.android.package-archive。

文件格式


格式定義

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

文件結構


1. META-INF\(註:Jar文件中常可以看到);
2. res\(註:存放資源文件的目錄);
3. AndroidManifest.xml(註:程序全局配置文件);
4. classes.dex(註:Dalvik位元組碼);
5. resources.arsc(註:編譯后的二進位資源文件)。

開發環境

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

apk反編譯


apk反編譯就是通過使用apk編譯工具,將apk文件中的源文件和資源反編譯出來,得到的源文件和資源文件可以進行處理后再進行編譯,以達到個性化定製、漢化apk等目的。
apk反編譯工具
1.最典型的apk編譯工具的核心是apktool,但是因為操作需要調用cmd命令,所以出現了很多具有可視化界面的各種編譯工具,像easyapk、apkdb、doapk。
2.dex2jar.jar,將apk中的classes.dex轉化成Jar文件,再通過jd-gui工具反編譯jar文件。
apk編譯方法
使用apkdb編譯apk文件,只需要在安裝apkdb后,直接右擊反編譯就可以將apk文件反編譯出來。
1.使用原生apktool工具,需要將apktool的兩個文件釋放到window目錄下,在cmd中使用 apktool d apk文件名命令來編譯apk文件,此時命令行的執行目錄與apk文件所在目錄必須一致。
2.首先將apk文件,將後綴改為zip,解壓,得到其中的classes.dex,它就是java文件編譯再通過dx工具打包而成的;將classes.dex複製到dex2jar.bat所在目錄。在命令行下定位到dex2jar.bat所在目錄,運行 dex2jar.bat classes.dex。
Android SDK中包含了一個用於優化APK的新工具zipalign。它提高了優化后的Applications與Android系統的交互效率(俗話:“要致富先修路”,Android小組重新為Applications與Android系統之間搭建了一條高速公路),從而可以使整個系統的運行速度有了較大的提升。Android小組強烈建議開發者在發布新Apps之前使用zipalign優化工具,而且對於已經發布但不受限於系統版本的Apps,建議用優化后的APK替換現有的版本。
在下面的內容中將從三個方面介紹zipalign:
1.zipalign如何優化
2.如何使用zipalign
3.使用zipalign的理由
根據官方文檔的描述,Android系統中Application的數據都保存在它的APK文件中,同時可以被多個進程訪問,安裝的過程包括如下幾個步驟:
1.Installer通過每個apk的manifest文件獲取與當前應用程序相關聯的permissions信息。
2.Home application讀取當前APK的Name和Icon等信息。
3.System server將讀取一些與Application運行相關信息,例如:獲取和處理Application的notifications請求等。
4.最後,APK所包含的內容不僅限於當前Application所使用,而且可以被其它的Application調用,提高系統資源的可復用性。
zipalign優化的最根本目的,是幫助操作系統更高效率的根據請求索引資源,將resource-handling code統一將Data structure alignment(數據結構對齊標準:DSA)限定為4-byte boundaries。如果第一次接觸有關Data structurealignment的內容,強烈建議搜索更多與其相關的內容,來充分理解這樣做的最終目的,這也是理解zipalign工作原理的關鍵。如果不採取對齊的標準,處理器無法準確和快速的在內存地址中定位相關資源。
目前的系統中使用fallbackmechanism機制處理那些沒有應用DSA標準的應用程序,這的確大大的方便了普通開發者,無需關注繁瑣的內存操作問題。但是相反,對於這樣的應用程序將給普通用戶帶來一定的麻煩,不但影響程序的運行的效率,而且使系統的整體執行效率下降和佔用大量不必要的內存資源,甚至消耗一定的電池資源(battery life)。
在Android SDK中提供了三種應用Align操作的方法:
1.使用ADT:
從ADT 0.9.3版本開始,可以通過export wizard自動對發布的applicationpackages執行align操作。
設置方法:滑鼠右鍵點擊Project,然後選擇“Android Tools” > “ExportSigned Application Package…”。或者可以直接在AndroidManifest.xml中設置。
2.使用Ant:
對於API Level 大於等於4的Application Packages可以直接通過Ant build script來Align優化。但對於API Level小於4的情況,只能採取手動Align優化。
默認下應用Ant build script運行Debug packages(API Level >= 4)時,將自動執行Align優化。
針對Release packages。當使用Ant build script執行Align優化時,首先需要擁有足夠的信息來Sign packages。當完成Signing之後,才能執行Align優化。通過官方文檔了解如何Sign Packages。
3.手動執行Align優化:
利用tools文件夾下的zipalign工具。
首先調出cmd命令行,然後執行:zipalign -v 4 source.apk androidres.apk。
這個方法不受API Level的限制,可以對任何版本的APK執行Align優化。
同時可以利用zipalign工具檢查當前APK是否已經執行過Align優化。
命令:zipalign -c -v 4 androidres.apk
再一次提醒開發者,立刻應用zipalign工具強制優化已經發布的application packages,並讓你的用戶使用最新的版本。

介紹


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

apk優化


編輯
Android SDK中包含了一個用於優化APK的新工具zipalign,它能夠對打包的應用程序進行優化。通過zipalign優化后的應用程序可使得Android與應用程序間的交互更加有效率。
使用zipalign優化程序的步驟如下。在cmd中輸入如下命令:
zipalign -v 4c:\ShowlmageProject.apkc:\ShowlmageProject_aligned.apk
命令行解釋如下:
● -f表示可以覆蓋同名壓縮后的輸出文件; 
● -v代表詳細輸出; 
● 4代表對齊為4個位元組,還可以用-c參數檢查對齊; 
● c:\\ShowlmageProject_aligned.apk表示優化后的文件及其存儲位置。 
zipalign優化的最根本目的是幫助操作系統更高效率地根據請求索引資源,Resource Handling Code統一將Data Structure Alignment(數據結構對齊標準:DSA)限定為4-byte Boundaries。如果不採取對齊的標準,處理器無法準確和快速地在內存地址中定位相關資源。目前的系統中使用Fallback Mechanism機制處理那些沒有應用DSA標準的應用程序,這大大方便了普通開發者,使其無需關注繁瑣的內存操作問題。但是相反,這種處理機制將給普通用戶帶來一定的麻煩,不但影響程序運行的效率,而且使系統的整體執行效率下降,使程序佔用大量不必要的內存資源,甚至消耗一定的電池資源。
注意:zipalign操作必須且僅在標記apk文件附有個人加密鑰之後。如果在標記之前進行zipalign操作,標記過程將會幹擾整理。