Android Chromium动态库加载过程

方树
2023-12-01

最近解决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是何时启动的,有什么样的应用场景。


待研究...

 类似资料: