聚玩软件园

软件应用

WebView安卓版

WebView安卓版

版本:v151.0.7922.18 大小:255.78M 语言:简体中文 授权:免费 类别:实用工具热度:692 厂商:谷歌公司 MD5:F31E956D46BB3F7D86B8A595B7FF17E9 包名:com.google.android.webview

发布:

支持:
暂无苹果版
32r安卓下载

《WebView安卓版》应用截图

《WebView安卓版》应用介绍

WebView安卓版是一款专为Android设备设计的轻量级网页浏览与嵌入式浏览器组件工具。它提供简洁高效的网页渲染引擎,支持快速加载HTML5内容、JavaScript执行及表单交互。核心特色在于可集成至第三方应用作为内嵌浏览器使用,同时支持多标签页管理、隐私无痕模式与下载功能。适用于开发调试、应用内网页展示、轻量上网及嵌入式Web场景,操作流畅且占用资源极少。

在众多安卓应用程序中,尤其是那些集成网页内容或依赖Web技术的应用,经常借助WebView组件来呈现网页或与Web服务交互。通过运用WebView,开发者能够将网页内容无缝嵌入应用内部,从而打造出更具一体化的用户体验。WebView所展示的网页内容,通常基于设备默认浏览器所使用的同一渲染引擎,例如Google Chrome或安卓浏览器(在Chrome成为默认选项之前普遍使用的那款)。这种做法有助于开发者在不同应用间提供一致的网页体验,并确保对Web标准及各类技术的良好兼容性。

究竟什么是WebView?

WebView本质上是一个可视化组件,充当原生应用在视觉层面的组成部分。它能够嵌入移动设备中,助力实现前端的混合式开发。事实上,大多数混合式开发框架,诸如APIcloud、uni-app等,都是在WebView模式的基础上进行二次开发的。

一、WebView入门基础

1、日常生活中,我们通常借助浏览器来访问网页,并且明确知道自己正在使用的是浏览器——无论是在个人电脑客户端还是手机应用上。然而,WebView是一个内嵌于原生应用中的浏览器,它隐藏得如此之深,以至于你可能完全没意识到自己正在使用一个浏览器。

2、传统浏览器由两大部分构成:用户界面(包括地址栏、导航栏)和浏览器引擎。而WebView正好对应原生应用中的浏览器引擎部分。

3、作为一个纯粹的视觉组件,WebView充当着原生应用显示界面的功能模块。

4、通过WebView呈现的内容无需保存到设备本地,可以直接从服务器实时获取。

5、这种灵活性为浏览器端的Web应用与那些希望在原生应用内展示的Web应用之间,开辟了代码可重复利用的广阔天地。

6、运行于WebView中的JavaScript代码有能力调用原生的系统应用编程接口,而不受传统浏览器沙箱机制的束缚。

7、沙箱机制的存在,是因为你不能完全信任所加载的网页内容,因此禁止其直接调用系统原生接口。而在WebView环境中,开发者通常能够完全掌控加载的内容,恶意代码侵入并对设备造成破坏的可能性非常低。

8、在WebView内部,JavaScript代码可以与原生应用代码进行双向通信,同时也有能力调用原生应用编程接口,集成诸如传感器、存储、日历、联系人等炫酷的系统级功能。

二、WebView的典型应用场景

1、充当应用内置浏览器,用于显示链接指向的内容。

2、用于展示各类广告。

3、完全承担应用内部所有交互功能。从技术上讲,这类应用仍然是原生应用,但其所做的唯一原生操作就是托管一个WebView,这种应用被称作混合应用。从部署和更新的角度而言,混合应用极为便利。

4、作为原生应用的功能扩展。许多原生应用会提供加载项或扩展程序来扩充自身功能,由于Web技术本身简洁且功能强大,这些加载项和扩展通常采用HTML、CSS、JavaScript构建,而非C++、C#等其他编程语言。

三、WebView的核心本质

WebView实际上就是一个在应用内预先设置好位置和尺寸的浏览器窗口,并且它不会添加任何花哨的用户界面元素。

绝大多数情况下,除非你调用了原生应用编程接口,否则并不需要在WebView中专门对Web应用进行专项测试。

WebView的常见功能使用指南

安卓系统中的WebView组件功能相当强大,现将项目中经常用到的几个要点总结如下:

一、背景设置

WebView.setBackgroundColor(0);//先将背景色设置为透明

