文章目录
PackageManager功能介绍
Package Manager是Android的应用程序安装包(apk)管理器,功能如下:
- 权限处理,对系统和应用定义的Permission和Permission Group的增加、删除、查询、检查。
- 包处理,扫描安装、卸载APK包,查询包的UID、GID、包名、系统默认程序等信息。
- 比较两个包的Signatures是否相同。
- 查询Activity、Provider、Receiver、Services的信息。
- 查询Application、Package、Resource、Shard Library、Feature信息。
- Intent匹配
体系结构图
- 应用层 Market安装Google Market应用、PackageInstaller.apk 是
/packages/apps/PackageInstaller 目录下默认的apk,用于安装SD卡或内部存储设备上的APK安装包。 - 中间层 1.PackageManger和它的子类ApplicationPackageManager ,上层通过调用该API接口实现功能
2.ADB和pm命令,用来安装和卸载apk。最终实现都在PackageManagerService中。 - 服务层 PackageManagerService及相关类,一些具体的功能由Settings、Installer、FileObserver、DefaultContainerService等模块实现。
PackageManager类关系图
PackageManagerService启动
//frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
...
startBootstrapServices()
...
}
startBootstrapServices(){
...
//mOnlyCore 系统属性加密状态,
String cryptState = SystemProperties.get("vold.decrypt");
if (ENCRYPTING_STATE.equals(cryptState)) {
Slog.w(TAG, "Detected encryption in progress - only parsing core apps");
mOnlyCore = true;
} else if (ENCRYPTED_STATE.equals(cryptState)) {
Slog.w(TAG, "Device encrypted - only parsing core apps");
mOnlyCore = true;
}
//mFactoryTestMode 是否工厂模式,mOnlyCore系统属性是否加密
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
}
//frameworks/base/services/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);
return m;
}
在SystemService启动过程中,调用PackageManagerService的Main方法创建一个新对象,同时将该服务注册到ServiceManager中,注册名为package。
PackageManagerService初始化流程
加下来分析PackageManangerService的构造函数
1 创建并初始化Settings对象
分为两个步骤 :
- 创建Settings对象
- 增加默认共享ID
//frameworks/base/services/java/com/android/server/pm/PackageManagerService.java
//初始化Settings对象
mSettings = new Settings(mPackages);
//增加系统默认的6个UID
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);
看下Settings的构造函数
//frameworks/base/services/java/com/android/server/pm/Settings.java
Settings(File dataDir, Object lock) {
mLock = lock;
mRuntimePermissionsPersistence = new RuntimePermissionPersistence(mLock);
mSystemDir = new File(dataDir, "system");
//创建data/system目录
mSystemDir.mkdirs();
FileUtils.setPermissions(mSystemDir.toString(),
Fi