一. PackageManagerService启动过程分析
PackageManagerService(PMS)主要是管理应用的安装,卸载,更新,解析以及权限。如果想了解SystemService启动过程请看这篇文章: Android 源码分析(六) SystemServer 进程
如果想了解AMS服务分析请看这篇文章: Android源码分析(十三)ActivityManagerService服务分析
同AMS一样,PMS也是由SystemServer启动的.
public final class SystemServer {
private PackageManagerService mPackageManagerService;
private PackageManager mPackageManager;
...
// Start the package manager.
//启动PMS服务
if (!mRuntimeRestart) {
MetricsLogger.histogram(null, "boot_package_manager_init_start",
(int) SystemClock.elapsedRealtime());
}
traceBeginAndSlog("StartPackageManagerService");
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
traceEnd();
if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {
MetricsLogger.histogram(null, "boot_package_manager_init_ready",
(int) SystemClock.elapsedRealtime());
}
...
}
//PackageManagerService 初始化工作
public class PackageManagerService extends IPackageManager.Stub
implements PackageSender {
public static PackageManagerService main(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
// Self-check for initial settings.
PackageManagerServiceCompilerMapping.checkProperties();
//构造一个PackageManagerService
PackageManagerService m = new PackageManagerService(context, installer,
factoryTest, onlyCore);
m.enableSystemUserPackages();
//添加到ServiceManager
ServiceManager.addService("package", m);
return m;
}
public PackageManagerService(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
//installer apk的安装和卸载最终都是调用installd来实现的。
mInstaller = installer;
mPackageDexOptimizer = new PackageDexOptimizer(installer, mInstallLock, context,
"*dexopt*");
mDexManager = new DexManager(this, mPackageDexOptimizer, installer, mInstallLock);
mMoveCallbacks = new MoveCallbacks(FgThread.get().getLooper());
synchronized (mInstallLock) {
// writer
//环境变量初始化
synchronized (mPackages) {
File dataDir = Environment.getDataDirectory();
mAppInstallDir = new File(dataDir, "app");
mAppLib32InstallDir = new File(dataDir, "app-lib");
mAsecInternalPath = new File(dataDir, "app-asec").getPath();
mDrmAppPrivateInstallDir = new File(dataDir, "app-private");
sUserManager = new UserManagerService(context, this,
new UserDataPreparer(mInstaller, mInstallLock, mContext, mOnlyCore), mPackages);
//权限注册到 package manager,一个权限与几个组ID对应,当一个APK授予这个权限时,它同属于这几个组。
//权限是一个复杂的过程
// Propagate permission configuration in to package manager.
ArrayMap<String, SystemConfig.PermissionEntry> permConfig
= systemConfig.getPermissions();
//遍历权限配置文件
for (int i=0; i<permConfig.size(); i++) {
SystemConfig.PermissionEntry perm = permConfig.valueAt(i);
//拿到权限
BasePermission bp = mSettings.mPermissions.get(perm.name);
if (bp == null) {
bp = new BasePermission(perm.name, "android", BasePermission.TYPE_BUILTIN);
//写入权限
mSettings.mPermissions.put(perm.name, bp);
}
if (perm.gids != null) {
bp.setGids(perm.gids, perm.perUser);
}
}
}
final PackageHandler mHandler;
class PackageHandler extends Handler {
void doHandleMessage(Message msg) {
switch (msg.what) {
}
}
private void scanDirLI(File dir, int parseFlags, int scanFlags, long currentTime) {
final File[] files = dir.listFiles();
if (ArrayUtils.isEmpty(files)) {
Log.d(TAG, "No files in app dir " + dir);
return;
}
ParallelPackageParser parallelPackageParser = new ParallelPackageParser(
mSeparateProcesses, mOnlyCore, mMetrics, mCacheDir,
mParallelPackageParserCallback);
parallelPackageParser.close();
}
File frameworkDir = new File(Environment.getRootDirectory(), "framework");
// Find base frameworks (resource packages without code).
scanDirTracedLI(frameworkDir, mDefParseFlags
| PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR
| PackageParser.PARSE_IS_PRIVILEGED,
scanFlags | SCAN_NO_DEX, 0);
// Collected privileged system packages. 系统安装包
final File privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app");
scanDirTracedLI(privilegedAppDir, mDefParseFlags
| PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR
| PackageParser.PARSE_IS_PRIVILEGED, scanFlags, 0);
// Collect ordinary system packages. 系统app安装包
final File systemAppDir = new File(Environment.getRootDirectory(), "app");
scanDirTracedLI(systemAppDir, mDefParseFlags
| PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
}
PMS里面主要完成以下几件事。
1、通过installer与installd进行连接,进行安装卸载应用操作
2、创建PacakageHandler线程,处理外部应用的安装卸载请求
3、处理系统权限相关配置
4、扫描安装应用,并解析APK安装包信息
二.总结
一张图总结下PMS主要完成的工作,以及对上与PackageManager交互,向下与Installd的控制。如果想了解桌面Launcher应用启动app过程,请看这篇文章。 Android 源码分析(八) Launcher 桌面启动App过程
最后补充一点,如果想要了解APK的编译过程,可以进一步去了解Android4.4之后使用的ART,可以与Dalivk对比了解。
给个Dalivk的启动过程介绍的文章: Android 源码分析(十) Dalvik 虚拟机创建过程
给个Dalivk的启动过程介绍的文章: Android 源码分析(十) Dalvik 虚拟机创建过程
来源:oschina
链接:https://my.oschina.net/u/4350015/blog/3896149