您的当前位置:首页正文

[Android]你不知道的Android进程化(2)--创建进程

2024-12-01 来源:个人技术集锦

大家好,我系苍王。

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。


Android如何创建一个进程?
下面是简述:


Zygote初始化图

(1)Android系统启动的时候会启动Zygote服务(执行ZygoteInit.java)。
(2)Zygote进程启动会做三件事。
*创建socket服务端,监听ActivityManagerService进程的创建请求。
*初始化一些SDK信息
*最后Zygote fork()创建出SystemService 服务,Zygote.forkSystemServer创建。
(3)SystemService 也会执行三件事
*关闭socket非zygote进程允许监听
*获取Dalvim虚拟机去执行RunTimeInit
*初始化各个系统服务

当应用启动时
(1)AMS读取到启动应用的信息,通过socket请求Zygote孵化应用的进程,Zygote.forkAndSpecialize创建。
(2)Zygote是会将信息传递到Native层中,然后Linux使用fork()方法来孵化进程。
(3)fork()会给每个进程启动一个pid(process Id),然后我们通过adb命令就可以看到一些进程信息了。

四大组件运行的进程

1.activity、service、receiver 和 provider四大组件均支持 android:process 属性,该属性可以指定在四大组件哪个进程中运行。
2.application元素支持 android:process 属性,以设置适用于所有组件的默认值。
3.如果内存不足,而其他为用户提供更紧急服务的进程又需要内存时,Android 可能会决定在某一时刻关闭某一进程。在被终止进程中运行的应用组件也会随之销毁。 当这些组件需要再次运行时,系统将为它们重启进程。

Android启动进程的方法

1.使用AndroidManifest中的的android:process来达到多进程的目的。如果android:process的value值以冒号开头的话,那么该进程就是私有进程,如果是以其他字符开头,那么就是公有进程,这样拥有相同 ShareUID 的不同应用可以跑在同一进程里
2.通过JNI利用C/C++,调用fork()方法来生成子进程。

Android关闭进程的方法

关闭当前进程
android.os.Process.killProcess(android.os.Process.myPid());
killProcess的方法其实际是发送信号到Native,让linux通过pid杀死进程。
这里只介绍关闭自身进程,因为并不涉及到要控制关闭其他进程的情况。
如果有兴趣想了解可以查看

Android process启动流程

进程创建流程

关于应用内启动进程,需要深入了解AMS的源码。
1.三个判断进程信息的入口,通过ActivityRecord(Activity)中的processName来获取到Process信息。
Activity->ActivityStackSupervisor.java
Service->ActiveService.java
Broadcast->BroadcastQueue
三个文件都对调用AMS的startProcessLock函数。
2.AMS中有四个startProcessLock的函数,之后会调用Process.start的函数。
其需要调用android.app.ActivityThread为entrypoint入口。
3.Process.start 中会调用startViaZygote函数,然后拼接native命令,调用
zygoteSendArgsAndGetResult函数,编写字节流发送到ZygoteConnection和接收创建结果
4.Zygote是通过socket的方式接收字节流的方式交互,接收到后会触发ZygoteConnection.runOnce()的函数,读取字节流数据,然后通过Zygote.forkAndSpecialize告诉native创建进程,handleChildProc会发送给WrapperInit.execApplication,拼接native命令,转发到Zygote.execShell来反射entrypoint类即android.app.ActivityThread入口初始化进程。

这里给大家推荐一篇分析,虽然之后的源码有所改动,但是其启动逻辑并没有改变。

需要注意的是

1.Service不开启新进程,默认会和Activity跑在同一个主线程(UI线程)上,所以Service如果有耗时操作请一定要启动线程处理。
2.ContentProvider如果App没有启动时,会被默认启动为一个新的进程,如果App存在,没有特定指定进程,会和现有的App运行在同一个进程。

本节就到这里。

你只能向前跑,才能待在原地。

Android进程化交流


显示全文