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层的installerc层的installdsocket联接,使得在上层的install,remove,dexopt等功能最终由installd在底层实现

2.建立PackageHandler消息循环,用于处理外部的apk安装请求消息,如adb install,packageinstaller安装apk时会发送消息

3.解析/system/etc/permissionxml文件(framework/base/data/etc/),包括platform.xml和系统支持的各种硬件模块的feature.主要工作:

(1)建立底层user idsgroup 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,以及每个apkname,codePath,flags,version,uesrid等信息,这些信息主要通过apk

AndroidManifest.xml解析获取,解析完apk后将更新信息写入这个文件并保

存到flash,下次开机直接从里面读取相关信息添加到内存相关列表中。当有apk

升级,安装或删除时会更新这个文件。

5.检查BootClassPathmSharedLibraries/system/framework下的jar

是否需要dexopt,需要的则通过dexopt进行优化

6.启动AppDirObserver线程监测/system/framework,/system/app,/data/app,/data/

app-private目录的事件,主要监听addremove事件。对于目录监听底层通过

inotify机制实现,inotify 是一种文件系统的变化通知机制,如文件增加、删除

等事件可以立刻让用户态得知,它为用户态监视文件系统的变化提供了强大的支持。

当有add event时调用scanPackageLI(File , int , int)处理;

当有remove event时调用removePackageLI()处理;

7.对于以上几个目录下的apk逐个解析,主要是解析每个apkAndroidMa-

nifest.xml文件,处理asset/res等资源文件,建立起每个apk的配置结构信息,

并将每个apk的配置信息添加到全局列表进行管理。f

8.将解析的每个apk的信息保存到packages.xmlpackages.list文件里,

packages.list记录了如下数据:pkgNameuserIddebugFlagdataPath(包的数据路径)

  • 1
  • 2
  • 下一页

相关内容