【轉(zhuǎn)】APK文件結(jié)構(gòu)和安裝過程(整理方便自己查閱)

原博主鏈接

APK文件結(jié)構(gòu)

Android應(yīng)用是用Java編寫的羔巢,利用Android SDK編譯代碼檩小,并且把所有的數(shù)據(jù)和資源文件打包成一個APK (Android Package)文件,這是一個后綴名為.apk的壓縮文件杜耙,APK文件中包含了一個Android應(yīng)用程序的所有內(nèi)容搜骡,是Android平臺用于安裝應(yīng)用程序的文件。APK就是一個zip壓縮包记靡,解開這個APK包我們可以看到以下的結(jié)構(gòu):

Figure 1 APK文件結(jié)構(gòu)

1)???????assets目錄:用于存放需要打包到APK中的靜態(tài)文件,和res的不同點在于寸痢,assets目錄支持任意深度的子目錄啼止,用戶可以根據(jù)自己的需求任意部署文件夾架構(gòu)兵罢,而且res目錄下的文件會在.R文件中生成對應(yīng)的資源ID趣些,assets不會自動生成對應(yīng)的ID坏平,訪問的時候需要AssetManager類舶替。

2)???????lib目錄:這里存放應(yīng)用程序依賴的native庫文件顾瞪,一般是用C/C++編寫,這里的lib庫可能包含4中不同類型惕橙,根據(jù)CPU型號的不同钉跷,大體可以分為ARM爷辙,ARM-v7a,MIPS栓始,X86血当,分別對應(yīng)著ARM架構(gòu)歹颓,ARM-V7架構(gòu)巍扛,MIPS架構(gòu)和X86架構(gòu)吠昭,這些so庫在APK包中的構(gòu)成如下圖Figure2:

Figure 2 lib目錄結(jié)構(gòu)

其中矢棚,不同的CPU架構(gòu)對應(yīng)著不同的目錄,每個目錄中可以放很多對應(yīng)版本的so庫,且這個目錄的結(jié)構(gòu)固定申窘,用戶只能按照這個目錄存放自己的so庫孔轴。目前市場上使用的移動終端大多是基于ARM或者ARM-V7a架構(gòu)的剃法,X86和MIPS架構(gòu)的移動智能終端比較少路鹰,所以有些應(yīng)用程序lib目錄下只包含armeabi目錄或者armeabi-v7a目錄,也就是說晋柱,這四個目錄要根據(jù)CPU的架構(gòu)來選优构,而市面上ARM架構(gòu)的手機占大多數(shù)趣斤,所以一般的APK只包含ARM和ARM-V7a的so俩块。

3)???????res目錄:res是resource的縮寫,這個目錄存放資源文件,存在這個文件夾下的所有文件都會映射到Android工程的.R文件中送火,生成對應(yīng)的ID,訪問的時候直接使用資源ID即R.id.filename,res文件夾下可以包含多個文件夾,其中anim存放動畫文件没隘;drawable目錄存放圖像資源;layout目錄存放布局文件;values目錄存放一些特征值瑰妄,colors.xml存放color顏色值陷嘴,dimens.xml定義尺寸值,string.xml定義字符串的值间坐,styles.xml定義樣式對象灾挨;xml文件夾存放任意xml文件邑退,在運行時可以通過Resources.getXML()讀取涨醋;raw是可以直接復(fù)制到設(shè)備中的任意文件瓜饥,他們無需編譯。

4)???????META-INF目錄:保存應(yīng)用的簽名信息浴骂,簽名信息可以驗證APK文件的完整性。AndroidSDK在打包APK時會計算APK包中所有文件的完整性宪潮,并且把這些完整性保存到META-INF文件夾下溯警,應(yīng)用程序在安裝的時候首先會根據(jù)META-INF文件夾校驗APK的完整性,這樣就可以保證APK中的每一個文件都不能被篡改狡相。以此來確保APK應(yīng)用程序不被惡意修改或者病毒感染梯轻,有利于確保Android應(yīng)用的完整性和系統(tǒng)的安全性。META-INF目錄下包含的文件有CERT.RSA尽棕,CERT.DSA喳挑,CERT.SF和MANIFEST.MF,其中CERT.RSA是開發(fā)者利用私鑰對APK進行簽名的簽名文件滔悉,CERT.SF伊诵,MANIFEST.MF記錄了文件中文件的SHA-1哈希值。

