原文地址:https://mogoweb.net/38-2/#wiki/android-webview
1. 架构&组件
- AOSP中的Android WebView将基于AwContents,其位于Content API和Content View之上。
- 与Content API不同,它还依赖于从最初的chrome browser分离出来的组件,组件位于components/下,包含auto_login_parser,navigation_interception,visitedlink_browser,visitedlink_renderer和web_contents_delegate_android,这些都是用于页面。
- 无渲染进程(进程内渲染),无沙盒机制(sandbox机制)
- 图形架构和Content Shell有很大的不同,且正在开发中,将支持软件和硬件输出。
2. API
- API类似于EFL WebView,不会暴露内部的browser/renderer/gpu进程。
- 能够加载URL,接收加载过程中的事件和回调。
- 可通过addJavaScriptInterface扩展JavaScript API,允许JavaScript调用Java代码,反之这不支持。
- 提供了若干API接收页面状态改变通知和页面回调。
3. 消息循环和事件处理
- 整合利用Android消息处理
- native代码设置定时器到Java侧的消息循环
4. 图形
- 渲染使用chromium合成器,开启了硬件加速
- 合成器输出支持软件和硬件Surface
- 硬件加速的架构和content shell不同,和ChromeOS类似。现在还处在早期开发阶段,使用了UberCompositor,支持软件输出
5. WebAPI扩展
- API addJavaScriptInterface可用于JavaScript API扩展,但支持JavaScript调用Java代码。
- 相反方向的调用(Java -> JavaScript)不支持
- addJavaScriptInterface通过NPObject机制(之前用于NPAPI插件)支持进程外访问,虽然在WebView中不再需要。
- 来自Java侧的事件通知貌似还不支持
6. API细节和涵盖范围
- WebViewClient用于页面状态改变通知
- WebChromeClient包含参与渲染逻辑的回调
- 原生代码/JS交互
- 页面加载
- 导航&历史记录
- 文字搜索
- 事件处理
- 轨迹球、触摸、键盘
- 不支持鼠标事件
- 设置:编码
- 页面信息:标题、favicon
- HTTPS/SSL
- 页面加载状态、缩放、重定向、URL重载,等等
7. 源码
- src/android_webview
- android_webview_java.jar, libwebviewchromium.so和webviewchromium.pak是本模块的编译目标.
- Google的工程师正在Android开源项目里开发基于Chrome核心的新WebView.
- 官方 站点:
- 镜像:
https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/webkit/
https://mogoweb.net/15-2/
- 第三方开发者也在基于android_webview模块开发ChromeView
- Third party developers work in progress to implement ChromeView based on android_webview module.
- ChromeView有着和Android Webview一样的API.
- https://github.com/pwnall/chromeview-src