Android Chromium动态库加载过程

本文详细解析了Chromium动态库在Android系统中的加载过程,包括Zygote进程及App进程中的加载步骤,并介绍了关键类WebViewFactory的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


待研究...

<think>我们正在讨论Android WebView如何封装和使用Chromium。根据引用内容,我们可以总结如下: 1. 在Android 4.4之后,WebView的内核从WebKit切换到了Chromium(即Chromium Android WebView,简称CAW)[^3]。 2. Android WebView的架构中,`android.webkit.WebView`是SDK中定义的公共API,而Chromium Android WebView属于Chromium项目的一部分[^1]。 3. WebView Glue层(Java实现)将WebView的API桥接到Chromium Android WebView的实现上[^1]。 4. Chromium Android WebView封装了Chromium的Content层,提供了`AwBrowserProcess`和`AwContents`类,分别对应Chromium的`BrowserStartupController`和`ContentViewCore`[^2]。 5. 在具体实现中,当我们在App的UI中嵌入一个WebView时,WebView内部会创建一个`WebViewChromium`对象,该对象基于Chromium的`android_webview`模块[^2]。 6. `android_webview`模块提供了对Content层的封装,同时兼具了一些Embedder(嵌入者)的行为,并且还集成了部分Browser Components(如自动填充、PDF导出等)[^1]。 封装机制的具体层次结构(参考引用[4]的代码层次图): - 顶层:`WebView.java`(SDK公共API) - 第二层:AndroidChromium的封装层(Java桥接层,即WebView Glue) - 第三层:Content模块(导航控制,核心层) - 第四层:blink public web API(供外部操控内核) - 第五层:WebCore(被抽离形成blink) - 第六层:blink public platform API(要求外部实现,如网络) - 第七层:Content模块(在I/O线程中操作) - 底层:网络库 因此,Android WebViewChromium的封装主要是通过一个Java桥接层(WebView Glue)将Android SDK的WebView API调用转发给Chromiumandroid_webview模块,该模块再通过封装Chromium Content层的核心功能(如导航、渲染、网络等)来实现WebView的功能。 总结:Android WebView通过多层封装,将Chromium的核心功能(主要是Content模块)暴露给Android应用开发者,同时保持了与Android SDK WebView API的兼容性。</think>### Android WebViewChromium 的封装机制 Android WebViewChromium 的封装是通过多层架构实现的,核心是将 Chromium 的 Content 模块适配到 Android 框架中,同时保持 WebView API 的兼容性。具体机制如下: #### 1. **架构分层** - **顶层(Java API层)** `android.webkit.WebView` 提供标准 SDK 接口,开发者直接调用这些 API 操作网页[^1]。 ```java WebView webView = findViewById(R.id.webview); webView.loadUrl("https://example.com"); ``` - **桥接层(WebView Glue)** 通过 Java 层将 WebView API 调用转换为 Chromium 操作。例如: - `WebView.loadUrl()` → 调用 `AwContents.loadUrl()`(Chromium 封装层) - 处理 Android 生命周期事件(如 `onPause()`)并同步到 Chromium 内核[^1][^2]。 - **Chromium 封装层(android_webview 模块)** 核心类包括: - `AwBrowserProcess`:封装 Chromium 的 `BrowserStartupController`,负责进程初始化[^2]。 - `AwContents`:封装 `ContentViewCore`,管理网页渲染、导航等核心功能[^2][^4]。 #### 2. **关键封装技术 - **功能映射** Chromium 的 Blink 渲染引擎通过 `blink public web API` 暴露接口,由 `AwContents` 实现具体功能(如加载页面、执行 JavaScript)[^4]。 ```cpp // 伪代码:AwContents 对 ContentViewCore 的封装 class AwContents { void LoadUrl(String url) { content_view_core_->LoadUrl(url); // 调用 Chromium Content 层 } } ``` - **线程模型适配** Android UI 主线程与 Chromium 的多进程架构(RenderProcess、GPUProcess)通过 IPC 通信。例如: - 网络请求在 I/O 线程处理(`Content Module (I/O thread)`)[^4]。 - 渲染结果通过共享内存传递到 UI 线程显示。 - **组件集成** 复用 Chromium 的浏览器组件: - **自动填充(AutoFill)**:通过 `Browser Components` 集成[^1]。 - **PDF 导出**:调用 Chromium 的 PDF 模块实现[^1]。 #### 3. **兼容性处理 - **内核切换** Android 4.4+ 使用 Chromium 替代 WebKit,通过 `WebViewChromium` 对象动态加载不同内核[^2][^3]。 - **ROM 适配** 针对第三方 ROM 修改 WebView 的行为,通过抽象层隔离差异(如重写 `WebViewProvider` 接口)[^3]。 #### 4. **性能优化 - **硬件加速**:通过 Chromium 的 GPU 渲染管线实现。 - **资源复用**:多个 WebView 共享同一个 Chromium 进程[^2]。 ### 封装流程示例 当调用 `WebView.loadUrl()` 时: 1. Java 层接收请求 → 通过 JNI 调用 `AwContents.loadUrl()`。 2. `AwContents` 转发请求至 Chromium 的 `Content Layer`。 3. `Content Layer` 启动网络请求(`Network Stack`)并加载页面[^4]。 4. 渲染结果通过 `blink public platform API` 返回给 `AwContents`。 5. `AwContents` 将渲染数据传递到 Android Surface 显示。 ### 总结 Android WebView 通过 **Java 桥接层 + Chromium 封装层** 的架构,将 Chromium 的 Content 模块功能映射为标准 WebView API。这种设计既保留了 Chromium 的高性能特性,又确保了与 Android 框架的兼容性[^1][^2][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值