Android 各个版本WebView

article/2025/11/4 21:21:29

转载请注明出处   http://blog.csdn.net/typename/ powered by miechal zhao : miechalzhao@gmail.com

前言:

根据Google公布的Android 各个系统版本市场占有率(Google Android dashboards), Android 4.0及其以上系统将近90%左右,发展趋势必将是未来市面上几乎是Android 4.0以上系统。本文主要关注Android 4.0及以上系统WebView的实现,从Android WebView实现的Framework层大致可以分为三段Android 4.0系列,Android 4.1---4.3系列,Android 4.4及其以上系列。

WebView差异

     WebView是Android系统提供能显示网页的系统控件,它是一个特殊的View,同时它也是一个ViewGroup可以有很多其他子View。在Android 4.4以下(不包含4.4)系统WebView底层实现是采用WebKit(http://www.webkit.org/)内核,而在Android 4.4及其以上Google 采用了chromium(http://www.chromium.org/)作为系统WebView的底层内核支持。在这一变化中Android 提供的WebView相关API并没有发生大变化,在4.4上也兼容低版本的API并且引进了少部分API。这里简单介绍下基于Chromium 的Webview和基于Webkit webview的差异,基于Chromium Webview提供更广的HTML5,CSS3,Javascript支持,在目前最新Android 系统版本5.0上基于chromium 37,Webview提供绝大多数的HTML5特性支持。Webkit JavaScript引起采用WebCore Javascript 在Android 4.4上换成了V8能直接提升JavaScript性能。另外Chromium 支持远程调试(Chrome DevTools)。

                             WebKit for WebView VS Chromium for WebView性能比对(测试环境 小米2. CM Browser. Android 4.1.1 VS 4.4.3)

 Webkit for WebviewChromium for Webview备注
HTML5278434http://html5test.com/
远程调试不支持支持Android 4.4及以上支持
内存占用相差20-30M左右
WebAudio不支持支持Android 5.0及以上支持
WebGL不支持支持Android 5.0及以上支持
WebRTC不支持支持Android 5.0及以上支持

Android 4.0 WebView结构


Android WebView API层主要提供给我们应用程序的接口,为了兼容向下版本Android在高版本中也是对这一层的API进行支持,因此如果底层发生变化,这些API接口层也不会发生太大变化。Android 平台不仅提供应用层编程接口也提供native层编程。下面介绍上图中的三个部分:
1)Android Framework:Android WebView是个特殊控件实现的支持需要Framework的代码主要在./frameworks/base/core/java/android/webkit目录下,在Android 4.0实现主要是在WebViewCore.java,BrowserFrame.java等文件。
2) Android JNI:需要有Native代码支持,因此需要有JNI层实现,Android WebView 4.0的JNI层实现WebView相关代码在./external/webkit/Source/WebKit/android/jni/目录下,这一层起到承上启下的作用,链接Framework层以及WebKit层的桥梁,比如相关的一些实现在WebviewCore.cpp,WebCoreFrameBridge.cpp等。
3) WebKit: WebKit内核,其核心主要是解析W3C标准以及渲染排版网页,他是一个跨平台的内核引擎,那么需要支持各个平台,需要我们的平台实现层,在Android 4.0系统这一部分相关代码主要在./external/webkit/Source/WebKit/android/WebCoreSupport/目录下,比如FrameLoaderClientAndroid.cpp,ChromeClientAndroid.cpp,这一层负责WebCore与系统平台的桥接,具体在不同平台会有不同的实现。实现网页的解析排版及渲染由WebCore来实现在Android 4.0源码当中代码位于./external/webkit/Source/WebCore/下,下面有WebCore实现的各个模块功能支持的相关代码,比如页面视图部分在page目录的chrome.cpp,比如加载页面需要的资源的loader中得FrameLoader.cpp等,这里不在继续深入详解,有兴趣的朋友可以下载Android 4.0源码阅读。

Android 4.1--4.3 WebView结构

Android 4.1--4.3版本WebView内核实现还是基于WebKit,但在WebView的Framework层发生了变化,引入了工厂模式,目地是为了将内核与上层API接口分离开来,分离的意义不仅仅是抽象接口,更重要的是将来能替换内核部分的实现。 在4.1--4.3这一系列版本native结构基本与4.0版本相同,下图呈现新的变化:


Android 4.0--4.3 渲染

尽管之前4.0,与4.1--4.3是在不同的结构系列,其两者之间的差异主要是集中的Framework上的变化,这种变化更多体现在Framework层结构上的变化,WebKit内核极其在Android上的表现机制并没有发生很大变化,他们的渲染机制是相同的。下面介绍Android 4.0--4.3的渲染机制:


