源码位置: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(包的数据路径)。
相关推荐
在Android系统中,PackageManagerService(PMS)是负责管理应用包信息的核心服务之一。它主要处理系统中所有与应用包相关的任务,比如安装、卸载应用,查询应用信息等。PMS在系统启动过程中扮演着重要角色,同时也...
`PackageManagerService`是Android系统中的核心组件之一,负责管理所有应用程序的安装、卸载、升级等操作,同时也是系统权限管理和应用资源查询的关键服务。本文旨在深入剖析`PackageManagerService`的源代码,揭示...
android包管理服务(PackageManagerService)源码分析[整理].pdf
android包管理服务(PackageManagerService)源码分析.pdf
这是 PackageManagerService.pdf
Android PackageManager 有很多方法是没有暴漏出来的,我们如果想调用的话需要用Java反射。android_dependency.jar 提供了反射调用相关的class定义,直接放到你的工程libs目录下面,然后就可以进行反射调用...
本资源"安卓Android源码——Provision.rar"似乎包含的是与Android系统初始化和设备配置相关的代码,即Provisioning过程。Provisioning是Android设备在启动时进行设置和准备的过程,包括激活、用户配置、网络设置等。...
总的来说,安卓Android源码中的软件管理器是整个系统的基石之一,其涉及到的应用安装、更新、权限管理等多个环节,都对用户体验和系统稳定性起着决定性作用。深入研究源码不仅有助于开发高质量的应用,还可以为定制...
【安卓Android源码——生活手册源码.zip】这个压缩包文件看似包含了一组与安卓Android系统源码相关的图片资源,可能是一份详细的生活手册或教程的图像化展示。虽然具体的源代码并未直接提及,但我们可以从标签“安卓...
这份"安卓Android源码——安卓Android中禁止某软件的安装.rar"文件可能包含了一种方法或工具,用于通过修改系统源码来实现这一功能。下面我们将深入探讨这个主题。 首先,了解安卓系统的权限模型至关重要。在安卓中...
`PackageManagerService`是Android系统服务的一部分,负责处理应用程序的包管理任务,包括权限管理。通过修改这个服务的`checkPermission`和`checkUidPermission`方法,可以使应用程序在启动时无需用户同意就能获得...
综上所述,"安卓Android源码——RegTable.rar"可能涉及Android系统的核心组件、服务管理、权限控制等多个方面。对这个主题的深入探究有助于开发者更全面地了解Android的工作机制,从而进行更有效的系统定制和应用...
在安卓(Android)系统中,获取应用程序信息是开发者经常需要进行的操作。这涉及到对系统程序列表的访问,包括应用的名称、图标、包名、版本信息等。Android源码提供了丰富的API和接口来实现这一功能。本文将深入...
在安卓(Android)系统中,程序的安装、卸载和更新是用户与应用程序交互的核心环节。深入了解这些过程有助于开发者优化应用的部署和管理。这里,我们将深入探讨Android源码中的相关实现机制。 首先,让我们来看程序...
Android应用程序在安装的过程中,安装服务PackageManagerService会为它们分配一个唯一的UID和GID,以及根据应用程序所申请的权限,赋予其它的GID。有了这些UID和GID之后,应用程序就只能限访问特定的文件,一般就是...
在安卓(Android)系统中,应用的安装与管理是用户自由度相当高的一个部分,但有时出于安全或特定需求,我们可能需要禁止某些应用程序的安装。这篇内容将深入解析如何在Android源码层面实现这一功能。 首先,我们...
在这个“安卓Android源码——Activity设置相同的action进行判断源码.zip”压缩包中,包含的资源可能帮助我们深入理解这一过程。 首先,让我们了解Intent的作用。Intent是Android中的一种消息对象,用于在应用程序的...
### Android核心分析之Android启动过程详解 Android启动过程是一个复杂且有序的流程,涉及多个关键阶段,从硬件初始化到最终的用户界面呈现。这一过程可以分为四大步骤:init进程启动、Native服务启动、...