时序图思维导图式的记忆模式: 巩固Android SDK源码阅读

1,719 阅读5分钟

每一个Android开发,基本都了解或者学习过系统的知识,一是因为国内软件行业内卷,找工作时“面试造火箭,工作拧螺丝”的局面导致的,另一方面,从客观角度来讲,学习Android系统、Framework 等源代码或者其工作方式也可以提升我们,带来以下好处:

  1. 学习 Android 系统源码可以让开发者更深入地了解系统内部的工作原理和机制,以及各个模块之间的关系。这可以帮助开发者更好地利用系统提供的功能和资源,以及更好地进行调试和优化。
  2. 学习 Android Framework 等源码可以帮助开发者掌握更高级的开发技能,例如自定义控件、优化性能等。这些技能可以让开发者更好地应对复杂的开发需求和问题。
  3. 学习 Android Framework 等源码可以让开发者更好地理解系统的工作原理,以及各个模块之间的交互和协作。这可以帮助开发者更快地定位问题、优化代码,并且提高开发效率。
  4. 如果开发者需要开发定制化的 Android 系统,例如适配特定设备或行业应用,学习 Android 系统源码是必要的。只有深入了解系统的实现原理和机制,才能对系统进行有效的修改和定制。
  5. 涨工资真的很快,赚钱很多,钱多了就可以娶媳妇儿,让家人过上好生活。

但是系统学习不是必须的,只有从事系统定制开发的同学,才有必要学习,其他人完全没必要,没有必要弄明白按下开关发生了什么?点亮屏幕是怎么做的?

普通的开发者更重要的是学习Framework的知识。

部分人的苦恼

对于Framework的学习从未间断过,但是在工作中也没有使用过,并且学了就忘,我就是这部分人的典型代表,不学感觉实现不了人生理想,学了经常怀疑人生。

那为什么是这样呢?

对于不熟悉的知识记忆是很困难的,特别是走马观花的学习方式,因为Framework的学习都是在大神的基础上跟流程的。

时序图,解决这个苦恼

时序图能展示代码的执行流程,就算记不住,只要有它在,基本能回想起来的。这篇文章从今天开始,会收集或者总计各种Android 底层的、应用层的、对我们开发有用的各种时序图。听懂点赞、关注、收藏

常见的系统时序图

Android系统运行时序图

image.jpeg

  1. 设备启动:设备启动时会运行 Bootloader,Bootloader 会加载并运行内核。
  2. 内核启动:内核启动后会启动 init 进程,该进程会初始化系统服务和应用程序框架,并启动 Zygote 进程。
  3. Zygote 进程启动:Zygote 进程是 Android 系统中的一个特殊进程,它负责创建和管理应用程序进程。Zygote 进程会预加载一些常用的类和资源,以提高应用程序的启动速度。
  4. 应用程序进程启动:当用户打开一个应用程序时,Zygote 进程会根据应用程序的包名创建一个新的进程,并在该进程中启动应用程序的主 Activity。应用程序进程会运行应用程序的代码,并与系统其他组件进行交互,如访问系统服务和接收广播等。
  5. 关机过程:当用户关闭设备时,Android 系统会向应用程序发送关闭信号,应用程序会进行相应的清理操作,并在完成后退出。最后,系统会关闭进程和服务,并最终关闭设备。

Android 系统启动时序图

系统的启动很复杂,这是一个大致的启动流程,

image.png

  1. 用户按下电源按钮,启动 Android 系统。
  2. 启动引导程序加载引导程序。
  3. 引导程序加载内核。
  4. 内核初始化系统。
  5. 初始化程序启动 Zygote。
  6. Zygote 启动系统服务。
  7. 系统服务初始化 PackageManagerService。
  8. 系统服务初始化 WindowManagerService。
  9. 系统服务初始化 PhoneInterfaceManager。
  10. 系统服务初始化 ActivityManagerService。
  11. 系统服务初始化其他系统服务。
  12. 系统服务启动启动器。
  13. 启动器启动应用程序。
  14. 应用程序启动活动。
  15. 活动调用 onCreate 方法。
  16. 活动调用 onStart 方法。
  17. 活动调用 onResume 方法。

Activity 启动流程

(Android 10(API level 29))注意,具体的启动流程还有很多细节,这是一个大致流程

image.png

  1. 用户请求启动一个 Activity。
  2. ActivityManagerService 调用 instrumentation 的 onCreate() 方法。
  3. instrumentation 创建一个新的 ActivityThread 对象,并将其返回给 ActivityManagerService。
  4. ActivityManagerService 使用新创建的 ActivityThread 对象调用其 attach() 方法。
  5. ActivityThread 创建一个新的 Application 对象并将其返回给 ActivityThread。
  6. Application 返回新创建的 Application 对象给 ActivityManagerService。
  7. ActivityManagerService 使用新创建的 Application 对象调用 ActivityThread 的 bindApplication() 方法。
  8. ActivityThread 调用 Application 的 onCreate() 方法。
  9. Application 从 onCreate() 方法返回给 ActivityThread。
  10. ActivityThread 带着新创建的 Application 对象返回给 ActivityManagerService。
  11. ActivityManagerService 调用 AMS 的 scheduleLaunchActivity() 方法。
  12. ActivityThread 调用 Activity 的 onCreate() 方法。
  13. Activity 从 onCreate() 方法返回给 ActivityThread。
  14. ActivityThread 调用 AMS 的 scheduleResumeActivity() 方法。
  15. Activity 调用 onStart() 方法。
  16. Activity 从 onStart() 方法返回给 AMS。
  17. ActivityThread 调用 AMS 的 scheduleResumeActivity() 方法。
  18. Activity 调用 onResume() 方法。
  19. Activity 从 onResume() 方法返回给 AMS。

总结

此文章会经常更新,也会收集大佬们的梳理流程,然后放在这里,将其打造成一篇简单的流程字典。