天天看點

Android應用生死輪回的那些事兒(1) - installd初探Android應用生死輪回的那些事兒(1) - installd初探

前面我們讨論過dex2oat的過程,下面我們開始探索系統中的重要工具程序,installd守護程序。

我們有packagemanageservice這麼大的元件了,為什麼還需要installd這個守護程序呢?

一句話,是因為權限的問題,pms隻有system權限。installd的作用就是處理需要root權限的操作。

Android應用生死輪回的那些事兒(1) - installd初探Android應用生死輪回的那些事兒(1) - installd初探
Android應用生死輪回的那些事兒(1) - installd初探Android應用生死輪回的那些事兒(1) - installd初探

4.4版中的指令隻有16個

中間的數字表示需要的參數個數:

ping:空指令

install:用于安裝應用

dexopt: 6.0生成dex和oat,5.x之前隻管生成dex。

movedex:把應用從一個目錄移動到另一個目錄

rmdex:删除應用檔案

remove:反安裝

rename:更改資料目錄名稱

fixuid:更改應用的uid

freeecache:清除cache目錄下的檔案

rmcache:清除cache目錄

getsize:計算一個應用占用的空間大小

rmuserdata:删除一個使用者的所有應用

movefiles:運作updatecmds目錄下的檔案,根據檔案描述的内容複制檔案

linklib:為動态庫建立符号連結

mkuserdata:為使用者建立目錄

rmuser:删除一個使用者的所有檔案

在5.1版本中,指令一共支援22個。

5.0新增指令6個:

markbootcomplete: 通知啟動完成

mkuserconfig:5.0新增,為使用者建立配置檔案

rmcodecache: 清除代碼緩存檔案

idmap:對兩個應用的id進行map

restorecondata:恢複selinux的安全上下文

patchoat: 對oat檔案進行複定位

從installd.cpp中檢視,6.0版本支援下面這些指令,共計25個。

6.0版本新增4個指令

cpcompleteapp:複制整個app

createoatdir:建立oat的目錄

rmpackagedir:删除包的目錄

linkfile:對檔案建立符号連結

并将patchoat這個馬甲指令,變回它的原來模樣dexopt.

指令參數:0個

版本相容性:全相容

改名是個老的api,三個版本都是相容的。

參數:

oldpkgname - 舊的包名

newpkgname - 新的包名

這個的實作也非常簡單,主要就是rename嘛:

執行/system/etc/updatecmds/目錄下的檔案指令,是以不需要任何參數。

目錄定義在:

uuid

pkgname

aseclibdir

userid

這個do_linklib寫得不好,沒有注釋。

不過,我們可以看linklib函數的定義來看這些參數:

參數:4.4和5.x是4個參數,到了6.0變成5個了。

uuid: 6.0新增

uid

gid

seinfo

6.0版本的install:

5.x之前的install:

這個重要指令我們後面專題分析

參數:6.0:3個,5.x及4.4:後面兩個

uuid:6.0新增

還是6.0新增了uuid參數,其它三個版本都一緻。

pkgname:包名

uid:userid

gid: groupid

同樣,6.0新增了uuid

free_size

同上,6.0新增一個uuid參數。

6.0多了uuid,其它基本一樣。

6.0還是隻增加了uuid。

參數:5.0之後3個,因為oat需要指令集資訊,4.4隻需要前2個。

src:源位址

dst:目标位址

instruction_set:指令集,5.0新增。

參數:5.0以後2個,4.4,1個

pkgname:包名

指令集

參數:6.0:10個, 5.x:7個, 4.4:3個

apk_path

is_public

pkgname,4.4沒有

instruction_set,4.4沒有

dexopt_needed:6.0新增,5.x沒有

vm_saft_mode,4.4沒有

debuggable:6.0新增

oat_dir:6.0新增

boot_complete:6.0新增

should_relocate: 6.0不支援,5.x的值,4.4不支援

6.0的dexopt:

5.1的dexopt:

4.4的dexopt

隻支援3個參數。

6.0新增了uuid,5.0開始新增seinfo

參數:1個,指令集

6.0與5.x一緻,4.4不支援。

就一個參數:userid

5.0新增,6.0增加uuid

調用外部的/system/bin/idmap指令。

from_uuid

to_uuid

package_name

data_app_name

appid

還是兩個參數:

oat_dir:目錄名

instruction_set:指令集

就一個參數:

oat_dir

用處就一個,删除oat目錄

相對路徑

from_base

to_base

短命的指令,隻在5.x中才有,6.0中取消了。其實在5.1中也就是個dexopt的馬甲,是以6.0中幹脆就取消了。

這一章我們隻是走馬觀花看一下,下一章我們将深入這些指令,看看應用管理都有一些什麼樣的installd操作要做,以及它們上層的pms的邏輯。

繼續閱讀