• PackageManagerService.java 构造函数的 分析


    源码位置:frameworks/base/core/java/android/content/pm/PackageParser.java

    源文件路径:android\frameworks\base\services\java\com\android\server\PackageManagerService.java

    1.PackageManagerService.java 用到一个很重要的工具类,PackageParser.java

    这里面是一些 工具类 和 工具方法,辅助PackageManagerService来完成一些功能。

    下面 分析一下PackageManagerService的 启动流程


    1.PackageManagerService中有一个静态方法:main()。生成一个IPackageManager接口,也就是PackageManagerService。下面我们主要看PackageManagerService的构造方法。
    public static final IPackageManager main(Context context, boolean factoryTest) {
            PackageManagerService m = new PackageManagerService(context, factoryTest);
            ServiceManager.addService("package", m);
            return m;
        }

    2.构造方法中,首先会进行一些成员变量的初始化,比如mContext, mFactoryTest, mMetrics, mSettings等。
        a. 最重要的是初始化mInstaller这个变量Installer是一个很重要的类,所有对apk的install, uninstall,move等操作,都是通过它进行的
        Installer installer = new Installer();
            if (installer.ping() && Process.supportsProcesses()) {
                mInstaller = installer;
            } else {
                mInstaller = null;

            }


        b.建立PackageHandler消息循环,用于处理 外部的apk安装 请求消息如adb install,packageinstaller安装apk时会 发送消息
        mHandlerThread.start();
            mHandler = new PackageHandler(mHandlerThread.getLooper());

    4.解析 编译后的 system/etc/permission下xml文件(framework/base/data/etc/),包括 platform.xml 和 系统支持的各种硬件模块的feature.

    主要工作:

    (1)建立底层user ids和group ids 同上层permissions之间的映射;可以指定一个权限与几个组ID对应。当一个APK被授予这个权限时,它也同时属于这几个组。
    (2)给一些底层用户分配权限,如给shell授予各种permission权限;把一个权限赋予一个UID,当进程使用这个UID运行时,就具备了这个权限。
    (3) library,系统增加的一些应用需要link的扩展jar库;

    (4) feature,系统每增加一个硬件,都要添加相应的feature.将解析结果放入mSystemPermissions,mSharedLibraries,mSettings.mPermissions,mAvailableFeatures等几个集合中供系统查询和权限配置使用。


    5.检查/data/system/packages.xml是否存在这个文件是 解析apk时 由writeLP() 创建的里面记录了系统的permissions,以及每个apk的name, codePath, flags, ts, version, uesrid等信息这些信息主要通过apk的AndroidManifest.xml 解析获取,解析完apk后将更新信息写入这个文件并保存到flash,下次开机直接从里面读取相关信息添加到内存相关列表中。当有apk升级,安装或删除时会更新这个文件。

    6.检查BootClassPath,mSharedLibraries及/system/framework下的jar
    是否需要dexopt,需要的则通过dexopt进行优化

    7.启动AppDirObserver线程 监测/system/framework, /system/app, /data/app, /data/app-private目录 的事件,主要 监听add和remove事件。对于目录监听底层 通过inotify机制实现,inotify 是一种 文件系统的变化 通知机制,如文件增加、删除 等事件可以立刻让用户态得知,它为 用户态 监视文件系统的变化提供了强大的支持。
    当有add event时调用scanPackageLI(File , int , int)处理;
    当有remove event时调用removePackageLI()处理;


    8.对于以上几个目录下的apk逐个解析,主要是解析每个apk的AndroidManifest.xml文件,处理asset/res等资源文件,建立起每个apk的配置结构信息,并将每个apk的配置信息添加到全局列表进行管理。调用installer.install()进行安装工作,检查apk里的dex文件是否需要再优化,如果需要优化则通过辅助工具dexopt进行优化处理;将解析出的componet添加到pkg的对应列表里;
    对apk进行 签名 和 证书校验, 进行完整性验证。

    9.将解析的每个apk的信息保存到packages.xml和packages.list文件里,packages.list记录了如下数据:pkgName,userId,debugFlag,
    dataPath(包的数据路径)。





  • 相关阅读:
    UDP的坏处
    进程控制块(Process Control Block, PCB)
    分布式中一些关键概念的解释
    线程池的设计实现
    [原创] 同步、异步、阻塞、非阻塞详解
    常用场景对文件状态的影响
    echo使用说明,参数详解
    Linux下源码安装ffmpeg及ffmpeg的简单使用说明
    127.0.0.1、0.0.0.0和本机IP地址的区别和使用
    链路层的简介和MTU
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744868.html
Copyright © 2020-2023  润新知