在前面的学习中,我们了解到在创建用户和内核的虚拟空间的时候,会开辟 1M-8K 的内存空间,用于当前进程与 Binder 驱动进行传递数据,但是在实际传输过程中,其实并不能达到1M-8k的数据。这里我们就来分析一下 Binder 通信数据传输的限制。
一、Linux系统启动
Linux 系统在启动的时候,会有 init 进程创建 Zygote 进程和 ServiceManager 进程。ServceManager 进程主要是用来注册和查询系统 Service,主要和 system_server 进程进行跨进程通信。Android 的其他进程都是有 Zygote 进程 fork 出来的,在 Zygote 进程完成初始化进行功能加载(即执行 ZygoteInit.main())的时候,会完成 fork 出 system_server 进程和建立与 AMS 能够 socket 通信的 ZygoteServer。
在 system_server 进程完成初始化进行功能加载(即 SystemServer.main())的时候,在通过 startBootstrapService() 加载 ActivityManagerService,在 startOtherServices() 启动其他 Service 之后,会调用到 mActivityManagerService.systemReady() 来启动 Launcher。
此时完成整个系统的启动。
二、APP进程的创建
在 APP 进程创建或者 AIDL 服务进程在创建的时候,AMS 就会通知 Zygote 进程 fork 一个 APP 进程,在 Zygote 进程中初始化该 APP 进程的时候,会调用到 Native 层的 app_main.cpp 中的 onZygoteInit