Android Frameworks 包管理系统(1)PackageManagerService初始化

本文介绍了Android的PackageManagerService,包括其功能,如权限处理、包管理,以及启动过程,如创建Settings对象、解析权限和feature信息。详细阐述了PackageManagerService的初始化步骤,如启动PackageHandler、解析packages.xml文件,并讨论了scanDirLi扫描安装apk的过程。
摘要由CSDN通过智能技术生成

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初始化流程
PackageManagerService初始化流程
加下来分析PackageManangerService的构造函数

1 创建并初始化Settings对象

分为两个步骤 :

  1. 创建Settings对象
  2. 增加默认共享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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值