最近解决WebViewZygote问题的过程中,仔细阅读了老罗的一篇关于Chromium加载的blog,受益匪浅。
详细的代码分析过程请参考原文:Android WebView加载Chromium动态库的过程分析
作为备忘,本文简单总结下Chromium动态库的加载过程,包括:
1. 系统启动时Chromium动态库的加载过程
2. App进程加载Chromium动态库的过程
3. Chromium动态库加载的重要类:WebViewFactory
1. 系统启动时Chromium动态库的加载过程
为了达到Chromium动态库在所有App进程中共享程序段和部分数据段,需要由Zygote进程和SystemServer进程开辟共享空间、加载动态库:
1)Zygote进程:调用WebViewFactory.prepareWebViewInZygote()开辟Chromium动态库的地址空间,并确定起始位置
2)SystemServer进程:调用WebViewFactory.prepareWebViewInSystemServer()/createRelroFile()申请启动isolated进程加载动态库
3)临时进程:调用到RelroFileCreator.nativeCreateRelroFile加载Chromium动态库
2. App进程加载Chromium动态库的过程
App应用使用WebView时会加载Chromium动态库,通过WebViewFactory.getProvider和loadNativeLibrary完成。
3. Chromium动态库加载的重要类:WebViewFactory
Chromium动态库加载的过程中,涉及到的共享空间开辟、加载动态库以及内存映射重定位的相关函数都在该类中实现,包括:
1)prepareWebViewInZygote:获取共享空间信息,并调用nativeReserveAddressSpace函数开辟共享空间
2)nativeReserveAddressSpace:在Zygote进程中开辟共享空间
3)getWebViewNativeLibraryPaths:获取Chromium动态库的lib路径
4)prepareWebViewInSystemServer:调用函数createRelroFile启动isolated进程加载动态库
5)nativeCreateRelroFile:真正实现Chromium动态库加载的函数
6)loadNativeLibrary:App进程实例化WebView时加载动态库的函数
除了上述的备忘总结外,还是有个知识点需要进一步澄清:WebViewZygote进程及其Socket是何时启动的,有什么样的应用场景。
待研究...