1. 程式人生 > >淺析Android的資源打包及安裝後Apk檔案的路徑

淺析Android的資源打包及安裝後Apk檔案的路徑

Apk包對於Android系統來說是一個可執行檔案,但其實質上是一個壓縮包。把apk檔案轉為自拍格式,然後解壓,可以看到: 


解壓Apk後文件夾裡包含的檔案: 1)assets目錄,保留工程中assets目錄,其他工程下的、jar包中的assets也會合併到該assets目錄下。 2)lib目錄,由於編譯的時候jar檔案已經合併到主工程中,所以lib目錄下不會有jar檔案,但是lib中包含所有的so檔案,so目錄的路徑保留原有的路徑。 3)META-INF目錄,資訊描述,簽名等用途。 4)res目錄,工程資原始檔,以主工程為主,其他檔案如jar包會合併到該目錄下;但是values檔案將不會出現在此目錄下,因為已經將其編譯到resources.arsc檔案中;raw檔案將保持原有的內容不會被編譯。 5)AndroidManifest檔案,用來做元件查詢。 6)classes.dex檔案,虛擬機器執行的檔案。 7)resources.arsc資原始檔索引。 Apk安裝的過程實際上就是將Apk檔案放到特定的目錄下,應用級的應用一般放到data/app下,系統應用放到system/app下。並生成與此應用有關的檔案。 下面是一般應用的路徑: 

對應應用ormlitedemo的檔案內容: 


關於資原始檔訪問的類是Resources和AssetManager,Apk安裝完成後,資源的路徑就可以指向這個apk檔案了(相當於把這個apk的路徑新增到資源路徑中),就可以取得需要的資源。 dex檔案也是通過DexClassLoader來載入的,所以如果我們在程式中使用載入器載入指定的dex檔案,就可以實現動態載入了。Facebook分dex包也是基於這種方式來做的。至於為什麼要分多個dex檔案,原因如下: 因為一個應用的功能會越來越多,隨著工程越來越大,程式碼量也會越來越多,但是Android方法數量不能超過65K,如果超出之後,將會丟擲Conversion to Dalvik format failed:Unable to execute dex:method ID not in[0,0xffff]65536。由於Android系統中,一個Dex檔案中儲存方法的id用的是short型別資料,所以導致你的dex中方法數不能超過65K。可以通過去掉無用的jar包,或者將一些屬性設定為public,從而可以去掉get/set方法來壓縮方法數量。 Reference: