CAW的个人总结

2024-01-01 17:10
文章标签 总结 个人 caw

本文主要是介绍CAW的个人总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  由于工作的需要,最近正在忙的进行Chromium的移植,作为新人,首先需要学习研究基础的东西,由于是基于android 平台的,所以首先需要了解的就是WebView这个控件是如何和底层chromium内核交互的。在工作之余,把最近工作学习的内容总结下来,以供学习记忆。

                   Android Chromium for WebView代码结构
   
    Chromium for WebView的实现代码结构。其实现分为两部分,一部分是Android WebView的Framework 以及public API 还有一部分是WebView的实现核心Chromium 下面这幅图展示这两种之间的关系以及上下结构。




Android Tree side

1.frameworks/base -- core/java/android/webkit/
(1)定义Public API(WebView,WebViewSettings, etc)
(2) 定义包内部隐藏类 WebViewFactoryProvider,WebViewProvider
(3)定义各种"POD(plain old data)“数据类型,用户在应用程序与 WebView实现间传递的数据类型。比如URLUtil类。
(4)定义一些WebView 的具体实现代码
2.frameworks/webview -- chromium/java
(1)glue 层代码,桥接Android WebView Framework 和 external/chromium_org
(2)在java部分这是chromium WebViewFactory的主要入口。
(3)这个目录下实现代码的目标是仅仅依赖android_webview的public API(部分除外,比如ThreadUtils,LibraryLoader,etc).并且不包含复杂逻辑。仅仅保持glue层状态。
3.frameworks/webview -- chromium/plat_support
   这部分代码提供平台支持,native support library绑定少部分android_webview/public api的副本(GL functor, skia bitmap访问utilities)

Chromium Tree side

1.android_webview/java
 (1)chromium 的顶层入口部分。
 (2)在Chromium 代码基础上提供一层wrapper/semi来向下兼容Android系统版本。
 (3)WebView的大部分API实现的后台支持由Chromium content    module(http://dev.chromium.org/developers/content-module)以及附属的components  browser (http://dev.chromium.org/developers/design-documents/browser-components)
这部分代码通过JNI对应到native部分代码 android_webview/native 目录下.
2.android_webview/native
(1)这个目录的代码更应该叫JNI部分代码,这一层代码只是android_webview/java与native代码的衔接层代码。类的命名基本是java层类的副本映射,并且承当的作用也是相同的。
(2)此目录存在可以存放避免复杂的实现逻辑,减轻android_webview/browser的压力或者 components压力
(3)这部分代码必须和WebView 的Public API运行在同一线程,WebView Public API运行在UI 线程,因此这部分的代码功能也必须运行在UI 线程。与BrowserThread 或者IPC 渲染线程 这种重要的交互代码放在browser目录之下。
3.android_webview/browser
 (1)这个目录代码实现浏览等重要的特性功能。
 (2) 需要复杂与native 线程交互的代码需要在此封装。
 (3) 为了模块化以及模块测试,在这部分代码没有静态强制依赖上层代码(android_webview/native)层代码。
4.android_webview/renderer
 包含所有在渲染进程中运行的逻辑代码。目前WebView只支持单进程渲染,browser/renderer保持分离,          这是个非常实用的架构,分离java应用程序部分与web platform代码,避免两者偶尔,相互独立更稳定。
5.android_webview/lib
这个目录下主要是libwebviewchromium.so的入口,没有其他模块依赖这目录下代码。
6.android_webview/common
  声明一些raw type 提供给android_webview/browser 和android_webview/renderer。
  WebView采用单进程模式,优势可以共享全局状态。这里也定义每个IPC的类型声明。
7.android_webview/public
(1)定义导出native部分的抽象接口,为关注在Java不能实现的重要的性能检测(比如渲染) 
(2)使用Android Framework内部工具来实现高性能后台兼容的custom view。
8.android_webview/unittestjava
   主要测试JNI部分代码

                                            
   总的来说 Android WebView 适配的代码大概可以分作两部分,一部分属于 Chromium source tree,一部分属于 Android source tree。
   只属于 Android source tree,不属于 Chromium source tree 的代码,分别位于 AOSP 源码树的 frameworks/base/core/java/android/webkit 和 frameworks/webview 目录下。
    frameworks/base/core/java/android/webkit 主要为第三方应用提供公开的 WebView API,它的代码包括:
 Android SDK 对外公开的 WebView API,包括 WebView,WebViewClient,WebChromeClient,WebSettings 等; 
 私有接口类,包括 WebViewProvider,WebViewFactoryProvider,这些接口供内部实现; 
 一些用于参数传递的简单数据结构(比如 WebViewTransport)和辅助类(比如 URLUtil); 
    frameworks/webview 是 Android WebView API 与 Chromium Content 层之间的 glue layer,它隔绝了 frameworks/base 和 external/chromium_org 代码之间的相互依赖,它实现了 frameworks/base 下的 WebViewProvider 等接口,将 WebView 发送过来的请求转发给 Chromium,并通过注册回调的方式为 Chromium 提供一些必须使用 Android 非公开 API 的代码。
   Chromium 的代码位于 AOSP 源码树的 external/chromium_org 目录下,它是 Chromium 代码仓库某个分支的一个 Clone,其中 android_webview 子目录下就是 Chromium 为 Android WebView 这个 Platform Configuration 适配的代码(如果是为 Android 平台适配的代码,一般位于各个模块的 android 子目录下,这部分是 CAW 和 Chrome for Android 共用的)。Chromium 的代码可以使用标准的 Android SDK/NDK 编译,它不依赖于上面列举的 Android source 的部分,是完全独立的,甚至代码里面还包括了一个 TestShell 可以进行简单的测试(external/chromium_org/android_webview/test)。

个人的想法总结(难免理解有出入,时时纠正更新):
   针对Android WebView在frameworks层的代码,WebView是由WebViewProvider实现,而WebViewProvider是接口,WebViewProvider由WebViewChromium实现,WebViewFactory和WebViewFactoryProvider是由WebViewChromiumFactoryProvider的实现。(其实WebViewFactory通过反射创建WebViewChromiumFactoryProvider,但我并不知道反射是什么?)
   WebSettings的接口,Android 4.4做了chromium 的桥阶层,主要涉及的WebSettings相关代码在ContentSettingsAdapter,AwSettings中。

 目前已经将几个重要的流程追踪了一下,已经将WebView这部分代码提上来,开始做项目,主要的难点就是与底层的对接。

这篇关于CAW的个人总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/559953

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解