Activity启动Window创建过程

Activity 启动 - Window的创建 - 图1 上面的流程描述了从AMS启动Activity,直到Activity的Window在WMS中创建好Surface的关键流程,在阅读源码的过程中,需要明确每个类究竟运行在哪个进程中:是system、surface_flinger、还是应用进程?一些AMS或者WMS中的接口是通过aidl文件描述的,源码中看不到aidl生成的stub类源码,因此有时候会找不到某个接口的实现类,这时候就要关注是不是这个接口是通过aidl定义的,因为我们只是在看源码,没触发构建,Stub和Proxy是不会被生成的,在本进程上下文中只要找到这个接口对象是通过哪个binder调用返回的就可以了,这个接口对象一定是某个server binder对象的proxy。

另外在AOSP笔记中也记录了一下窗口相关逻辑:https://www.yuque.com/gaolf/zl09fd/azk2f4

Surface与EGL

Android应用的View,除非我们强制打开了软渲染,不然都是通过GPU渲染出来的,上面的流程只跟到了Surface被创建,其实ViewRootImpl后续渲染时,还会根据当前Display属性创建GLContext(eglCreateContext),并根据Surface创建一个EGLSurface(eglCreatePlatformWindowSurface),绑定到当前EGLContext来做后续的GL渲染。如果想要搞清楚EGL怎么用,很遗憾阅读文档可能不太足够(我通过阅读EGL文档并没有完全理解,文档中有太多不够明确的描述了),不过android毕竟是个开源项目,可以通过以下路径查看对应源码,主要是看下Java源码应该就足够了:frameworks\base\opengl\java\com\google\android\gles_jni\EGLImpl.java,对应的JNI源码位于frameworks\base\core\jni\com_google_android_gles_jni_EGLImpl.cpp,JNI中调用的的AGL库源码位于frameworks\native\opengl。
flutter在android上也是通过上面描述的步骤创建的OpenGL Context,在引擎内部,使用GPU做界面的渲染。