PackageManagerService原理之启动篇

PackageManagerService属于Android framework中很重要的一个模块,应用安装、卸载、Intent的匹配、package的解析等都和它有关。下面从PackageManagerService的启动和在Context中获取PackageManager对象理一理整个过程。

 本文是基于Android10源码分析,其他版本可能有细微的差异,但是总体流程相差无几。涉及到的类有:

frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/core/java/android/content/pm/IPackageManager.aidl
frameworks/base/core/java/android/content/pm/PakcageManager.java
frameworks/base/core/java/android/app/ApplicationPakcageManager.java
frameworks/base/services/core/java/com/android/server/pm/PakcageManagerservice.java
frameworks/base/core/java/android/os/ServiceManagerNative.java

文章目录结构如下:

PackageManagerService 启动

 PackageManagerService(后面我们简称为PMS)是在SystemServer进程启动过程中被拉起的,具体时序如下:
在这里插入图片描述

//frameworks/base/services/java/com/android/server/SystemServer.java
private void startBootstrapServices() {
   
     // 省略部分代码
     Installer installer = mSystemServiceManager.startService(Installer.class);
     //省略部分代码......
     //调用PackageManagerService.main()方法,创建PackageManagerService对象
     mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
             mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
     mFirstBoot = mPackageManagerService.isFirstBoot();
     mPackageManager = mSystemContext.getPackageManager();
     if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {
   
         MetricsLogger.histogram(null, "boot_package_manager_init_ready",
                 (int) SystemClock.elapsedRealtime());
     }
     // Manages A/B OTA dexopting. This is a bootstrap service as we need it to rename
     // A/B artifacts after boot, before anything else might touch/need them.
     // Note: this isn't needed during decryption (we don't have /data anyways).
     if (!mOnlyCore) {
   
         boolean disableOtaDexopt = SystemProperties.getBoolean("config.disable_otadexopt",false);
         if (!disableOtaDexopt) {
   
             traceBeginAndSlog("StartOtaDexOptService");
             try {
   
                 OtaDexoptService.main(mSystemContext, mPackageManagerService);
             } catch (Throwable e) {
   
                 reportWtf("starting OtaDexOptService", e);
             } finally {
   
                 traceEnd();
             }
         }
     }
 }

 可以看到PackageManagerService对象是在SystemServer.startBootstrapServices()方法中创建的,我们看下PackageManagerService.main()方法。

//frameworks/base/services/core/java/com/android/server/pm/PakcageManagerservice.java
public static PackageManagerService main(Context context, Installer installer,
        boolean factoryTest, boolean onlyCore) {
   
    //检测pm.dexopt.xxx类型的系统属性是否被设置以及值是否合法
    PackageManagerServiceCompilerMapping.checkProperties();
    //创建PackageManagerService对象
    PackageManagerService m = new PackageManagerService(context, installer,
            factoryTest, onlyCore);
    m.enableSystemUserPackages();
    ServiceManager.addService("package", m);
    //创建PackageManagerNative对象
    final PackageManagerNative pmn = m.new PackageManagerNative();
    ServiceManager.addService("package_native", pmn);
    return m;
}

在了解PackageManagerService对象初始化之前,我们先看下PackageManagerService相关的类关系图

在这里插入图片描述

  • IPackageManager: AIDL接口,定义了PackageManagerService提供的方法。
  • PackageManagerService:IPackageManager接口的实现类,实现了IPackageManager.aidl中定义的方法。
  • Installer:系统服务,实际上是installd的客户端,用于提供应用安装、卸载等接口。
  • PackageManager:PackageManagerService对应用层提供接口的抽象类,应用通过Context的getPackageManager()抽象方法获取PackageManager对象;而最终实现是在ContextImpl的getPackageManager()方法中返回了ApplicationPackageManager对象。
  • ApplicationPackageManager:PackageManager的子类,依赖PakcageManagerService。所实现的抽象方法的功能都是通过PackageManagerService实现的。这样ApplicationPackageManager就把应用层接口PackageManager和PackageManagerService关联了起来。
  • PackageManagerInternal:为本地系统服务提供的PackageManagerService接口
  • IPackageManagerNative:定义了PackageManager中需要暴露给native层的方法,这些方法要和PackageManager.java中的方法对应上。
  • PackageManagerNative:IPackageManagerNative接口实现类。