5)???????AndroidManifest.xml:是Android應(yīng)用程序的配置文件回官,是一個用來描述Android應(yīng)用“整體資訊”的設(shè)定文件曹宴,簡單來說,相當(dāng)于Android應(yīng)用向Android系統(tǒng)“自我介紹”的配置文件歉提,Android系統(tǒng)可以根據(jù)這個“自我介紹”完整地了解APK應(yīng)用程序的資訊笛坦,每個Android應(yīng)用程序都必須包含一個AndroidManifest.xml文件,且它的名字是固定的苔巨,不能修改版扩。我們在開發(fā)Android應(yīng)用程序的時候,一般都把代碼中的每一個Activity侄泽,Service礁芦,Provider和Receiver在AndroidManifest.xml中注冊,只有這樣系統(tǒng)才能啟動對應(yīng)的組件蔬顾,另外這個文件還包含一些權(quán)限聲明以及使用的SDK版本信息等等宴偿。程序打包時,會把AndroidManifest.xml進行簡單的編譯诀豁,便于Android系統(tǒng)識別窄刘,編譯之后的格式是AXML格式,如下圖Figure3所示:

Figure 3 AXML格式

axml頭:其中的axml頭是固定標識axml文件的舷胜,其值固定時0x00080003娩践。

axml文件長度:標識axml文件的大小活翩。

StringDataSegment:xml文件中所有字符串類型保存在此。

ResourceIdSegment:xml文件中聲明的資源文件ID保存于此翻伺。

XmlContentSegment:是xml的內(nèi)容段材泄,按照xml文件中的結(jié)構(gòu)依次排開,保存xml的數(shù)據(jù)內(nèi)容吨岭。

6)???????classes.dex:

傳統(tǒng)的Java程序拉宗,首先先把Java文件編譯成class文件,字節(jié)碼都保存在了class文件中辣辫,Java虛擬機可以通過解釋執(zhí)行這些class文件旦事。而Dalvik虛擬機是在Java虛擬機進行了優(yōu)化,執(zhí)行的是Dalvik字節(jié)碼急灭,而這些Dalvik字節(jié)碼是由Java字節(jié)碼轉(zhuǎn)換而來姐浮,一般情況下,Android應(yīng)用在打包時通過AndroidSDK中的dx工具將Java字節(jié)碼轉(zhuǎn)換為Dalvik字節(jié)碼葬馋。dx工具可以對多個class文件進行合并卖鲤,重組,優(yōu)化畴嘶,可以達到減小體積蛋逾,縮短運行時間的目的。dx工具的轉(zhuǎn)換過程如圖所示:

Figure 4 dx工具把.class文件轉(zhuǎn)換成dex文件

如圖Figure 4掠廓,dx工具把每個.class文件的每個區(qū)域的內(nèi)容進行去重换怖,重組,優(yōu)化重排后生成dex文件蟀瞧,生成的dex文件可以在Dalvik虛擬機執(zhí)行沉颂,且速度比較快。

7)???????resources.arsc:用來記錄資源文件和資源ID之間的映射關(guān)系悦污,用來根據(jù)資源ID尋找資源铸屉。Android的開發(fā)是分模塊的,res目錄專門用來存放資源文件切端,當(dāng)在代碼中需要調(diào)用資源文件時彻坛,只需要調(diào)用findviewbyId()就可以得到資源文件,每當(dāng)在res文件夾下放一個文件踏枣,aapt就會自動生成對應(yīng)的ID保存在.R文件昌屉,我們調(diào)用這個ID就可以,但是只有這個ID還不夠茵瀑,.R文件只是保證編譯程序不報錯间驮,實際上在程序運行時,系統(tǒng)要根據(jù)ID去尋找對應(yīng)的資源路徑马昨,而resources.arsc文件就是用來記錄這些ID和資源文件位置對應(yīng)關(guān)系的文件竞帽。

APK安裝過程

Adroid的應(yīng)用安裝涉及到如下幾個目錄:

