[记录]PackageManagerService

PackageManagerService(PMS)由SystemServer创建,用以管理所有jar和app的安装、卸载。

SystemServer:startBootstrapServices() -> PackageManagerService:main() -> new PackageManagerService() -> ServiceManager.addService()


PMS构造方法分析:

1. 创建一个Settings对象,用来存储一些重要的运行时设定,内部定义的mSharedUsers以share user id(如android.userid.system)为key管理一个SharedUserSettings,可以找到所有共享同一个user id的所有package。两个或多个声明了同一种sharedUserIds的APK可共享彼此的数据,并且可运行在同一进程中。(PMS构造会将一些user id如system、phone等加入到Settings,process uid/gid定义在Process.java)

《[记录]PackageManagerService》

2. 设置installer,Installer内部有一个InstallerConnection对象,此对象会通过socket向installd发送请求,如获取app大小等。

3. 启动一个HandlerThread,将程序的安装和卸载逻辑丢到PackageHandler后台thread做处理。

4. 通过SystemConfig:readPermissions从/etc/permissions/platform.xml等文件中读取相关permission,其中定义了每个permission由具有哪些uid/gid的进程所具备。

<permission name=”android.permission.BLUETOOTH_ADMIN” >

       <group gid=”net_bt_admin” />

 </permission>

《[记录]PackageManagerService》

5. 通过readLpw解析packages.xml得到当前安装的package相关讯息。

·  packages.xml:PKMS扫描完目标文件夹后会创建该文件。当系统进行程序安装、卸载和更新等操作时,均会更新该文件。该文件保存了系统中与package相关的一些信息。

·  packages.list:描述系统中存在的所有非系统自带的APK的信息。当这些程序有变动时,PKMS就会更新该文件。

·  packages-stopped.xml:从系统自带的设置程序中进入应用程序页面,然后在选择强制停止(ForceStop)某个应用时,系统会将该应用的相关信息记录到此文件中。也就是该文件保存系统中被用户强制停止的Package的信息。

6. 将所有的shared library调用Installer的dexopt方法进行优化,将优化过的odex或者oat文件放入dalvik-cache folder下。如果被依赖的库文件发生变化,其cache会删除重新生成,依赖其的jar或者app也需要重新进行dexopt。

7. 调用scanPackageLi对/system/framework,/system/priv-app, /system/app等folder下的文件进行扫描,通过PackageParser对AndroidManifest文件进行解析存入不同的数据结构进行维护。

《[记录]PackageManagerService》

《[记录]PackageManagerService》

8. 收尾工作,删除临时文件,将之前收集的信息再集中整理一次,比如将有些信息保存到文件中,显示调用GC释放内存等。


[附一]

PackageManagerService相关类图结构:

《[记录]PackageManagerService》

[附二]

Android UID和GID分别表示User ID和Group ID,Linux用此作权限管理。在Android中多个进程可以通过在Manifest中定义android:shareUserId指定和其他进程相同的user id。

   public static final int SYSTEM_UID = 1000;

   public static final int PHONE_UID = 1001;


[附三]

framework-res.apk还包含了以下几个常用的Activity。

·  ChooserActivity:当多个Activity符合某个Intent的时候,系统会弹出此Activity,由用户选择合适的应用来处理。

·  RingtonePickerActivity:铃声选择Activity。

·  ShutdownActivity:关机前弹出的选择对话框。

[问题]

1. Android app default 的user id和group id是如何生成的。


[参考资料]

[深入理解Android卷二 全文-第四章]深入理解PackageManagerService

http://blog.csdn.net/innost/article/details/47253179

    原文作者:regcwt
    原文地址: https://blog.csdn.net/regcwt/article/details/75210307
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