WebView.setBackgroundResource(R.drawable.yourImage);//再设定背景图片

二、捕获WebView网页加载的初始与完成事件

操作步骤:

1、创建一个继承自WebViewClient类的自定义WebViewClient类,例如命名为WebViewClient。

2、重载该类中的onPageFinished(WebView view, String url)方法(当WebView加载完成后,该方法会自动被调用),在此方法中编写你想要在加载完成后执行的操作。

3、通过webView.setWebViewClient(new WebViewClient())方法,将自定义的WebViewClient与WebView实例进行关联。

如果需要监测加载进度,则需要创建一个继承自WebChromeClient类的自定义类,并重载其onProgressChanged方法,然后进行相应的设置。

布局文件示例:

需要特别留意WebView的一系列用法,例如webView.getSettings()。setJavaScriptEnabled(true);用于开启JavaScript功能。

其他具体用法请参考官方应用编程接口文档。

而进度条的使用,是在创建并实例化一个新的setWebChromeClient之后,在其内部类中编写onProgressChanged事件逻辑。

总结:在设计上,WebView并非包揽所有职责,而是将部分旁支任务分配给其他组件处理,这样WebView就能专注于解析和渲染等核心工作。

WebViewClient的作用是协助WebView处理各类通知和请求事件,具体包括:

onLoadResource

onPageStart

onPageFinish

onReceiveError

onReceivedHttpAuthRequest

WebChromeClient则负责辅助WebView处理JavaScript的对话框、网站图标、网站标题、加载进度等事务。

onCloseWindow(关闭WebView)

onCreateWindow()

onJsAlert (WebView自身无法弹出alert对话框,需要定制WebChromeClient来处理弹出)

onJsPrompt

onJsConfirm

onProgressChanged

onReceivedIcon

onReceivedTitle

以上即为本文的全部核心内容,希望能对大家的学习有所裨益,也欢迎大家一如既往地支持3322。

Android WebView的具体实现与Chromium渲染引擎的启动流程

此处以安卓8.0的源代码为例进行说明,首先需要找到WebView真正的构造函数:

该构造函数会调用另一个成员函数ensureProviderCreated(),以确保Chromium动态库已经被成功加载。在Chromium动态库已加载的前提下,WebView类的成员函数ensureProviderCreated还会创建一个WebViewProvider对象,并将其保存在成员变量mProvider中。这个WebViewProvider才是真正实现WebView各项功能的核心角色。上述提到的Android WebView的主要操作方法,基本上都是通过mProvider来实现的,例如loadUrl(String url)等方法。

拥有了这个mProvider之后,WebView类的构造函数会继续调用mProvider.init(javaScriptInterfaces, privatepowsing),从而启动网页渲染引擎。对于基于Chromium实现的WebView而言,它所使用的WebViewProvider是一个WebViewChromium对象。当这个WebViewChromium对象的成员函数init被调用时,就会正式启动Chromium的网页渲染引擎。

因此,接下来我们来看一下ensureProviderCreated的具体实现:

WebView类的成员函数ensureProviderCreated首先调用成员函数checkThread,以确保当前操作是在WebView的创建线程中执行的。接着,它会判断成员变量mProvider的值是否为null。如果为null,说明尚未为当前正在创建的WebView创建过Provider。在这种情况下,它会先调用成员函数getFactory来获取一个WebViewFactory。有了这个WebViewFactory之后,便可以调用其成员函数createWebView来创建一个WebViewProvider。

接下来我们再看一下getFactory()方法及其实现:

getFactory返回的WebView Factory是通过调用WebViewFactory类的静态成员函数getProvider获得的。getProvider首先会判断静态成员变量sProviderInstance的值是否等于null。如果等于null,说明当前的应用进程尚未加载过Chromium动态库。在这种情况下,就需要加载Chromium动态库,并创建一个WebView Factory,将其保存在静态成员变量sProviderInstance中。接下来,我们先分析Chromium动态库的加载过程,然后再分析WebView Factory的创建过程。

加载Chromium动态库是通过调用WebViewFactory类的静态成员函数loadNativeLipary来实现的:

loadNativeLipary首先会调用成员函数getWebViewNativeLiparyPaths,获取需要加载的Chromium动态库的文件路径,然后再调用另一个静态成员函数nativeLoadWithRelroFile对其进行加载。在加载过程中,会指定一个Chromium GNURELRO Section文件。这个Chromium GNURELRO Section文件是在系统启动时,通过启动一个临时进程生成的。其中,静态成员函数nativeLoadWithRelroFile是一个JNI方法,它由C++层的函数LoadWithRelroFile来实现:

