android應用分析之apk檔案結構

來源:互聯網
上載者:User

標籤:

        實際上,一個APK檔案就是一個.zip格式的壓縮包,我們可以用解壓縮工具開啟任何一個APK檔案,由於代碼混淆和加密,通過普通解壓縮工具開啟裡面的檔案或目錄會看到各種亂碼。一個典型的apk檔案包含以下內容:?AndroidManifest.xml 
Android應用的配置資訊清單檔,它向Android系統介紹了這個應用的很多配置資訊,系統可以根據這個檔案在相當程度上瞭解這個應用的一些資訊。該檔案是每個應用都必須定義和包含的,它描述了應用的名字、版本、許可權、引用的庫檔案等等資訊,如要把apk上傳到Google Market上,也要對這個xml做一些配置。在apk中的AndroidManifest.xml是經過壓縮的,可以通過AXMLPrinter2工具(針對該檔案)或apktool工具進行反編譯(反編譯整個apk)。

?META-INF目錄 
META-INF目錄下存放的是簽名資訊,用來保證apk包的完整性和系統的安全。沒有簽名的應用是不被系統認可的,也無法安裝到手機中。Android SDK在對APK進行打包的時候,會把APK中全部檔案的完整資訊儲存到這裡,這樣應用在安裝的時候會進行完整性校正,確保APK的檔案不會被篡改,大大提升了應用和系統的安全性與完整性。META-INF目錄下有CERT.RSA、CERT.SF和MANIFEST.MF這幾個檔案,其中的CERT.RSA檔案記錄了開發人員的私密金鑰對APK簽名後的資訊,MANIFEST.MF檔案則儲存了整個APK中所有檔案的SHA-1進行base64編碼後的值,CERT.SF則與MANIFEST.MF差不多,包括了後者所有的資訊,然後又加入了MANIFEST.MF檔案的SHA-1並base64編碼的值。

?res目錄 
存放各種資源檔的目錄。這個目錄中的所有檔案,最終會被映射到Android工程中的R檔案中,產生對應的int型的ID,在程式中訪問這些資源檔的時候,直接使用資源的ID就能進行調用了。res目錄下還包含著多個子檔案夾:anmi中存放著動畫檔案;drawable則存放著一些圖片資源;layout中存放的是布局檔案;menu則是自訂菜單的項;raw目錄中的檔案則是可以直接複製到裝置中的檔案,不會被編譯;values中存放著一些特殊的值——colors.xml記錄的是你自訂的顏色,dimens.xml記錄著你自訂的尺寸,strings.xml則是你自訂的字串常量值,styles.xml定義了一些樣式。
?lib目錄 
這個目錄中存放著應用依賴的native庫檔案,這些以.so結尾的檔案是用C或者C++語言編寫的,一個簡單的Android應用可能並不需要這些庫,但一個功能全面而又追求效能的應用是不可能無視這個目錄的,譬片處理、網路處理、音視頻處理等一些對效能要求很高的功能,單純依靠Java會十分吃力,效能更加強大而且更加接近底層的C/C++就是更合適的選擇了。根據手機CPU的架構,lib庫大體上可以分為4種:ARM、ARM-V7、MIPS和X86,分別對應著4種CPU架構,在lib目錄裡則分別是armeabi、armeabi-v7a、mips和x86一共4個目錄。每個目錄中的.so庫名字都是一樣的,實際上功能也是相同的,它們只是為了適配不同架構的CPU而存在。實際上,市面上的手機幾乎全都是ARM架構的,所以大多數情況下我們只需要有armeabi和armeabi-v7a兩種類型的庫就足夠了。
?assets目錄 
跟res目錄有點相似,但實際上二者還是有區別的。res目錄中的檔案會映射到R檔案中,每個資源檔都有自己的ID,而assets中的檔案則直接通過訪問檔案的地址來使用AssetManager類進行訪問,而且assets目錄你可以添加任意深度的子目錄,這一點會比較方便管理和歸類檔案。相比較之下,res目錄目前不能支援更深級的子目錄。
?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。    對比普通java程式和安卓程式差異:
普通java程式        java虛擬機器        java位元組碼(class)        基於棧
安卓程式        Davlik虛擬機器        Dalvik位元組碼(dex)        基於寄存器

?resources.arsc 
      編譯後的二進位資源檔的索引,記錄了資源檔(即res目錄中的檔案)和資源檔ID的映射關係,這樣程式啟動並執行時候就可以根據資源的ID擷取到相應的資源了。



來自為知筆記(Wiz)

android應用分析之apk檔案結構

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.