APK(全稱:Android application package,Android應(yīng)用程序包)是Android操作系統(tǒng)使用的一種應(yīng)用程序包文件格式,用于分發(fā)和安裝移動應(yīng)用及中間件。一個Android應(yīng)用程序的代碼想要在Android設(shè)備上運行,必須先進行編譯,然后被打包成為一個被Android系統(tǒng)所能識別的文件才可以被運行,而這種能被Android系統(tǒng)識別并運行的文件格式便是“APK”。 一個APK文件內(nèi)包含被編譯的代碼文件(.dex 文件),文件資源(resources), 原生資源文件(assets),證書(certificates),和清單文件(manifest file)? 。
APK 文件基于 ZIP 文件格式,它與JAR文件的構(gòu)造方式相似,互聯(lián)網(wǎng)媒體類型是:application/vnd.android.package-archive。
文件格式
格式定義
在Android平臺中,dalvik vm的執(zhí)行文件被打包為apk格式,最終運行時加載器會解壓,然后獲取編譯后的androidmanifest.xml文件中的permission分支相關(guān)的安全訪問,但仍然存在很多安全限制,如果你將apk文件傳到/system/app文件夾下,會發(fā)現(xiàn)執(zhí)行是不受限制的。安裝的文件可能不是這個文件夾,而在androidrom中,系統(tǒng)的apk文件默認(rèn)會放入這個文件夾,它們擁有著root權(quán)限。
文件結(jié)構(gòu)
1. META-INF\(注:Jar文件中常可以看到);
2. res\(注:存放資源文件的目錄);
3. AndroidManifest.XML(注:程序全局配置文件);
4. classes.dex(注:Dalvik字節(jié)碼);
5. resources.arsc(注:編譯后的二進制資源文件)。
開發(fā)環(huán)境
Android是一個基于Java的開發(fā)環(huán)境,它是一種與廣被接受的 Java極為類似,而且也比C++容易得多的開發(fā)語言,這是一種規(guī)范的移動開發(fā)環(huán)境。谷歌也在API文檔的書寫和樣例的提供上做了很出色的工作。
獲取sdk
下載并安裝android的SDK[軟件開發(fā)套件],這套SDK主要包括有核心庫文件,一個仿真器,開發(fā)工具和一些示范的樣例文件。推薦使用Eclipse 和androideclipse 擴展。如果只是使用android,Eclipse IDE就已經(jīng)足夠了,但如果是第一次開發(fā)Java應(yīng)用,建議下載完整的Java SE 開發(fā)工具 (JDK) 因為它包括簽發(fā)應(yīng)用程序所需要的工具。
應(yīng)用架構(gòu)
android應(yīng)用架構(gòu)很關(guān)鍵,如果不學(xué)習(xí)它,設(shè)計出來的游戲?qū)⑹且环N很難修復(fù)bug的產(chǎn)品。需要了解應(yīng)用程序、活動、Intents以及它們是如何互相聯(lián)系交互的,谷歌在這兒提供了良好的信息架構(gòu)。真正重要的是,要理解為什么在設(shè)計的游戲中,需要不止一個的活動進程,以及如何設(shè)計一個用戶體驗良好的游戲。這些都應(yīng)當(dāng)配合到應(yīng)用的生命周期中。
應(yīng)用的生命周期
應(yīng)用的生命周期是由Android操作系統(tǒng)進行管理的,活動進程都將做為系統(tǒng)命令進行創(chuàng)建,正確處理這些事件對一個應(yīng)用程序來說是極為重要的,因為終端用戶不會知道什么是正確的。最好在開始設(shè)計游戲之前搞明白這些,因為這有助于節(jié)省調(diào)試時間以及避免代價高昂的重新設(shè)計。對大多數(shù)應(yīng)用而言,默認(rèn)設(shè)置即可開始工作,但對游戲而言,可能需要調(diào)整單態(tài)實例的信號為打開。在默認(rèn)情況下,Android會新建一個活動實例進程,因為它認(rèn)為這是比較合適的,而游戲,可能只希望有一個活動的實例進程,這有一點兒影響,它需要了解一些系統(tǒng)狀態(tài)的管理。
apk反編譯
apk反編譯就是通過使用apk編譯工具,將apk文件中的源文件和資源反編譯出來,得到的源文件和資源文件可以進行處理后再進行編譯,以達到個性化定制、漢化apk等目的。
apk反編譯工具
1.最典型的apk編譯工具的核心是apktool,但是因為操作需要調(diào)用cmd命令,所以出現(xiàn)了很多具有可視化界面的各種編譯工具,像easyapk、apkdb、doapk。
2.dex2jar.jar,將apk中的classes.dex轉(zhuǎn)化成Jar文件,再通過jd-gui工具反編譯jar文件。
apk編譯方法
使用apkdb編譯apk文件,只需要在安裝apkdb后,直接右擊反編譯就可以將apk文件反編譯出來。
1.使用原生apktool工具,需要將apktool的兩個文件釋放到window目錄下,在cmd中使用 apktool d apk文件名命令來編譯apk文件,此時命令行的執(zhí)行目錄與apk文件所在目錄必須一致。
2.首先將apk文件,將后綴改為zip,解壓,得到其中的classes.dex,它就是java文件編譯再通過dx工具打包而成的;將classes.dex復(fù)制到dex2jar.bat所在目錄。在命令行下定位到dex2jar.bat所在目錄,運行 dex2jar.bat classes.dex。
Android SDK中包含了一個用于優(yōu)化APK的新工具zipalign。它提高了優(yōu)化后的Applications與Android系統(tǒng)的交互效率(俗話:“要致富先修路”,Android小組重新為Applications與Android系統(tǒng)之間搭建了一條高速公路),從而可以使整個系統(tǒng)的運行速度有了較大的提升。Android小組強烈建議開發(fā)者在發(fā)布新Apps之前使用zipalign優(yōu)化工具,而且對于已經(jīng)發(fā)布但不受限于系統(tǒng)版本的Apps,建議用優(yōu)化后的APK替換現(xiàn)有的版本。
在下面的內(nèi)容中將從三個方面介紹zipalign:
1.zipalign如何優(yōu)化
2.如何使用zipalign
3.使用zipalign的理由
根據(jù)官方文檔的描述,Android系統(tǒng)中Application的數(shù)據(jù)都保存在它的APK文件中,同時可以被多個進程訪問,安裝的過程包括如下幾個步驟:
1.安裝程序通過每個apk的manifest文件獲取與當(dāng)前應(yīng)用程序相關(guān)聯(lián)的permissions信息。
2.Home application讀取當(dāng)前APK的Name和ICON等信息。
3.System server將讀取一些與Application運行相關(guān)信息,例如:獲取和處理Application的notifications請求等。
4.最后,APK所包含的內(nèi)容不僅限于當(dāng)前Application所使用,而且可以被其它的Application調(diào)用,提高系統(tǒng)資源的可復(fù)用性。
zipalign優(yōu)化的最根本目的,是幫助操作系統(tǒng)更高效率的根據(jù)請求索引資源,將resource-handling code統(tǒng)一將Data structure alignment(數(shù)據(jù)結(jié)構(gòu)對齊標(biāo)準(zhǔn):DSA)限定為4-byte boundaries。如果第一次接觸有關(guān)Data structurealignment的內(nèi)容,強烈建議搜索更多與其相關(guān)的內(nèi)容,來充分理解這樣做的最終目的,這也是理解zipalign工作原理的關(guān)鍵。如果不采取對齊的標(biāo)準(zhǔn),處理器無法準(zhǔn)確和快速的在內(nèi)存地址中定位相關(guān)資源。
目前的系統(tǒng)中使用fallbackmechanism機制處理那些沒有應(yīng)用DSA標(biāo)準(zhǔn)的應(yīng)用程序,這的確大大的方便了普通開發(fā)者,無需關(guān)注繁瑣的內(nèi)存操作問題。但是相反,對于這樣的應(yīng)用程序?qū)⒔o普通用戶帶來一定的麻煩,不但影響程序的運行的效率,而且使系統(tǒng)的整體執(zhí)行效率下降和占用大量不必要的內(nèi)存資源,甚至消耗一定的電池資源(battery life)。
在Android SDK中提供了三種應(yīng)用Align操作的方法:
1.使用ADT:
從ADT 0.9.3版本開始,可以通過export wizard自動對發(fā)布的applicationpackages執(zhí)行align操作。
設(shè)置方法:鼠標(biāo)右鍵點擊Project,然后選擇“Android Tools” > “ExportSigned Application Package…”。或者可以直接在AndroidManifest.XML中設(shè)置。
2.使用Ant:
對于API Level 大于等于4的Application Packages可以直接通過Ant build script來Align優(yōu)化。但對于API Level小于4的情況,只能采取手動Align優(yōu)化。
默認(rèn)下應(yīng)用Ant build script運行Debug packages(API Level >= 4)時,將自動執(zhí)行Align優(yōu)化。
針對Release packages。當(dāng)使用Ant build script執(zhí)行Align優(yōu)化時,首先需要擁有足夠的信息來Sign packages。當(dāng)完成Signing之后,才能執(zhí)行Align優(yōu)化。通過官方文檔了解如何Sign Packages。
3.手動執(zhí)行Align優(yōu)化:
利用tools文件夾下的zipalign工具。
首先調(diào)出cmd命令行,然后執(zhí)行:zipalign -v 4 source.apk androidres.apk。
這個方法不受API Level的限制,可以對任何版本的APK執(zhí)行Align優(yōu)化。
同時可以利用zipalign工具檢查當(dāng)前APK是否已經(jīng)執(zhí)行過Align優(yōu)化。
命令:zipalign -c -v 4 androidres.apk
再一次提醒開發(fā)者,立刻應(yīng)用zipalign工具強制優(yōu)化已經(jīng)發(fā)布的application packages,并讓你的用戶使用最新的版本。
介紹
編輯
APK是Android application package的縮寫,即Android安裝包(apk)。APK是類似SymbianSis或Sisx的文件格式。通過將APK文件直接傳到Android模擬器或Android手機中執(zhí)行即可安裝。
apk文件和sis一樣,把androidsdk編譯的工程打包成一個安裝程序文件,格式為apk。 APK文件其實是zip格式,但后綴名被修改為apk,通過UnZip解壓后,可以看到Dex文件,Dex是DalvikVM executes的簡稱,即Android Dalvik執(zhí)行程序,并非Java ME的字節(jié)碼而是Dalvik字節(jié)碼。Android在運行一個程序時首先需要UnZip,然后類似Symbian那樣直接,但不同于Windows?mobile中的PE文件,程序的保密性和可靠性不是很高,通過dexdump命令可以反編譯它,但這種架構(gòu)符合發(fā)展規(guī)律,微軟的WindowsGadgets(WPF)也采用了這種架構(gòu)方式。在Android平臺中,dalvikvm的執(zhí)行文件被打包為apk格式,最終運行時加載器會先解壓,然后獲取編譯后的androidmanifest.xml文件中的permission聲明對安全訪問的限制,要知道仍然存在很多安全限制,但將apk文件傳到/system/app文件夾下會發(fā)現(xiàn)執(zhí)行是不受限制的。也許我們平時安裝都不會選用這個文件夾,但在androidrom中,系統(tǒng)的apk文件默認(rèn)會放入這個文件夾,它們擁有root權(quán)限。
apk優(yōu)化
編輯
Android SDK中包含了一個用于優(yōu)化APK的新工具zipalign,它能夠?qū)Υ虬膽?yīng)用程序進行優(yōu)化。通過zipalign優(yōu)化后的應(yīng)用程序可使得Android與應(yīng)用程序間的交互更加有效率。
使用zipalign優(yōu)化程序的步驟如下。在cmd中輸入如下命令:
zipalign-v4c:\ShowlmageProject.apkc:\ShowlmageProject_aligned.apk
命令行解釋如下:
zipalign優(yōu)化的最根本目的是幫助操作系統(tǒng)更高效率地根據(jù)請求索引資源,Resource Handling Code統(tǒng)一將Data Structure Alignment(數(shù)據(jù)結(jié)構(gòu)對齊標(biāo)準(zhǔn):DSA)限定為4-byte Boundaries。如果不采取對齊的標(biāo)準(zhǔn),處理器無法準(zhǔn)確和快速地在內(nèi)存地址中定位相關(guān)資源。目前的系統(tǒng)中使用Fallback Mechanism機制處理那些沒有應(yīng)用DSA標(biāo)準(zhǔn)的應(yīng)用程序,這大大方便了普通開發(fā)者,使其無需關(guān)注繁瑣的內(nèi)存操作問題。但是相反,這種處理機制將給普通用戶帶來一定的麻煩,不但影響程序運行的效率,而且使系統(tǒng)的整體執(zhí)行效率下降,使程序占用大量不必要的內(nèi)存資源,甚至消耗一定的電池資源。
注意:zipalign操作必須且僅在標(biāo)記apk文件附有個人加密鑰之后。如果在標(biāo)記之前進行zipalign操作,標(biāo)記過程將會干擾整理。
參考資料 >