每一个Android开发,基本都了解或者学习过系统的知识,一是因为国内软件行业内卷,找工作时“面试造火箭,工作拧螺丝”的局面导致的,另一方面,从客观角度来讲,学习Android系统、Framework 等源代码或者其工作方式也可以提升我们,带来以下好处:
- 学习 Android 系统源码可以让开发者更深入地了解系统内部的工作原理和机制,以及各个模块之间的关系。这可以帮助开发者更好地利用系统提供的功能和资源,以及更好地进行调试和优化。
- 学习 Android Framework 等源码可以帮助开发者掌握更高级的开发技能,例如自定义控件、优化性能等。这些技能可以让开发者更好地应对复杂的开发需求和问题。
- 学习 Android Framework 等源码可以让开发者更好地理解系统的工作原理,以及各个模块之间的交互和协作。这可以帮助开发者更快地定位问题、优化代码,并且提高开发效率。
- 如果开发者需要开发定制化的 Android 系统,例如适配特定设备或行业应用,学习 Android 系统源码是必要的。只有深入了解系统的实现原理和机制,才能对系统进行有效的修改和定制。
- 涨工资真的很快,赚钱很多,钱多了就可以娶媳妇儿,让家人过上好生活。
但是系统学习不是必须的,只有从事系统定制开发的同学,才有必要学习,其他人完全没必要,没有必要弄明白按下开关发生了什么?点亮屏幕是怎么做的?
普通的开发者更重要的是学习Framework的知识。
部分人的苦恼
对于Framework的学习从未间断过,但是在工作中也没有使用过,并且学了就忘,我就是这部分人的典型代表,不学感觉实现不了人生理想,学了经常怀疑人生。
那为什么是这样呢?
对于不熟悉的知识记忆是很困难的,特别是走马观花的学习方式,因为Framework的学习都是在大神的基础上跟流程的。
时序图,解决这个苦恼
时序图能展示代码的执行流程,就算记不住,只要有它在,基本能回想起来的。这篇文章从今天开始,会收集或者总计各种Android 底层的、应用层的、对我们开发有用的各种时序图。听懂点赞、关注、收藏
常见的系统时序图
Android系统运行时序图
- 设备启动:设备启动时会运行 Bootloader,Bootloader 会加载并运行内核。
- 内核启动:内核启动后会启动 init 进程,该进程会初始化系统服务和应用程序框架,并启动 Zygote 进程。
- Zygote 进程启动:Zygote 进程是 Android 系统中的一个特殊进程,它负责创建和管理应用程序进程。Zygote 进程会预加载一些常用的类和资源,以提高应用程序的启动速度。
- 应用程序进程启动:当用户打开一个应用程序时,Zygote 进程会根据应用程序的包名创建一个新的进程,并在该进程中启动应用程序的主 Activity。应用程序进程会运行应用程序的代码,并与系统其他组件进行交互,如访问系统服务和接收广播等。
- 关机过程:当用户关闭设备时,Android 系统会向应用程序发送关闭信号,应用程序会进行相应的清理操作,并在完成后退出。最后,系统会关闭进程和服务,并最终关闭设备。
Android 系统启动时序图
系统的启动很复杂,这是一个大致的启动流程,
- 用户按下电源按钮,启动 Android 系统。
- 启动引导程序加载引导程序。
- 引导程序加载内核。
- 内核初始化系统。
- 初始化程序启动 Zygote。
- Zygote 启动系统服务。
- 系统服务初始化 PackageManagerService。
- 系统服务初始化 WindowManagerService。
- 系统服务初始化 PhoneInterfaceManager。
- 系统服务初始化 ActivityManagerService。
- 系统服务初始化其他系统服务。
- 系统服务启动启动器。
- 启动器启动应用程序。
- 应用程序启动活动。
- 活动调用 onCreate 方法。
- 活动调用 onStart 方法。
- 活动调用 onResume 方法。
Activity 启动流程
(Android 10(API level 29))注意,具体的启动流程还有很多细节,这是一个大致流程
- 用户请求启动一个 Activity。
- ActivityManagerService 调用 instrumentation 的 onCreate() 方法。
- instrumentation 创建一个新的 ActivityThread 对象,并将其返回给 ActivityManagerService。
- ActivityManagerService 使用新创建的 ActivityThread 对象调用其 attach() 方法。
- ActivityThread 创建一个新的 Application 对象并将其返回给 ActivityThread。
- Application 返回新创建的 Application 对象给 ActivityManagerService。
- ActivityManagerService 使用新创建的 Application 对象调用 ActivityThread 的 bindApplication() 方法。
- ActivityThread 调用 Application 的 onCreate() 方法。
- Application 从 onCreate() 方法返回给 ActivityThread。
- ActivityThread 带着新创建的 Application 对象返回给 ActivityManagerService。
- ActivityManagerService 调用 AMS 的 scheduleLaunchActivity() 方法。
- ActivityThread 调用 Activity 的 onCreate() 方法。
- Activity 从 onCreate() 方法返回给 ActivityThread。
- ActivityThread 调用 AMS 的 scheduleResumeActivity() 方法。
- Activity 调用 onStart() 方法。
- Activity 从 onStart() 方法返回给 AMS。
- ActivityThread 调用 AMS 的 scheduleResumeActivity() 方法。
- Activity 调用 onResume() 方法。
- Activity 从 onResume() 方法返回给 AMS。
总结
此文章会经常更新,也会收集大佬们的梳理流程,然后放在这里,将其打造成一篇简单的流程字典。
作者:麦客奥德彪
链接:https://juejin.cn/post/7212924329427402810
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。