(十)PMS及App安裝過程算法
PMS,全稱PackageManagerService,是用來獲取Apk包的信息的。安全
在前面分析四大組件與AMS通訊的時候,咱們介紹過,AMS老是會使用PMS加載包的信息,將其封裝在LoadedApk這個類對象中,而後咱們就能夠從中取出在manifest聲明的四大組件信息了。網絡
(一)app
在下載並安裝App的過程,會把Apk存放在data/app目錄下。xml
Apk是一個zip壓縮包,在文件頭會記錄壓縮包的大小,因此後續在文件尾巴就算是追加一部小電影,也不會對解壓形成影響——木馬其實就是這個思路,在可執行文件exe尾巴上掛一個木馬病毒,執行exe的同時也會執行這個木馬,而後你就中招了。對象
咱們能夠把木馬思想運用在Android多渠道打包上。在比較老的Android 4.4版本中,咱們會在Apk尾巴上追加幾個字節,來標記Apk的渠道。Apk啓動的時候,從apk中的尾巴上讀取這個渠道值。blog
後來Google也發現這個安全漏洞了,在新版本的系統中,就會在Apk安裝的時候,檢查Apk的實際大小,看這個值與Apk的頭部記錄的壓縮包大小,是否相等,不相等就會報錯說安裝失敗。圖片
(二)ip
咱們繼續說App的安裝過程。Android系統使用PMS解析這個Apk中的manifest文件,包括:資源
3)在Launcher生成一個icon,icon中保存着默認啓動的Activity的信息。
4)App安裝過程的最後,是把上面這些信息記錄在一個xml文件中,以備下次安裝時再次使用。
(三)
其實,在Android手機系統每次啓動的時候,都會使用PMS,把Android系統中的全部Apk都安裝一遍,一共4個步驟,以下所示:
其中的第3步、第4步,和單獨安裝一個App的步驟是同樣的。咱們分析一下前兩步:
第1步,由於結束安裝的時候,都會把安裝信息保存在xml文件中,因此Android系統再次啓動時,再次從新安裝全部的Apk,就能夠直接讀取以前保存的xml文件了。
第2步,從5個目錄中讀取並安裝全部的apk。
最後,回答前面說起的一個問題,爲何App安裝時,不把它解壓呢?直接從解壓文件中讀取資源文件好比圖片是否是更快呢?其實並非這樣的,這部分邏輯須要到底層C++的代碼去尋找,我沒有具體看過,只是道聽途說問過Lody,他是這麼給我解釋的:
每次從apk中讀取資源,並非先解壓再找圖片資源,而是解析Apk中的Resource.arsc文件,這個文件中存儲着資源的全部信息,包括資源在Apk中的地址、大小等等,按圖索驥,從這個文件中快速找到相應的資源文件。這是一種很高效的算法。
不解壓Apk的好處,天然是節省空間。