/data/app:存放用戶安裝的APK的目錄扛施,安裝時,把APK拷貝于此屹篓。

/data/data:應(yīng)用安裝完成后疙渣,在/data/data目錄下自動生成和APK包名(packagename)一樣的文件夾,用于存放應(yīng)用程序的數(shù)據(jù)堆巧。

/data/dalvik-cache:存放APK的odex文件妄荔,便于應(yīng)用啟動時直接執(zhí)行。

具體安裝過程如下:

首先恳邀,復(fù)制APK安裝包到/data/app下懦冰,然后校驗APK的簽名是否正確,檢查APK的結(jié)構(gòu)是否正常谣沸,進而解壓并且校驗APK中的dex文件,確定dex文件沒有被損壞后笋颤,再把dex優(yōu)化成odex乳附,使得應(yīng)用程序啟動時間加快,同時在/data/data目錄下建立于APK包名相同的文件夾伴澄,如果APK中有l(wèi)ib庫赋除,系統(tǒng)會判斷這些so庫的名字,查看是否以lib開頭非凌,是否以.so結(jié)尾举农,再根據(jù)CPU的架構(gòu)解壓對應(yīng)的so庫到/data/data/packagename/lib下。

APK安裝的時候會把DEX文件解壓并且優(yōu)化位odex敞嗡,odex的格式如Figure 5圖所示:

Figure 5 odex文件格式

odex在原來的dex文件頭添加了一些數(shù)據(jù)颁糟,在文件尾部添加了程序運行時需要的依賴庫和輔助數(shù)據(jù),使得程序運行速度更快喉悴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棱貌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子箕肃,更是在濱河造成了極大的恐慌婚脱,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺像,死亡現(xiàn)場離奇詭異障贸,居然都是意外死亡,警方通過查閱死者的電腦和手機吟宦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門篮洁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人督函,你說我怎么就攤上這事嘀粱〖づ玻” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵锋叨,是天一觀的道長垄分。 經(jīng)常有香客問我,道長娃磺,這世上最難降的妖魔是什么薄湿? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮偷卧,結(jié)果婚禮上豺瘤,老公的妹妹穿的比我還像新娘。我一直安慰自己听诸,他們只是感情好坐求,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晌梨,像睡著了一般桥嗤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仔蝌,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天泛领,我揣著相機與錄音,去河邊找鬼敛惊。 笑死渊鞋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞧挤。 我是一名探鬼主播锡宋,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼皿伺!你這毒婦竟也來了员辩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鸵鸥,失蹤者是張志新(化名)和其女友劉穎奠滑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妒穴,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡宋税,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了讼油。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杰赛。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矮台,靈堂內(nèi)的尸體忽然破棺而出乏屯,到底是詐尸還是另有隱情根时,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布辰晕,位于F島的核電站蛤迎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏含友。R本人自食惡果不足惜替裆,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窘问。 院中可真熱鬧辆童,春花似錦、人聲如沸惠赫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儿咱。三九已至纸镊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間概疆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工峰搪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岔冀,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓概耻,卻偏偏與公主長得像使套,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鞠柄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,280評論 25 707
  • APK文件結(jié)構(gòu) Android應(yīng)用是用Java編寫的侦高,利用Android SDK編譯代碼,并且把所有的數(shù)據(jù)和資源文...
    vb12閱讀 3,964評論 0 3
  • 最近幾周一直在研究如何為APK瘦身厌杜,折騰了很久奉呛,是時候?qū)懫┛涂偨Y(jié)一下了,雖然已經(jīng)準備了下周一要在客戶端周會分享用...
    風(fēng)清袖一閱讀 1,058評論 1 10
  • 想象這樣一個場景:在一個陽光燦爛的下午夯尽,你哼著小曲呼吸著新鮮空氣瞧壮,悠閑地上著網(wǎng),這該有多愜意啊匙握。但讓我們還原一下真...
    曉春測略閱讀 331評論 0 3
  • 我越發(fā)感到咆槽,培養(yǎng)下一代是人生中最大的賭局,能培養(yǎng)出優(yōu)秀的下一代的重要性圈纺,可以從近期呼吁高考公平的喧囂聲中可以略見一...
    放縱天涯閱讀 305評論 0 0