在Android 4.0上已经默认开启硬件加速,因此WebView的渲染默认是基于硬件渲染的,通过本人分析其在WebView被隐藏的那一帧是采用软件渲染,目的是减少硬件占用,让其他UI能及时的响应。在硬件渲染情况下WebView通过onDraw方法传递Canvas 并将其转行为HardwareCanvas ,并生成native的 DrawGLFunction指针,通知native做渲染。在软件模式下,WebView通过传递的Canvas 通知内核webkitDraw将内核的一帧生成picture传输到Canvas中,执行Canvas draw bitmap。

Android 4.4 WebView结构

在Android 4.4系统上 Google已经将系统默认的Webkit内核替换成自己的开源项目chromium,通过之前的版本分析,我们可以看到Android 对WebView的Framework 结构进行调整使其更抽象,更重要的目的还是集成自己的开源chromium。下面我们来看看WebView的结构发生了什么样的变化:


目录:
./frameworks/base/core/java/android/webkit
./frameworks/webview/chromium/java/com/android/webview/chromium
./external/chromium_org/android_webview
./external/chromium_org/content
为了将chromium项目集成到Android 中,chromium项目抽象出Android webview这一层,之前的接口抽离这时候已经变得很明显,Android Webview基于chromium content API这一层,第三方浏览器厂商也可以采用这种方式,目前所了解的厂商有Opera使用这种方式。Android 4.4WebView的渲染核心目前也没有发生太大变化,还是基于WebView的Canvas,将Chromium composit 结构绘制到WebView Canvas上。接入chromium内核,WebView浏览性能大幅度提升,但是和chrome for Android还是有些不同,主要体现在一下几点:
1. chrome浏览器是多进程架构,Chromium for Android Webview 是单进程架构。
2. chrome浏览器 内存占用比 Android WebView大的多。
3. chrome支持更多的HTML5 feature。

Android WebView展望:

Chromium项目编译"android_webview_apk“ 目前实现是基于Android SurfaceView,其渲染性能高于Android WebView的Canvas,历史遗留问题以及Android 系统WebView的作用特点,这一块随着Chromium 和 Android项目的整合,相信值得大家期待将来的Android WebView 的渲染性能会再次大幅提升。

本博客会持续更新Android WebView后续版本的变化,敬请关注 谢谢!


Android 5.0 Lollipop WebView

Lollipop版本中WebView的内核实现采用Chromium 37版本,这个版本带来更多的安全性和稳定性。这个版本解决Android 4.4版本网页当中请求访问打开本地文件选择器问题,引入新的回调接口,onShowFileChooser方法,需要此功能的可以在5.0上接上这个回调接口,并实现功能。另外这个版本提供安全许可给用户选择,当网页需要访问特殊资源时,会通知我们的应用程序,请求允许,回调接口为onPermissionRequest。之前我们也提到这个版本使得WebView默认支持WebAudio,WebGL,WebRTC等标准。
另外Google Android 还将webview做为一个能动态更新的app,能不更新Android版本情况下,更新WebView内核。Android 5.0 Webview默认提供减少内存占用支持,并且智能选择需要绘制的HTML document部门来提供性能。 当然开发者可以在自己应用程序需要时关闭这个选项(enableSlowWholeDocumentDraw)。

参考资料:

https://source.android.com/ Android 4.0---5.0

http://developer.android.com/reference/android/webkit/WebView.html



http://chatgpt.dhexx.cn/article/y74557Sh.shtml

相关文章

app中的webview是什么?如何理解?

app中的webview是什么?如何理解? 当你上网阅读东西时,我们一般会选择一款浏览器,比如Chrome、火狐、safari、IE或者Edge。你可能不知道这些浏览器之间有一些竞争,而竞争的主要形式就是WebView。 WebView的定义 什么…

什么是webview ?

Andoid 平台,SDK 中有一个控件叫 WebView; IOS/MacOS 平台,SDK 中有一个控件叫 WebView/UIWebView/WKWebView(UIView/NSView); 这些控件,用于移动端 APP 嵌入(Embed) Web 技术,加载 Web 内容;…

webview是什么,给小白的简单介绍

最近在学习uni-app,也会一直更新关于uni-app学习中自己遇到的问题和心得。 从uni-app的介绍看起,碰到了 ‘webview’ 一词,有必要搜罗一番。 webview是什么,给小白的简单介绍 百度知道 Webview含义:WebView也就是我…

VS下 dllimport与dllexport作用与区别

原文:http://www.cnblogs.com/foohack/p/4119207.html 我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C的…

VS BUG(5) error C2491: “****“: 不允许 dllimport 函数 的定义

VS BUG(5) error C2491: "****": 不允许 dllimport 函数 的定义 前言一. BUG提示二. 分析解决三. 小结 前言 程序员难免要与BUG打交道,本系列将记录自己在VS平台下代码调试过程中遇到的一些BUG,希望对大家遇到相关问题…

