安卓高手之路之PackageManagerservice,mindmanager安卓

來源:互聯網
上載者:User

安卓高手之路之PackageManagerservice,mindmanager安卓

源碼位置:frameworks/base/core/java/android/content/pm/PackageParser.java

源檔案路徑:android\frameworks\base\services\java\com\android\server\PackageManagerService.java

 

1.PackageManagerService.java 用到一個很重要的工具類,PackageParser.java

這裡面是一些 工具類 和 工具方法,輔助PackageManagerService來完成一些功能。

下面 分析一下PackageManagerService的 啟動流程

 

1.PackageManagerService中有一個靜態方法:main()。產生一個IPackageManager介面,也就是PackageManagerService。下面我們主要看PackageManagerService的構造方法。
public static final IPackageManager main(Context context, boolean factoryTest) {
PackageManagerService m = new PackageManagerService(context, factoryTest);
ServiceManager.addService("package", m);
return m;
}

2.構造方法中,首先會進行一些成員變數的初始化,比如mContext, mFactoryTest, mMetrics, mSettings等。
a. 最重要的是初始化mInstaller這個變數。Installer是一個很重要的類,所有對apk的install, uninstall,move等操作,都是通過它進行的。
Installer installer = new Installer();
if (installer.ping() && Process.supportsProcesses()) {
mInstaller = installer;
} else {
mInstaller = null;

 

b.建立PackageHandler訊息迴圈,用於處理 外部的apk安裝 請求訊息如adb install,packageinstaller安裝apk時會 發送訊息
mHandlerThread.start();
mHandler = new PackageHandler(mHandlerThread.getLooper());

4.解析 編譯後的 system/etc/permission下xml檔案(framework/base/data/etc/),包括 platform.xml 和 系統支援的各種硬體模組的feature.

主要工作:

(1)建立底層user ids和group ids 同上層permissions之間的映射;可以指定一個許可權與幾個組ID對應。當一個APK被授予這個許可權時,它也同時屬於這幾個組。
(2)給一些底層使用者指派許可權,如給shell授予各種permission許可權;把一個許可權賦予一個UID,當進程使用這個UID運行時,就具備了這個許可權。
(3) library,系統增加的一些應用需要link的擴充jar庫;

(4) feature,系統每增加一個硬體,都要添加相應的feature.將解析結果放入mSystemPermissions,mSharedLibraries,mSettings.mPermissions,mAvailableFeatures等幾個集合中供系統查詢和許可權配置使用。

 

5.檢查/data/system/packages.xml是否存在這個檔案是 解析apk時 由writeLP() 建立的,裡面記錄了系統的permissions,以及每個apk的name, codePath, flags, ts, version, uesrid等資訊,這些資訊主要通過apk的AndroidManifest.xml解析擷取,解析完apk後將更新資訊寫入這個檔案並儲存到flash,下次開機直接從裡面讀取相關資訊添加到記憶體相關列表中。當有apk升級,安裝或刪除時會更新這個檔案。

6.檢查BootClassPath,mSharedLibraries及/system/framework下的jar
是否需要dexopt,需要的則通過dexopt進行最佳化

7.啟動AppDirObserver線程 監測/system/framework, /system/app, /data/app, /data/app-private目錄 的事件,主要 監聽add和remove事件。對於目錄監聽底層 通過inotify機制實現,inotify 是一種 檔案系統的變化 通知機制,如檔案增加、刪除 等事件可以立刻讓使用者態得知,它為 使用者態 監視檔案系統的變化提供了強大的支援。
當有add event時調用scanPackageLI(File , int , int)處理;
當有remove event時調用removePackageLI()處理;


8.對於以上幾個目錄下的apk逐個解析,主要是解析每個apk的AndroidManifest.xml檔案,處理asset/res等資源檔,建立起每個apk的配置結構資訊,並將每個apk的配置資訊添加到全域列表進行管理。調用installer.install()進行安裝工作,檢查apk裡的dex檔案是否需要再最佳化,如果需要最佳化則通過協助工具輔助dexopt進行最佳化處理;將解析出的componet添加到pkg的對應列表裡;
對apk進行 簽名 和 認證校正, 進行完整性驗證。

9.將解析的每個apk的資訊儲存到packages.xml和packages.list檔案裡,packages.list記錄了如下資料:pkgName,userId,debugFlag,dataPath(包的資料路徑)。


怎在android源碼中找到PackageManager類的具體實現

frameworks\base\core\java\android\app\ApplicationPackageManager.java
這個檔案定義ApplicationPackageManager類,繼承並實現了PackageManager中介面;
ApplicationPackageManager使用mPM變數,這個變數是PackageManagerService的用戶端(IBinder對象),調用mPM對象中的方法,實際調用到了frameworks\base\services\java\com\android\server\pm\PackageManagerService.java檔案中
的方法。
這是Java層中Binder的使用方式。
通過 grep -rnsw "extends PackageManager" * 可以找到PackageManager的實現。經常要用Linux中grep命令來尋找檔案。
 
安卓 PackageManagerhasSystemFeature() 方法用不了

能具體點嗎?
Alt+/ 提示裡面沒有任何方法:你得設定自動填滿
如果提示create,有可以你的這個方法是hide的。
可通過Android Tools->fix project properties試試

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.