Android 进阶解密知识

android系统初始化分为三个过程:

  • Init 进程
  • Zygote进程
  • SystemServer进程
Init进程完成的任务:
  • 启动属性服务器,类似window上的注册表
  • 挂在Linux内核文件
  • fork得到Zygote进程
Zygote进程:

Zygote进程由AppRuntime调用start方法启动

  • 启动java虚拟机,注册jni方法
  • 创建Socket 与客户端进行通讯。同事进入无限循环处理AMS发过来的请求
  • 启动SystemServer进程
SystemServer进程:
  • 启动Binder池,这样就可以进行进程间通讯
  • 创建SystemServerManager。用于管理系统服务
  • 启动系统 的各种服务,例如AMS,PMS
Launcher过程:

SystemServer.startOtherService方法 –> ActivityManagerService的systemReady方法 –> startHomeActivityLocked方法 –> ActivityStackSupervisor的startHomeActivity方法 –> 执行Activity的启动逻辑,执行scheduleResumeTopActivities()方法。

Launcher 启动应用进程

通过intent的隐式启动首先会执行到:mInstrumentation.execStartActivity-------> ActivityManagerNative.getDefault().startActivity()---------------> ams.startProcessLocked---------> zygoteProcess.start------------>zygoteinit.runselectLo0p-------->zygote.runonce------->zygoteConnect 与socket建立连接------------->zygoteConnect fork应用进程------>handleChild or handleParent 进而通过RuntimeInit throw exception 进入ActivityThread的main方法

总结:

  • android应用进程会在需要启动其组件的时候启动,当没有任何组件运行或者是系统内存较低的时候应用进程会被杀死。

  • 在启动应用四大组件的时候若发现当前应用的进程没有启动,则会首先启动应用程序的进程。

  • 我们可以为应用程序配置多个进程,每个进程都有自己的JVM和运行环境,各个进程之间的通讯需要通过Binder机制。

Launcher启动的过程也是先启动Launcher进程再启动其Activity组件

Activity跳转流程

Activity.startActivity------> mInstrumentation.execStartActivity------->ActivityManagerNative.getDefault().startActivity()------->AMS.startActivityAsUser----------->ActivityStackSuperVisor.realStartActivityLocked-------ApplicationThread.scheduleLaunchActivity-------->ActivityThread.performLaunchActivity

Service start过程

activity.startService----->ContextImple.startService----->AMS.startService------->ActivityServices.realStartServiceLocked------->ApplicationThread.scheduleCreateService----------->ActivityThread.handleCreateService

Broadcast过程

从实现原理看上,Android中的广播机制使用了观察者模式,基于消息的发布/订阅模型。
广播发送者和广播接收者分别属于观察者模式中的消息发布和订阅两端,AMS属于中间的处理中心。

整体来看,流程可粗略概括如下:
1.广播接收者BroadcastReceiver,通过Binder通信向AMS进行注册;

2.广播发送者通过Binder通信向AMS发送广播;

3.AMS收到广播后,查找与之匹配的BroadcastReceiver,然后将广播发送到BroadcastReceiver对应进程的消息队列中;

4.BroadcastReceiver对应进程的处理该消息时,将回调BroadcastReceiver中的onReceive()方法;

5.广播处理完毕后,BroadcastReceiver对应进程按需将执行结果通知给AMS,以便触发下一次广播发送。

对于不同的广播类型,以及不同的BroadcastReceiver注册方式,具体实现上会有不同,但整体的通信流程大致相似

原文:https://blog.csdn.net/Gaugamela/article/details/53515680

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容