C#中DllImport使用法汇总

(转) 最近使用DllImport,从网上百度后发现,大部分内容都是相同,又从MSDN中搜集下,现将内容汇总,与大家分享。 大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能&#xf…

dllexport和dllimport

在VS中,如果要跨项目使用类或变量,就必须用到dllexport和dllimport,下面分别举例全局变量,函数和类跨项目使用。 环境准备:使用VS分别新建一个windows应用程序和DLL项目,windows应用程序项目名称为ConsoleA…

简记C#DllImport异常

C#开发过程中,有些动态库引用不了,需要用DllImport加载该文件动态库; 然后在引用的过程中会碰到各种问题,当然网上各种回答,能解决大部分问题。 我在这里简单记录下问题的解决方案: ”尝试读取或写入受保…

关于c++动态库的dllexport和dllimport

先推荐一款比Microsoft Coplilot更好用的辅助编程工具——Cursor, 一款基于GPT4的新一代辅助编程神器——Cursor,官网介绍说是与OpenAI合作并且基于GPT4。自己体验了下,确实不错,值得尝试。 官网地址: Cursor | Build…

C# dllimport

一、DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息 DllImport的定义如下: public class DllImportAttribute:System.Attribute { public DllImportAttribute(string dllName) {……

C#中DllImport用法和路径问题

DllImport 是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息。 DllImport属性应应用于方法,要求最少要提供包含入口点的dll的名称。 文章目录 一 DllImport的定义如下:二 DllImpo…

1-5(中文版)听力积累

O 听力积累 KR 参照连接,建议看一看 听力学习步骤 选择材料:使用English Pod材料 Englishpod是一家公司叫做Praxis Language 推出的收费讲座。讲座高度还原生活场景,两位优秀的主持人以轻松聊天的方式讲解点评场景内容,在此过…

该如何拯救我的英语

说来羞愧,从初中开始,就算到大学本科毕业为止吧,英语也算得上是持续地学习了有 10 年时间了,十年啊,十年了,你知道这十年我是怎么。。。。emmm,十年时间就算是一天只记一个单词,那少…

英语磁带与计算机磁带区别,小学英语教材配听力磁带 家长:谁还用复读机?...

时间倒回十多年,大家听歌、听英语还是用磁带,复读机、录音机也是学生人手必备的学习用品。但在各种高端电子产品充斥的今天,再去找个录音机可能就非常困难了。这不?刚刚开学,就有小学一年级的家长被难倒了,…

小学听力测试英语软件,亲测:好用的小学英语软件有哪些?这6款通通安利给大家!...

原标题:亲测:好用的小学英语软件有哪些?这6款通通安利给大家! 首先,老师需要提前表明的是: 今天给大家推荐的这8款好用的小学英语软件,有的是我亲自测试过的,有的是同办公室的英语老…

什么软件能做英语测试卷听力,请问谁知道那些英语课本、期中期末考试的听力朗读的声音是怎么合成的?用什么软件?谢谢了...

满意答案 ceterry 2014.02.02 采纳率:57% 等级:12 已帮助:10834人 这些都是用 能说会道 XP 这个软件合成的,只需要课文的文字内容就可以转换成MP3的语音资料,还带LRC字幕,很方便,效果也好 “…

四六级英语听力软件测试,三款精品英语听力软件,提高四六级听力有诀窍

原标题:三款精品英语听力软件,提高四六级听力有诀窍 英语听力是所有英语考试中不可忽视的一个环节。然而在我们日常学习生活中,尤其是四六级备考,不乏只记单词不善听的情况,一个很重要的原因在于很多学生认为训练四六级听力太麻烦…

小学听力测试英语软件,你知道有哪些软件适合给小学生练习在线英语听力吗?...

前言: 随着英语听力软件在英语学习者当中的普及,如何挑选合适的听力软件倒成了技术活儿。你知道有哪些软件适合给小学生练习在线英语听力吗?今天为大家推荐3款好用的。 英语听力软件自推广以来,其趣味性和便捷性都是毋庸置疑的&am…

android英语听力播放器,掌上英语听力下载-掌上英语听力 安卓版v1.5.1-PC6安卓网...

掌上英语听力app是一款优质的英语听力练习软件。掌上英语听力app主要为用户提供专业的英语听写练习功能,有了掌上英语听力,使你进行英语听力练习更方便。 软件介绍 掌上英语听力是一款简单实用的英语听力软件,每天会推荐英语学习听力内容&…

剑桥标准英语教程听力资源1-4级

--------》 剑桥标准英语教程听力资源地址 书 名:剑桥标准英语教程4A:学生用书(附光盘1张) 作 者:Michael McCarthy, Jeanne McCarten, Helen Sandiford 出 版 社:北京语言大学出版社 书 名&#x…