【安卓开机启动】PKMS启动流程(writing)

PKMS,即PackageManagerService。是安卓framework中另一个重要的服务,在安卓APP开发时,我们可以用PKMS获取应用包名,版本号(code/name)与查询应用图标等。
之所以叫PKMS而非PMS是因为在安卓中有太多“PMS”了,例如PowerManagerService。

要了解PKMS的启动流程,关注以下几个类。

  • frameworks/base/services/java/com/android/server/SystemServer.java
  • frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
  • frameworks/base/services/core/java/com/android/server/pm/Settings.java
  • frameworks/base/core/java/android/content/pm/PackageParser.java
  • frameworks/base/core/java/android/content/res/AssetManager.java

1、System_server启动PKMS

frameworks/base/services/java/com/android/server/SystemServer.java

private void startBootstrapServices() {
...
	        // Start the package manager.
        traceBeginAndSlog("StartPackageManagerService");
        try {
            Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");
            mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        } finally {
            Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");
        }
        mPackageManager = mSystemContext.getPackageManager();
        traceEnd();
}
...

可以看到,System_server调用 PackageManagerService.main()方法启动了PKMS。
此main方法非常简单,就是new了一个PKMS对象,然后调用ServiceManager.addService()方法将其注册到ServiceManager中。
PKMS启动的关键也是在其构造函数new方法中。

 frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
 
    public static PackageManagerService main(Context context, Installer installer,
            boolean factoryTest, boolean onlyCore) {
        // Self-check for initial settings.
        PackageManagerServiceCompilerMapping.checkProperties();

        PackageManagerService m = new PackageManagerService(context, installer,
                factoryTest, onlyCore);
        m.enableSystemUserPackages();
        ServiceManager.addService("package", m);
        final PackageManagerNative pmn = m.new PackageManagerNative();
        ServiceManager.addService("package_native", pmn);
        return m;
    }

启动PMS过程中,主要就是执行PMS的构造函数。

2、PMS的构造函数

在PMS构造阶段,有EventLog输出明显区分为5个阶段:

  1.     EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,
            SystemClock.uptimeMillis());
    
  2.      EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SYSTEM_SCAN_START,
                 startTime);
    
  3.      EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
                     SystemClock.uptimeMillis());
    
  4.      EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END,
                 SystemClock.uptimeMillis())
    
  5.      EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_READY,
                 SystemClock.uptimeMillis());
    

2.1 BOOT_PROGRESS_PMS_START

public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) {
...
//准备一些成员变量,其中Injector对象实在PMS.main()方法中初始化然后传过来的。
//Injector对象中包含了context,该context为SystemServer的mSystemContext。
//onlyCore标记是否只加载核心服务,正常开机启动过程此变量为false。
       mContext = injector.getContext();
        mFactoryTest = factoryTest;
        mOnlyCore = onlyCore;
        mMetrics = new DisplayMetrics();
        mInstaller = injector.getInstaller();
        
        // 公开供系统组件使用的私有服务,系统组件只需要在LocalServices中找PMS使用即可,不需要在servicemanager中findService()。
        //类似的在其他系统服务中也会有对应的Internal对象,如:ActivityManagerInternal。
        mPmInternal = new PackageManagerInternalImpl();
        LocalServices.addService(PackageManagerInternal.class, mPmInternal);
        
        //创建Setting对象,Setting对象是可以用于全局存储的对象。在创建此Setting的过程中,
        //也会/data/system目录下的文件,如:packages.xml,packages.list等
        mSettings = injector.getSettings();

		//往Setting中添加shareUserId
        t.traceBegin("addSharedUsers");
        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);
        t.traceEnd();
        
        //获取系统配置信息
        t.traceBegin("get system config");
        SystemConfig systemConfig = SystemConfig.getInstance();
        mAvailableFeatures = systemConfig.getAvailableFeatures();
        ApplicationPackageManager.invalidateHasSystemFeatureCache();
        t.traceEnd();

		// writer
		        synchronized (mLock) {
		     //PMS Looper init
            mHandlerThread = new ServiceThread(TAG,
                    Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);
            mHandlerThread.start();
            //PMS Handler init
            mHandler = new PackageHandler(mHandlerThread.getLooper());
           	//add
            Watchdog.getInstance().addThread(mHandler, WATCHDOG_TIMEOUT);
        ...

待续…

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值