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个阶段:
-
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START, SystemClock.uptimeMillis());
-
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SYSTEM_SCAN_START, startTime);
-
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START, SystemClock.uptimeMillis());
-
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END, SystemClock.uptimeMillis())
-
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);
...
待续…