LoadWithRelroFile会判断自身是32位还是64位实现,然后根据参数lib32和lib64,从中选择对应的Chromium动态库进行加载。

这个加载过程是通过调用另一个函数DoLoadWithRelroFile来完成的:

函数DoLoadWithRelroFile的实现,是通过Linker导出的函数androiddlopenext,在Zygote进程保留的地址空间中加载Chromium动态库。需要注意的是,应用进程是由Zygote进程fork出来的,因此它同样会获得Zygote进程预留的地址空间。不过,函数DoLoadWithRelroFile会指示函数androiddlopenext在加载Chromium动态库时,将参数relro所描述的Chromium GNURELRO Section文件通过内存映射的方式加载到内存中,并替换掉已经加载的Chromium动态库的GNURELRO Section。这是通过指定一个ANDROIDDLEXTUSERELRO标志来实现的。之所以可以这样做,是因为参数relro描述的Chromium GNURELRO Section文件对应的Chromium动态库的加载地址,与当前应用进程加载的Chromium动态库的地址是一致的。只要两个相同的动态库在两个不同的进程中的加载地址一致,它们的链接和重定位信息就完全相同,因此可以通过文件内存映射的方式实现共享。共享之后,就可以达到节省内存的目的。

这一步执行完毕后,应用进程就成功加载了Chromium动态库。回到前面分析的WebViewFactory类的静态成员函数getProvider,它接下来会继续创建一个WebViewFactory。这个WebViewFactory之后可以用来创建WebViewProvider。

WebViewFactory类的静态成员函数getProvider首先需要确定要创建的WebView Factory的类型。这个类型是通过调用另一个静态成员函数getFactoryClass来获取的:

从这里可以看出,WebViewFactory类的静态成员函数getFactoryClass返回的WebView Factory类型为com.android.webview.chromium.WebViewChromiumFactoryProviderForO。这个com.android.webview.chromium.WebViewChromiumFactoryProviderForO类是由前面提到的WebView Package提供的。这意味着WebViewFactory类的静态成员函数getProvider创建的WebView Factory是一个WebViewChromiumFactoryProvider对象:

WebViewChromiumFactoryProvider类的构造函数会调用AwpowserProcess类的静态成员函数loadLipary,对前面加载的Chromium动态库进行初始化:

AwpowserProcess类的静态成员函数loadLipary又调用LiparyLoader类的静态成员函数loadNow,对前面加载的Chromium动态库进行初始化:

LiparyLoader类的静态成员函数loadNow又调用另一个重载版本的静态成员函数loadNow,对前面加载的Chromium动态库进行初始化:

LiparyLoader类重载版本的静态成员函数loadNow又调用另一个静态成员函数loadAlreadyLocked,对前面加载的Chromium动态库进行初始化:

由于并非所有系统都支持在加载动态库时,以文件内存映射的方式替换其GNURELRO Section,因此Chromium自行提供了一个Linker。通过这个Linker加载动态库时,能够以文件内存映射的方式替换待加载动态库的GNURELRO Section,也就是实现前面提到的函数androiddlopenext的功能。在高于安卓5.0的系统中,由于系统已经提供了函数androiddlopenext,Chromium就不会再使用自己的Linker加载动态库,而是改用安卓系统提供的Linker。通过调用System类的静态成员函数loadLipary,即可使用系统提供的Linker来加载动态库。LiparyLoader类的静态成员函数loadAlreadyLocked要加载的动态库由NativeLiparies类的静态成员变量LIpARIES指定:

从这里可以得知,LiparyLoader类的静态成员函数loadAlreadyLocked要加载的动态库就是Chromium动态库。这个Chromium动态库之前已经加载过了,因此这里通过调用System类的静态成员函数loadLipary再次加载时,仅仅会触发其导出的函数JNIOnLoad被调用,而不会重新加载一次。当Chromium动态库导出的JNIOnLoad被调用时,Chromium动态库便会执行初始化工作:

其中的一项初始化操作是为Chromium的Content层设置一个类型为AwMainDelegate的Main Delegate。这个AwMainDelegate实现在Chromium的androidwebview模块中。Android WebView正是通过Chromium的androidwebview模块来加载和渲染网页的。而Chromium加载和渲染网页的功能则实现在Content层,因此Chromium的androidwebview模块需要通过Content层来实现加载和渲染网页的功能。这样一来,Chromium的androidwebview模块就可以给Content层设置一个Main Delegate,以便它们彼此之间能够进行通信。给Chromium的Content层设置一个Main Delegate是通过调用函数SetContentMainDelegate来实现的:

