2

因此,我一直在围绕AOSP进行挖掘,试图找出如何安装android应用程序。到目前为止,这是我在哪里:了解如何通过PackageManagerService安装android应用程序

apk文件将从PackageInstallerActivity发送到InstallAppProgress,它将在其中调用PackageManager方法installPackage()。

先前对PackageManager的调用被定向到PackageManagerService,带着AIDL的魔力(花了一些时间让我理解这一点)。

在核心方法installPackageWithVerification()的PackageHandler的一个实例被创建和消息传递发生在鲁棒的方式与一群的像INIT_COPY状态码的使用,PACKAGE_VERIFIED等

基于在处理程序中接收的消息的状态代码上进行操作。开始INIT_COPY - 将包添加到挂起的安装列表中,并调用代码为的消息MCS_BOUND

这复制了从apk文件中提取的基本文件,如数据文件。

在通道的某个地方发出带有标记CHECK_PENDING_VERIFICATION的消息,该消息从待处理列表中解析条目,尤其是AndroidManifest文件。验证和验证包裹签名,包装名称等等。

然后调用updateSettingLI()这反过来又产生3个更重要的函数调用。

  • moveDexFilesLI()
  • setPermissionsLI() - 提取目录资源/文件,resources.arsc,的Manifest.xml
  • updatePermissionsLPw() - 电话grantPermissionLPw - 和增加的组识别从清单文件中解析出的权限

在此时间点,Package对象具有各自的groupid,因此unti我现在能够基本弄清楚权限是如何转换成groupids的。请原谅我的咆哮,我认为这可能对某些用户来说是非常有用的,特别是scanPackageLI方法,它很容易在代码中迷失方向。

现在的实际问题,我知道比喻在android每个应用程序不过是一个Linux进程控制自己的uid和gid。我们从上面的gids中知道如何从PackageManagerService转换到linux进程。

我知道“installd”在安装过程中也起着至关重要的作用。 但我无法找到正在安装的软件包(Linux进程)设置权限或访问权限(根据linux teminology)的链接?

请帮助我。

+0

有没有什么好的博客或者与此相关的东西,会给出更详细的信息,如果是的话请分享。 –

+0

http://coltf.blogspot.it/p/android-os-processes-and-zygote.html这是一个很好的起点 –

回答

2

非常好的问题。但要找到你的问题的答案,你需要稍微考虑另一个方向,即流程的开始。正如你在Android中可能知道的那样,有一个称为Zygote的特殊过程。这是一个预先加热的过程(意思是在它的内存中已经加载了一些库),并且从这个过程中所有的Android过程都被分离出来。

当你启动一个应用程序时,Android系统通过套接字向Zygote发送一个命令来创建一个新进程。在这个命令中,还会发送一组基于权限分配给应用程序的gid。在Zygote创建了一个新进程后,它设置了传递的gid。因此,分叉进程接收它的uid和gid。但是这个过程只与映射到gid的权限有关。

+0

谢谢您的建议。是的,即使我确实觉得我走错了路,通过Zygote代码确实可以帮助我理解权限设置的细微差别。 特别是dalvik_system_Zygote.cpp中的forkAndSpecialize()方法实际上是为setkeds(gid)为分叉进程设置组IDids部分。 我的问题是,当我们实际上在android中点击一个应用程序时,最终调用到这个部分到底是什么。我想找出路径。你能否帮我指出一些同样的问题。谢谢 –

+1

尝试应用这个链接中的信息:http://coltf.blogspot.it/p/android-os-processes-and-zygote.html其实,如果我没有错,你需要寻找所谓的方法startActivityMayWait(),由ActivityManagerService的startActivity()方法调用 – Yury

+0

非常感谢Yury。这篇文章确实帮了我很大忙。 –

相关问题