APK文件夾結構

apk文件,即Android application package文件。

每個要安裝到Android平臺的應用都要被編譯打包爲一個單獨的文件,後綴名爲.apk,其中包含了應用的二進制代碼、資源、配置文件等。APK文件其實是zip格式,但後綴名被修改爲apk, 
在Android 系統安裝時,APK 程序會被存放在系統默認的APP 目錄中。

既然是一個Zip壓縮包,那我們就不妨先解壓出來看看其目錄結構和內容,在我這我以NDK中的two-libs爲例,以NDK爲例,主要是要在本文中介紹SDK和NDK結合打包的方法。先看圖:

2

 

其實這個目錄結構與源代碼的目錄結構類似,接下來我們對比看看源代碼(我用的是eclipse):

1

看見沒有,幾乎就是一樣的!接下來挨個介紹下apk中個文件及目錄的內容和作用吧,一下資料來源於網絡和官方文檔當然還有個人理解。

  • AndroidManifest.xml

    該文件是每個應用都必須定義和包含的,它描述了應用的名字、版本、權限、引用的庫文件等等信息[ , ],如要把apk上傳到Google Market上,也要對這個xml做一些配置。在apk中的AndroidManifest.xml是經過壓縮的,可以通過AXMLPrinter2工具 [ , ]解開,具體命令爲:java -jar AXMLPrinter2.jar AndroidManifest.xml

  • META-INF目錄 
    META-INF目錄下存放的是簽名信息,用來保證apk包的完整性和系統的安全。在eclipse編譯生成一個apk包時,會對所有要打包的文件做一個 校驗計算,並把計算結果放在META-INF目錄下。這就保證了apk包裏的文件不能被隨意替換。比如拿到一個apk包後,如果想要替換裏面的一幅圖片, 一段代碼, 或一段版權信息,想直接解壓縮、替換再重新打包,基本是不可能的。如此一來就給病毒感染和惡意修改增加了難度,有助於保護系統的安全。
  • res目錄 
          res目錄存放資源文件。包括圖片,字符串等等。
  • lib目錄

    lib目錄下的子目錄armeabi存放的是一些so文件。這個地方多講幾句,都是在開發過程中摸索出來的。eclipse在打包的時候會根據文件名的命 名規則(lib****.so)去打包so文件,開頭和結尾必須分別爲“lib”和“.so”,否則是不會打包到apk文件中的。其他非eclipse開 發環境沒有測試過。如果你是用SDK和NDK開發的話,這部分很重要,甚至可以通過把一些不是so文件的文件通過改名打包到apk中,具體能幹些什麼那就 看你想幹什麼了,呵呵呵!

  • assets目錄

    assets目錄可以存放一些配置文件,這些文件的內容在程序運行過程中可以通過相關的API獲得。具體的方法可以參考SDK中的例子:在sdk的 \SDK\1.6\android-sdk-windows-1.6_r1\platforms\android-1.6\samples\ApiDemos 例子中,有個com.example..android.apis.content 的例子,在這個例子中他把一個text文件放到工程的asset目錄下,然後把這個txt當作普通文件處理。處理的過程在ReadAsset.java 中。同理,asset也可以放置其他文件。

  • classes.dex文件 
          classes.dex是java源碼編譯後生成的java字節碼文件(首先是java文件通過jdk編譯成字節碼文件然後經過dex編譯成classes.dex)。但由於Android使用的dalvik虛擬機與標準的java虛擬機是不兼容 的,dex文件與class文件相比,不論是文件結構還是opcode都不一樣。目前常見的java反編譯工具都不能處理dex文件。Android模擬 器中提供了一個dex文件的反編譯工具,dexdump。用法爲首先啓動Android模擬器,把要查看的dex文件用adb push上傳的模擬器中,然後通過adb shell登錄,找到要查看的dex文件,執行dexdump xxx.dex。另,有人介紹到Dedexer是目前在網上能找到的唯一一個反編譯dex文件的開源工具,需要自己編譯源代碼。
  • resources.arsc 
          編譯後的二進制資源文件的索引(apk文件的資源表(索引))
上面這些資源最後通過aapt這個工具打包成apk,其實當生成apk的時候就會調用這個命令
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章