chromium for android render进程创建过程分析

本文详细分析了Chromium Android应用中render进程的创建过程,从content_view_core.cc的loadUrl开始,涉及ChildProcessLauncher的warmUp方法、ChildProcessConnection、SandboxedProcessService的声明与启动,以及在不同阶段如何触发子进程的创建和管理。通过AndroidManifest.xml配置,render进程作为服务在应用中运行。在创建过程中,关键步骤包括ChildProcessLauncher与ChildProcessService的交互,以及RenderProcessHost、RenderViewHost的创建。
render进程的创建是由应用程序调用ContentView.java的loadUrl开始触发的。
ContentView.java的loadUrl调用ContentViewCore.java的loadUrl,
ContentViewCore.java调用nativeLoadUrl(),通过chromium的jni机制
ContentViewCore_jni.h(定义在out/Release/gen/content/jni)
最终调用到native层的content_view_core_impl.cc的loadUrl.

下面的顺序图是从content_view_core_impl.cc的loadUrl开始的触发render进程创建的整个过程:

ChildProcessLauncher.java中的方法是供底层调用,用于启动和停止ChildProcess的。
ChildProcessLauncher.java的warmUp方法完成子进程孵化准备工作,即创建ChildProcessConnection。
warmUp应该在应用程序启动的早期调用,这样子进程的孵化准备工作就可以和其他启动工作并行进行。
warmUp一定不能在UI线程中调用。
ChildProcessConnection实现了接口ServiceConnection,用来监测应用程序的子进程的状态。
ChildProcessLauncher.java有一个内部类ChildConnectionAllocator,负责ChildProcessConnection的创建和销毁。
render进程是应用程序的子进程,以service的形式提供给应用程序。
需要在应用程序的AndroidMenifest.xml中声明render进程中运行的service。
声明方式如下:
<service android:name="org.chromium.content.app.SandboxedProcessService0" android:permission="com.android.apps.chrome.permission.SANDBOX" android:exported="false"
android:process=":sandboxed_process0" android:isolatedProcess="true" />
        <service android:name="org.chromium.content.app.SandboxedProcessService1" android:permission="com.android.apps.chrome.permission.SANDBOX" android:exported="false" android:process=":sandboxed_process1" android:isolatedProcess="true" />
sandboxservice图:

下面的顺序图是应用程序调用warmUp触发的ChildProcessService的创建过程:

注意:warmUp在应用程序中只调用一次,所以只有SandboxedProcessService0的创建过程是由warmUp触发的,并且ChildProcessService的onCreate方法中并没有触发到底层process的创建,
即ChildProcessService的onCreate()没有执行到ContentMain.initApplicationContext,就被阻塞了。
render进程的更通用的创建方式是由native层的ChildProcessLauncher(定义在child_process_launcher.cc中)回调java层的ChildProcessLauncher的Start方法触发的。
RenderProcessHost* SiteInstanceImpl::GetProcess()会创建RenderProcessHost
WebContentsImpl::CreateRenderViewForRenderManager()
调用RenderViewHostImpl::CreateRenderView()
{
if (!GetProcess()->Init())
}
RenderViewHostImpl继承自RenderWidgetHostImpl。RenderWidgetHostImpl中定义了GetProcess()返回RenderProcessHost。
RenderProcessHostImpl::Init方法创建了RendererMainThread,也创建了ChildProcessLauncher。
{
child_process_launcher_.reset(new ChildProcessLauncher(
}
ChildProcessLauncher定义了一个内部的私有类Context。
ChildProcessLauncher的构造函数创建了ChildProcessLauncher::Context的一个实例,并调用launch.
launch调用  BrowserThread::PostTask,
这个调用会导致调用Context::LaunchInternal。
Context::LaunchInternal调用一个全局函数StartChildProcess。
全局函数StartChildProcess定义在child_process_launcher_android.cc中。
StartChildProcess(){
Java_ChildProcessLauncher_start(env,
      base::android::GetApplicationContext(),
      j_argv.obj(),
      j_file_ids.obj(),
      j_file_fds.obj(),
      j_file_auto_close.obj(),
      reinterpret_cast<jint>(new StartChildProcessCallback(callback)));
}
Java_ChildProcessLauncher_start定义在out/Release/gen/content/jni/ChildProcessLauncher_jni.h
Java_ChildProcessLauncher_start回调了java层ChildProcessLauncher.start函数。
ChildProcessLauncher.start函数在第一次调用时,由于SandboxedProcessService0已经创建,并阻塞在ChildProcessService的onCreate方法中,所以
ChildProcessLauncher.start使ChildProcessService的onCreate方法继续执行如下片段:
{
 ContentMain.initApplicationContext(sContext.get().getApplicationContext());
 nativeInitChildProcess(sContext.get().getApplicationContext(),ChildProcessService.this, fileIds, fileFds,mCpuCount, mCpuFeatures);
 ContentMain.start();
 nativeExitChildProcess();
}
在创建第二个Tab时,SandboxedProcessService1的创建是由以下调用触发的,
ChildProcessLauncher.start函数调用allocateBoundConnection,
allocateBoundConnection调用allocateConnection生成一个ChildProcessConnection实例。
allocateBoundConnection调用新生成的ChildProcessConnection的bind方法,
ChildProcessConnection的bind调用Context::bindService(),bindService触发SandboxedProcessService1的onCreate方法。
SandboxedProcessService1是ChildProcessService的基类,从ChildProcessService继承onCreate方法。所以实际执行的是
ChildProcessService::onCreate。
目前最多只能创建三个render进程。
接下来的流程与Browser进程的创建过程一样,直到函数ChromeMainDelegateAndroid::RunProcess(
    const std::string& process_type,
    const content::MainFunctionParams& main_function_params) {
  TRACE_EVENT0("startup", "ChromeMainDelegateAndroid::RunProcess")
  if (process_type.empty()) { //创建Browser进程
    JNIEnv* env = base::android::AttachCurrentThread();
    RegisterApplicationNativeMethods(env);

    browser_runner_.reset(content::BrowserMainRunner::Create());
    return browser_runner_->Initialize(main_function_params);
  }
  //创建非Browser进程,比如Render进程
  return ChromeMainDelegate::RunProcess(process_type, main_function_params);
}
android平台的ChromeMainDelegate::RunProcess返回-1.所以render进程执行RunNamedProcessTypeMain()走的流程是:
return kMainFunctions[i].function(main_function_params);进而调用RenderMain(),RenderMain定义在Render_main.cc中.

chromium for android 图片下载

<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 WebView对Chromium的封装主要是通过一个Java桥接层(WebView Glue)将Android SDK的WebView API调用转发给Chromiumandroid_webview模块,该模块再通过封装Chromium Content层的核心功能(如导航、渲染、网络等)来实现WebView的功能。 总结:Android WebView通过多层封装,将Chromium的核心功能(主要是Content模块)暴露给Android应用开发者,同时保持了与Android SDK WebView API的兼容性。</think>### Android WebView 对 Chromium 的封装机制 Android WebView 对 Chromium 的封装是通过多层架构实现的,核心是将 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]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值