android app绘制过程,Android - APP启动到屏幕绘制的流程地图

Android 10的代码

将App从Launcher点击到屏幕绘制的整个流程走一遍。

阅读源码并不需要清楚每一行细节,带着目标读就不会迷路

耐心

1. Activity.java -> startActivityForResult() : 从Launcher.java调过来就不说了,简单的点击事件和startActivity的调用

2. Instrumentation.java -> execStartActivity()

3. ActivityTaskManagerService.java -> startActivity() -> startActivityAsUser(): 创建ActivityStarter

4. ActivityStarter.java -> execute() -> startActivityMayWait()

5. RootActivityContainer.java -> resumeFocusedStacksTopActivities()

6. ActivityStack.java -> resumeTopActivityInnerLocked()

7. ActivityStackSupervisor.java -> startSpecificActivityLocked()

8. ActivityManagerService.java -> startProcess()

9. ProcessList.java -> startProcessLocked() -> startProcess()

10. Process.java -> start()

11. ZygoteProcess.java -> start() -> startViaZygote() -> zygoteSendArgsAndGetResult(): 通过Socket跨进程到Zygote进程。

12. ZygoteInit.java -> main(): 创建ZygoteServer

13. ZygoteServer.java -> runSelectLoop():是一个死循环,不断监听Socket请求

14. ZygoteConnection.java -> processOneCommand(): 解析Socket请求的参数,并传给Zygote.forkAndSpecialize()方法去创建子进程 -> handleChildProc():子进程初始化

15. ZygoteInit.java -> zygoteInit()

16. RuntimeInit.java -> applicationInit() -> findStaticMain(): 通过反射去调用新的子进程(ActivityThread)的main()方法

17. ActivityThread.java -> attach(): 开启主线程Looper循环,跨进程调用AMS.attachApplication

18. ActivityManagerService.java -> attachApplicationLocked():将IApplicationThread和ProcessRecord绑定,并跨进程调用ActivityThread的bindApplication()方法

19. ActivityThread.java -> bindApplication(): 通过主线程的Handler,调用handleBindApplication -> handleBindApplication() : 初始化一些配置:语言、分辨率、时间,并通过反射拿到Instrumentation,Instrumentation再通过反射获取到Application对象,并调用Application的attach方法,将Application和Context绑定,创建ContentProvider,再通过Instrumentation调用Application的onCreate()方法,此时Application创建完成,并回调了attachBaseContext和 onCreate方法

20. ActivityManagerService.java -> 在19步中,绑定完Application之后,继续往下,会调用ActivityTaskManagerInternal的attachApplication方法,该方法的具体实现在ActivityTaskManagerService

21. ActivityTaskManagerService.java -> attachApplication()

22. RootActivityContainer.java -> attachApplication()

23. ActivityStackSuperVisor.java -> realStartActivityLocked(): 创建一个ClientTransaction事务,这里设置两个重要参数,和Activity生命周期的走势有关, 1. addCallback()设置的是LaunchActivityItem 2.setLifecycleStateRequest()设置的是ResumeActivityItem 。通过IApplicationThread调用scheduleTransaction将事务跨进程,传到ActivityThread中

24. ActivityThread.java -> scheduleTransaction():执行父类ClientTransactionHandler中的scheduleTransaction,通过主线程Handler抛一个EXECUTE_TRANSACTION的msg

25. TransactionExecutor.java -> execute() 将事务放在事务线程池中去执行 -> executeCallbacks()

26. LaunchActivityItem.java -> execute()

27. ActivityThread.java -> handleLaunchActivity() -> performLaunchActivity():调用Instrumentation,通过反射,创建Activity,并调用attach() : Activity初始化,创建Window。调用Instrumentation的callActivityOnCreate()方法,即Activity的onCreate回调。setContentView之后,初始化DecorView,再将自定义的布局添加到DecorView。

28. TransactionExecutor.java -> execute() : 再回到25步的execute方法,走完executeCallbacks(),再走executeLifecycleState()

29. ResumeActivityItem.java -> execute()

30. ActivityThread.java -> handleResumeActivity() -> performResumeActivity(): 调用Activity的performResume(),调用Instrumentation的callActivityOnResume方法,即onResume回调

31. ActivityThread.java -> handleResumeActivity(): 再回到handleResumeActivity,回调了onResume之后,将DecorView加入PhoneWindow -> addView()

32. WindowManagerImpl.java -> addView()

33. WindowManagerGlobal.java -> addView() : 初始化ViewRootImpl,调用ViewRootImpl.setView

34. ViewRootImpl.java -> setView() -> requestLayout() -> scheduleTraversals(): 将一个带有doTraversal方法的Runnable,放入Choreographer中

35. Choreographer.java -> postCallback() -> postCallbackDelayedInternal(): 将runnable放入一个CallbackQueue中 -> scheduleFrameLocked() -> scheduleVsyncLocked()

36. FrameDisplayEventReceiver.java -> scheduleVsync() : 这是父类方法 -> nativeScheduleVsync() 特么是个native方法,跟不下去了啊,这个类顾名思义好像是接收屏幕刷新事件的。可能当需要刷新屏幕时,先向底层发消息,然后底层会回调一个刷新的信号。35步中把runnable放入一个CallbackQueue中,把还是直接看看在哪里取出来的吧 -> run() : 这里我也说不清楚了,但是在这里取是最合理的 -> doFrame() -> doCallbacks():取出Runnable,run起来了,随后就调用了doTraversal(),这里就是屏幕绘制的开端了。

接下来的路就清楚了,调用performTraversals开始View的绘制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值