根据前面的分析,参数delegate指向的是一个AwMainDelegate对象,这个AwMainDelegate对象会被函数SetContentMainDelegate保存在全局变量gcontentmain_delegate中。这一步执行完成后,Chromium动态库就在应用进程中加载完毕,并且也完成了初始化工作。与此同时,系统也为应用进程创建了一个类型为WebViewChromiumFactoryProvider的WebViewFactory。回到前面分析的WebView类的成员函数ensureProviderCreated中,此时它会通过调用上述类型为WebViewChromiumFactoryProvider的WebViewFactory的成员函数createWebView,为当前正在创建的WebView创建一个WebView Provider:

WebViewChromiumFactoryProvider类的成员函数createWebView创建的是一个类型为WebViewChromium的WebView Provider。这个WebView Provider将会返回给WebView类的成员函数ensureProviderCreated。WebView类的成员函数ensureProviderCreated再将该WebView Provider保存在成员变量mProvider中。如此一来,正在创建的WebView就获得了一个类型为WebViewChromium的WebView Provider。之后,通过这个WebView Provider,就可以借助Chromium来加载和渲染网页了。

版本更新记录

v151.0.7922.18版本

• 修复了已知漏洞,并优化了性能与运行速度

最新应用

最新文章

  • CF炫角色购买攻略(CF炫角色怎么快速获取)

    嘿,新手玩家们,听说你们对CF炫角色垂涎欲滴,但又不知道怎么快速获取?别急,今天我就来给你们这个攻略, 保证你们看完后不仅能够轻松驾驭炫酷角色,还能在游戏中大杀四方!先说说咱们得了解CF炫角色的获取方式。主要有两种:一是通过游戏内的活动奖励,二是直接用游戏币购...
  • CSGO低分辨率优化技巧(如何提升CSGO画质清晰度)

    低分辨率下画面模糊,主要源于显示器对非原生分辨率的拉伸。解决的关键是:通过显卡设置强制以“点对点”方式显示,再配合游戏内选项,在清晰度和性能间取得平衡。第一步:调整显卡缩放模式(最关键)此操作可防止画面被拉伸,从而消除模糊。NVIDIA显卡:右键桌面,打开“NVI...
  • CSGO倒计时开启方法教程(csgo倒计时怎么开启)

    在CS:GO中开启“倒计时”,通常指的是开启C4炸弹的爆炸倒计时显示,但具体方法取决于你的游戏环境。下面是几种常见情况的详细操作指南。⏱️ 在5E对战平台显示C4爆炸倒计时如果你在5E对战平台游玩,这是最简单直接的方法,因为官方服务器默认不提供此功能。进入5E平台后,点击...
  • ​CFHD配置要求(CFHD电脑配置推荐)

    嘿, 新手玩家们,听说你们对CFHD这款游戏充满期待,但又担心自己电脑配置不够,无法畅享游戏乐趣?别担心,老司机来也!今天 就让我这个玩了10年《暗黑破坏神》系列和《哈迪斯》类动作RPG的老玩家, 给大家来一波CFHD配置要求和技能攻略,让你轻松通关,玩得爽歪歪!先说说来...
  • ​CF手游AWM游骑兵获取方法及途径(CF手游AWM游骑兵怎么获得)

    嘿,新手玩家们,准备好迎接《穿越火线》手游中的AWM游骑兵了吗?这把枪,简直就是狙击界的王者,后坐力小,射速快,简直就是狙击手们的梦想之选。 别急,今天就来给大家揭秘CF手游AWM游骑兵的获取方法及途径,让你轻松成为战场上的狙击高手!先说说咱们得知道,AWM游骑兵并不...
  • CF手游AK47心动次元获取攻略(CF手游AK47心动次元怎么得)

    嘿,新手玩家们,准备好迎接《穿越火线》手游中的AK47心动次元了吗?这把枪,不仅外观炫酷,性能也是杠杠的。今天就让我这个资深游戏博主,带你一步步解锁AK47心动次元的通关与技能攻略,让你在战场上所向披靡!先说说你得知道,AK47心动次元并不是那么容易就能得到的。它隐藏...

相关推荐