來(lái)自:https://zhuanlan.zhihu.com/p/79973102
我們知道,Windows應(yīng)用程序的安裝包是一個(gè)可執(zhí)行的壓縮包,安裝的過(guò)程是把壓縮包中的數(shù)據(jù)和依賴庫(kù)拷貝到安裝目錄,再在桌面或啟動(dòng)欄創(chuàng)建快捷方式,那么安卓的APK安裝過(guò)程是不是也是這樣的呢
apk:
APK包是個(gè)簡(jiǎn)單的壓縮包,可以用zip工具直接解壓它
一個(gè)APK包含以下這些文件:
- META-INF目錄:包含兩個(gè)簽名文件(CERT.SF和CERT.RSA),以及一個(gè)manifest文件(MANIFEST.MF)
- assets目錄:包含工程中的asset目錄下的文件,可以使用AssetManager獲取
- res目錄:包含那些沒(méi)有被編譯到resources.arsc的資源
- lib目錄:包含適用于不同處理器的第三方依賴庫(kù),這里邊可以有多個(gè)子目錄,比如armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, 以及mips
- resources.arsc文件:存儲(chǔ)編譯好的資源,包括項(xiàng)目工程中的res/values目錄里的xml文件,它們都被編譯成二進(jìn)制格式,也包括一些路徑,指向那些沒(méi)有被編譯的資源,比如layout文件和圖片
- classes.dex文件:項(xiàng)目中的java類(lèi)都被編譯到該dex文件,這個(gè)文件可以被Android的Dalvik/ART虛擬機(jī)解析。
- AndroidManifest.xml:二進(jìn)制格式的manifest文件,這個(gè)文件是必須的。
這些文件是Android系統(tǒng)運(yùn)行一個(gè)應(yīng)用程序時(shí)會(huì)用到的數(shù)據(jù)和代碼,
安裝過(guò)程
- 與應(yīng)用相關(guān)的一些目錄
/system/priv-app:系統(tǒng)應(yīng)用安裝路徑,Android 4.4+ 開(kāi)始出現(xiàn),區(qū)分系統(tǒng)應(yīng)用權(quán)限,擁有 SignatureOrSystem 權(quán)限,此目錄下的 service 具有?;钅芰?br>
/system/app:系統(tǒng)應(yīng)用安裝路徑,權(quán)限略低于 priv-app 目錄下的應(yīng)用,放置比如廠商內(nèi)置應(yīng)用
/data/app:用戶應(yīng)用安裝路徑,應(yīng)用安裝時(shí)將 apk 復(fù)制到此目錄下
/data/data:用戶應(yīng)用數(shù)據(jù)存放路徑,存在沙箱隔離
/data/dalvik-cache:存放應(yīng)用的dex 文件
/data/system:存放應(yīng)用安裝相關(guān)文件
packages.xml 是一個(gè)應(yīng)用的注冊(cè)表,在解析應(yīng)用時(shí)創(chuàng)建,有變化時(shí)更新,記錄系統(tǒng)權(quán)限,各應(yīng)用信息,如name, codePath, flag, version, userid,下次開(kāi)機(jī)時(shí)直接讀取并添加到內(nèi)存列表
package.list 指定應(yīng)用的默認(rèn)存儲(chǔ)位置,userid 等
- 應(yīng)用安裝過(guò)程總結(jié)
將應(yīng)用 apk 拷貝到指定目錄下
解壓 apk,將 dex 文件拷貝到 /data/dalvik-cache 目錄,創(chuàng)建 /data/data/ 數(shù)據(jù)目錄
解析 AndroidManifest.xml 及其他資源文件,提取應(yīng)用包信息,注冊(cè)到 packags.xml 中
由 Launcher 進(jìn)程通過(guò) PMS 取出所有應(yīng)用程序,展示在桌面上