歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android應用程序管理機制

Android應用程序管理主要由PackageManager這個類來管理,實現PackageManager這個抽象類的是ContextImpl.java。在ContextImpl.java中,有一個內部靜態類叫ApplicationPackageManager,實現了所有PackageManager的接口。

[java]
  1.  static final class ApplicationPackageManager extends PackageManager {  
  2.   
  3. ..........  
  4.   
  5. }  

ApplicationPackageManager又是通過對IPackageManager封裝調用,來實現的。

[java]
  1. public PackageInfo getPackageInfo(String packageName, int flags)  
  2.                throws NameNotFoundException {  
  3.            try {  
  4.                PackageInfo pi = mPM.getPackageInfo(packageName, flags);  
  5.                if (pi != null) {  
  6.                    return pi;  
  7.                }  
  8.            } catch (RemoteException e) {  
  9.                throw new RuntimeException("Package manager has died", e);  
  10.            }  
  11.   
  12.            throw new NameNotFoundException(packageName);  
  13.        }  

這裡的mPM就是IPackageManager,PackageManagerService就是對IPackageManager的實現。所以我們平時對PackageManager的調用,最終是的在PackageManagerService.java中實現的。在PackageManagerService.java每個方法的實現。

PackageManagerService啟動流程:

PackageManagerService(context, factoryTest)是包管理服務的主進程。它完成了對/system/app,/data/app,/system/framework,/data/app-private下的apk文件的解析。詳細流程如下:

1.建立java層的installer與c層的installd的socket聯接,使得在上層的install,remove,dexopt等功能最終由installd在底層實現

2.建立PackageHandler消息循環,用於處理外部的apk安裝請求消息,如adb install,packageinstaller安裝apk時會發送消息

3.解析/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等幾個集合中供系統查詢和權限配置使用。

4.檢查/data/system/packages.xml是否存在,這個文件是在解析apk時由

writeLP()創建的,裡面記錄了系統的permissions,以及每個apk的name,codePath,flags,version,uesrid等信息,這些信息主要通過apk的

AndroidManifest.xml解析獲取,解析完apk後將更新信息寫入這個文件並保

存到flash,下次開機直接從裡面讀取相關信息添加到內存相關列表中。當有apk

升級,安裝或刪除時會更新這個文件。

5.檢查BootClassPath,mSharedLibraries及/system/framework下的jar

是否需要dexopt,需要的則通過dexopt進行優化

6.啟動AppDirObserver線程監測/system/framework,/system/app,/data/app,/data/

app-private目錄的事件,主要監聽add和remove事件。對於目錄監聽底層通過

inotify機制實現,inotify 是一種文件系統的變化通知機制,如文件增加、刪除

等事件可以立刻讓用戶態得知,它為用戶態監視文件系統的變化提供了強大的支持。

當有add event時調用scanPackageLI(File , int , int)處理;

當有remove event時調用removePackageLI()處理;

7.對於以上幾個目錄下的apk逐個解析,主要是解析每個apk的AndroidMa-

nifest.xml文件,處理asset/res等資源文件,建立起每個apk的配置結構信息,

並將每個apk的配置信息添加到全局列表進行管理。f

8.將解析的每個apk的信息保存到packages.xml和packages.list文件裡,

packages.list記錄了如下數據:pkgName,userId,debugFlag,dataPath(包的數據路徑)

Copyright © Linux教程網 All Rights Reserved