標籤:
一、PackageManagerService啟動過程
SystemServer首先啟動,建立一個ServerThread線程來啟動所有Android核心服務,其中PackageManagerService.main方法啟動了PackageManagerService。
main方法中就是執行個體化PackageManagerService對象,並註冊到ServiceManager中。
PackageManagerService的構造過程設計到幾個重要的操作:
1、建立Settings對象,向其中添加SharedUser,在android資訊清單檔中定義的SharedUserId,例如android.uid.system就是在這裡定義的。Settings的構造方法中還建立了一系列的目錄和檔案,例如/data/system目錄。
android中UID範圍:
SYSTEM_UID = 1000;
非系統應用10000~19999;
隔離沙箱進程99000~99999;
2、建立應用安裝器Installer。
3、啟動訊息處理線程——一個名為PackageManager的HandlerThread。
4、建立使用者管理對象UserManager。
5、通過readPermissions()方法讀取並解析/etc/permissions下的xml檔案,包括指定UID擁有的許可權,feature標籤下的硬體資訊和系統庫的配置資訊。
6、讀取安裝包資訊,包括以下重要檔案:
/data/system/packages.xml 系統中安裝的Package資訊。
/data/system/packages-stopped.xml 記錄系統中強制停止的Package資訊。
/data/system/packages.list 儲存系統中所有非系統內建的APK資訊。
7、監控和掃描系統包安裝目錄:
/system/framework 系統庫
/system/app 預設的系統應用
/vendor/app 廠商定製的應用
8、掃描非系統apk資訊:
/data/app/
/system/preloadapp/
/data/app-private/
二、PackageManager架構
android的PackageManager架構是一個典型的AIDL架構。代碼路徑DIR=framework/base/core/java/android/。
IPackageManager.aidl檔案在DIR/content/pm/IPackageManager.aidl處,按照android標準的aidl處理模式,會產生一個存根IPackageManager.Stub和一個代理IPackageManager.Stub.Proxy.
存根的具體實現就是PackageManagerService,而代理的具體實現其實是ApplicationPackageManager,PackageManager是它的父類。
ApplicationPackageManager路徑是DIR/app/ApplicationPackageManager.java。
PackageManager路徑是DIR/content/pm/PackageManager.java。
在調用Context.getPackageManager()方法時,實際調用的是ContextImpl中的方法,該方法從ActivityThread中取出一個IPackageManager的代理對象,用這個代理執行個體化了ApplicationPackageManager。
Android PackageManager基礎知識