PackageManagerService对象初始化

PackageManagerService的构造方法很长,根据EventLogTags中的定义可分为五个阶段,用伪代码表示为

public PackageManagerService(Context context, Installer installer,
        boolean factoryTest, boolean onlyCore) {
   
        ...
        //阶段1:BOOT_PROGRESS_PMS_START
        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,
                SystemClock.uptimeMillis());
 
        //阶段2:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START 
        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SYSTEM_SCAN_START,
                    startTime);
        ...
        
        //阶段3:BOOT_PROGRESS_PMS_DATA_SCAN_START 
        if (!mOnlyCore) {
   
                EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
                        SystemClock.uptimeMillis());
        }
        ...
        //阶段4:BOOT_PROGRESS_PMS_SCAN_END 
        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END,
                    SystemClock.uptimeMillis());
        ...
        //阶段5:BOOT_PROGRESS_PMS_READY
        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_READY,
                    SystemClock.uptimeMillis());
}

BOOT_PROGRESS_PMS_START

这个阶段主要做了以下内容的工作

  • 将PMS对象封装成PackageManagerInternal对象,保存在LocalService中以便同一进程可以访问;
  • 创建UserManagerService对象;
  • 创建ComponentResolver对象,该对象用于解析Android四大组件。
  • 创建PermissionManagerService对象;
  • 创建Settings对象,注意该对象并不是Settings Provider,而是com.android.server.pm.Settings;用于保存动态设置的信息,比如应用权限、签名信息。
  • 为不同的SharedUserId添加不同的权限;
  • 加载应用的签名文件mac_permissions.xml
  • 创建PackageDexOptimizer、DexManager、ArtManagerService对象;
  • 创建SystemConfig实例,获取系统配置信息,配置共享lib库和权限配置信息
  • 创建不同用途的HandlerThread和Handler对象

这个过程总结起来就是使劲造,造什么?造对象呗。

