| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android 系统启动到App 界面完全展示终于明白(图文版) -> 正文阅读 |
|
[移动开发]Android 系统启动到App 界面完全展示终于明白(图文版) |
前言系列文章: 之前文章有分析过Activity创建到View的显示过程,属于单应用层面的知识范畴,本篇将结合Android 系统启动部分知识将两者串联分析,以期达到融会贯通的目标。
1. Android 系统启动流程概览
以上为Android 系统上电到桌面启动的简略过程,我们重点关注其中几个进程:
idle 与 init 关系如下: init.rc 启动servicemanager、zygote 配置如下: 2. ServiceManager 进程作用Android 进程间通信运用最广泛的是Binder机制,而ServiceManager进程与Binder息息相关。 App1作为Binder Client端,App2 作为Binder Server端,App2 开放一个接口给App1使用(通常称为服务),此时步骤如下:
由上可知,ServiceManager进程扮演着中介的角色。 3. Zygote 进程创建与fork子进程Zygote 进程的创建Zygote 进程大名鼎鼎,Android 上所有的Java 进程都由Zygote孵化,Zygote名字本身也即是受精卵,当然文雅点一般称为孵化器。 Zygote 进程是由init进程fork出来的,进程启动后从入口文件(app_main.cpp)入口函数开始执行:
通过以上步骤,Zygote 启动完成,并等待创建进程的请求。 初始状态步骤:
用户操作:
用图表示如下: 由上可知,App进程和system_server 进程之间通信方式为Binder,而system_server和Zygote 通信方式为Socket,App进程并不直接请求Zygote做事情,而是通过system_server进行处理,system_server 记录着当前所有App 进程的状态,由它来统一管理各个App的生命周期。 Zygote 进程fork 子进程Zygote 进程在Java层监听Socket请求,收到请求后层层调用最后切换到Native执行系统调用fork()函数,最后根据fork()返回值区分父子进程,并在子进程里执行入口函数。 4. system_server 进程作用system_server 为所有App提供服务,可以说是系统的核心进程之一,它主要的功能如下: 四大组件的交互也要依靠system_server: App 和 system_server 是属于不同的进程,App进程如何找到system_server呢? 5. App 与 system_server 交互App 想要获取系统的功能,在大部分情况下是绕不过system_server的,接着来看看App如何与system_server进行交互。 前面分析过,App想要获取system_server 服务只需要从ServiceManager里获取即可,调用形式如下:
那反过来呢?system_server如何主动调用App的服务呢? 再细化一下流程:
6. Activity 与 View的展示通过上面的分析可知现在的流程已经走到App进程本身,Application、Activity 都已经创建完毕了,什么时候会显示View呢? 接着需要将ViewTree添加到Window里流程如下: 最后监听屏幕刷新信号,当信号到来之后遍历ViewTree进行Measure、Layout、Draw操作,最终渲染到屏幕上,此时我们的App界面就显示出来了。 7. 全流程图附源码路径: 更多Android 源码查看方式请移步:Android-系统源码查看的几种方式 本文基于Android 10 您若喜欢,请点赞、关注、收藏,您的鼓励是我前进的动力持续更新中,和我一起步步为营系统、深入学习Android/Kotlin
|
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/19 1:35:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |