前面我們讨論過dex2oat的過程,下面我們開始探索系統中的重要工具程序,installd守護程序。
我們有packagemanageservice這麼大的元件了,為什麼還需要installd這個守護程序呢?
一句話,是因為權限的問題,pms隻有system權限。installd的作用就是處理需要root權限的操作。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLmlTYiFjYhhzY4Y2NmZGN3UWMyQTY1EWY1Y2MkhzN1cDNmVTM2QDO28CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
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的邏輯。