public PackageManagerService(Context context, Installer installer,
           boolean factoryTest, boolean onlyCore) {
   
       LockGuard.installLock(mPackages, LockGuard.INDEX_PACKAGES);
       Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "create package manager");
       EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,
               SystemClock.uptimeMillis());

       if (mSdkVersion <= 0) {
   
           Slog.w(TAG, "**** ro.build.version.sdk not set!");
       }

       mContext = context;

       mFactoryTest = factoryTest;
       mOnlyCore = onlyCore;
       mMetrics = new DisplayMetrics();
       mInstaller = installer;

       // Create sub-components that provide services / data. Order here is important.
       synchronized (mInstallLock) {
   
       synchronized (mPackages) {
   
           //将PackageManagerService封装成PackageManagerInternal对象,然后保存在LocalService中,LocalService中的对象只能在同一进程中被访问。
           LocalServices.addService(
                   PackageManagerInternal.class, new PackageManagerInternalImpl());
           sUserManager = new UserManagerService(context, this,
                   new UserDataPreparer(mInstaller, mInstallLock, mContext, mOnlyCore), mPackages);
           mComponentResolver = new ComponentResolver(sUserManager,
                   LocalServices.getService(PackageManagerInternal.class),
                   mPackages);
           mPermissionManager = PermissionManagerService.create(context,
                   mPackages /*externalLock*/);
           mDefaultPermissionPolicy = mPermissionManager.getDefaultPermissionGrantPolicy();
           mSettings = new Settings(Environment.getDataDirectory(),
                   mPermissionManager.getPermissionSettings(), mPackages);
       }
       }
		//为不同的SharedUserId添加不同的权限;
       mSettings.addSharedUserLPw("android.uid.system", Process.SYSTEM_UID,
               ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
       mSettings.addSharedUserLPw("android.uid.phone", RADIO_UID,
               ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
       mSettings.addSharedUserLPw("android.uid.log", LOG_UID,
               ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
       mSettings.addSharedUserLPw("android.uid.nfc", NFC_UID,
               ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
       mSettings.addSharedUserLPw("android.uid.bluetooth", BLUETOOTH_UID,
               ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
       mSettings.addSharedUserLPw("android.uid.shell", SHELL_UID,
               ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
       mSettings.addSharedUserLPw("android.uid.se", SE_UID,
               ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
       mSettings.addSharedUserLPw("android.uid.networkstack", NETWORKSTACK_UID,
               ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);

       String separateProcesses = SystemProperties.get("debug.separate_processes");
       if (separateProcesses != null && separateProcesses.length() > 0) {
   
           if ("*".equals(separateProcesses)) {
   
               mDefParseFlags = PackageParser.PARSE_IGNORE_PROCESSES;
               mSeparateProcesses = null;
               Slog.w(TAG, "Running with debug.separate_processes: * (ALL)");
           } else {
   
               mDefParseFlags = 0;
               mSeparateProcesses = separateProcesses.split(",");
               Slog.w(TAG, "Running with debug.separate_processes: "
                       + separateProcesses);
           }
       } else {
   
           mDefParseFlags = 0;
           mSeparateProcesses = null;
       }

       mPackageDexOptimizer = new PackageDexOptimizer(installer, mInstallLock, context,
               "*dexopt*");
       mDexManager = new DexManager(mContext, this, mPackageDexOptimizer, installer, mInstallLock);
       mArtManagerService = new ArtManagerService(mContext, this, installer, mInstallLock);
       mMoveCallbacks = new MoveCallbacks(FgThread.get().getLooper());

       mViewCompiler = new ViewCompiler(mInstallLock, mInstaller);

       mOnPermissionChangeListeners = new OnPermissionChangeListeners(
               FgThread.get().getLooper());

       getDefaultDisplayMetrics(context, mMetrics);

       Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "get system config");
       //解析设备根目录、vendor、odm、oem以及product目录下的etc/sysconfig和etc/permissions中的配置和权限文件。
       SystemConfig systemConfig = SystemConfig.getInstance();
       mAvailableFeatures = systemConfig.getAvailableFeatures();
       Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);

       mProtectedPackages = new ProtectedPackages(mContext);

       mApexManager = new ApexManager(context);
       synchronized (mInstallLock) {
   
       // writer
       synchronized (mPackages) {
   
           //创建HandlerThread对象。
           mHandlerThread = new ServiceThread(TAG,
                   Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);
           mHandlerThread.start();
           //创建PackageHandler对象,Handler在子线程中处理Message。
           mHandler = new PackageHandler(mHandlerThread.getLooper());
           mProcessLoggingHandler = new ProcessLoggingHandler();
           Watchdog.getInstance().addThread(mHandler, WATCHDOG_TIMEOUT);
           mInstantAppRegistry = new InstantAppRegistry(this);

           ArrayMap<String, SystemConfig.SharedLibraryEntry> libConfig
                   = systemConfig.getSharedLibraries();
           final int builtInLibCount = libConfig.size();
           for (int i = 0; i < builtInLibCount; i++) {
   
               String name = libConfig.keyAt(i);
               SystemConfig.SharedLibraryEntry entry = libConfig.valueAt(i);
               addBuiltInSharedLibraryLocked(entry.filename, name);
           }

           // Now that we have added all the libraries, iterate again to add dependency
           // information IFF their dependencies are added.
           long undefinedVersion = SharedLibraryInfo.VERSION_UNDEFINED;
           for (int i = 0; i < builtInLibCount; i++) {
   
               String name = libConfig.keyAt(i);
               SystemConfig.SharedLibraryEntry entry = libConfig.valueAt(i);
             
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值