目前有个项目,希望部分应用能运行在system uid下,但是这部分应用是第三方的,我们无法去修改这些应用的属性,因此考虑在framework层对这些特定的应用进行处理。
我们先从底层去找起,看看应用的uid是如何设置下来的。
Android的Java应用基本都是通过ZygoteProcess来启动一个新的process:
Zygote创建应用进程时是收到了AMS的uid参数的,从此处逆推回去,溯源找到这个参数传递的地方:
uid是从ApplicationInfo.uid中获取到的。AMS启动应用进程时设置的uid我们暂且先不研究,我们主要从这条线索往上走,看看什么样的应用uid是为system的。
应用package的uid实际上是由两个部分决定的,一个是普通的应用,一个是sharedUserId。我们知道,如果应用在AndroidManifest.xml中配置:
那么应用的uid就为system,我们先来看一下这部分代码的逻辑。
在PackageManagerService初始化时,就已经将系统的一部分自带的sharedUser添加到系统中:
那么使用的地方在哪呢,在PackageParser解析package的时候就使用到了: