电脑系统网 - 专业安卓软件下载网站!

当前位置:首页 > 安卓下载 > 应用 > 系统安全 > 详细页面
  • 应用介绍
  • 应用截图
  • 专题合集
  • 网友评论

WebView安卓版本它是Android操作系统中的一个组件,允许Android应用程序在应用程序的用户界面中显示网页内容。它是一个Web浏览器引擎,负责渲染网页,执行JavaScript代码,并处理与Web相关的其他功能。在Android 7.0(Nougat)在此之前,Webview作为一个单独的应用程序被捆绑在一起,并通过谷歌 更新Play商店。从Android。 从7.0开始,Webview通过常规系统更新成为一个系统组件。

许多Android应用程序,特别是那些包含网页内容或基于web功能的应用程序,依赖于webview来显示网页或与web服务互动。开发人员可以通过使用webview在其应用程序中无缝嵌入网页内容,从而创建更集成的用户体验。通过webview显示的web内容通常基于设备上默认的web浏览器使用的相同渲染引擎,如谷歌 Chrome或Android浏览器(在Chrome成为默认浏览器之前使用的浏览器)。这可以保证开发人员在不同的应用程序中提供一致的Web体验,并与Web标准和技术兼容。

webview是什么?

webview是一个视觉组件,是原始应用程序的视觉部分。它可以嵌入移动终端,实现前端的混合开发。大多数混合开发框架都是基于webview模式进行二次开发的。例如:APIcloud、uni-app等框架。

一、webview入门知识

1、我们通常使用浏览器浏览网页。你清楚地知道你在使用浏览器,要么是个人电脑客户端,要么是手机上的应用程序。但webview是一个嵌入式浏览器,嵌入在原始应用程序中,你可能没有意识到你在使用浏览器。

2、传统浏览器分为两部分,UI(地址栏、导航栏)和浏览器引擎。webview是原生应用中的浏览器引擎。

3、webview只是一个可视化的组件,是原生APP的视觉部分。

4、webview显示的内容不需要存储在本地,可以直接从服务器获取。

5、这种灵活性打开了web应用程序和世界,希望在原始应用程序中显示web应用程序代码可以直接重用。

6、在webview中运行的JS代码有能力调用原始系统API,没有传统浏览器沙箱的限制。

7、沙箱的存在是因为你永远不能完全信任加载的web内容,所以你不能允许它呼叫原始系统API。在webview中,开发人员通常可以完全控制加载的内容,恶意代码进入并在设备上造成混乱的可能性很低。

8、在webview中,JS代码可以与本地应用代码进行通信,也可以调用本地API集成酷炫的系统级功能,如传感器、存储、日历、联系人等。

二、webview的用法

1、显示链接内容作为APP内置浏览器。

2、用于显示广告。

3、完全承载应用程序中的所有交互。从技术角度来看,这些仍然是本地应用程序,但其唯一的本地操作是托管webview,称为混合应用程序。从部署和更新的角度来看,混合应用程序非常方便。

4、作为本地应用程序的扩展。由于web技术的简单性和强大性,许多本地应用程序将提供加载项或扩展程序来扩展其功能。这些加载项和扩展通常是HTML、CSS、而不是C 、C#或者其他建筑。

三、webview的精髓

webview实际上只是一个在再应用程序中设置位置和大小的浏览器,不会放置任何花哨的UI。

在大多数情况下,除非您调用本地API,否则无需在webview中专门测试web应用程序。

WebView的几种常见功能使用方法

Android的WebView组件可以说是相当强大的,现在项目中常用的几个功能总结如下:

一、背景设置

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

WebView.setBackgroundResource(R.drawable.yourImage);//然后设置背景图片

二、获得Webview网页加载初始化和事件完成

步骤:

1、创建自己的Webviewclient(继承 WebViewClient Webviewclientent)

2、重载里面的 onPageFinished(WebView view, String url)方法,(webview加载完成后会调用此方法),这种方法会把自己想做的事情放在webview加载完成后。

3、关联你自己的webviewclient 与 webview 通过 这个方法:webView.setWebViewClient( new WebViewClient();

如果需要监控加载进度,则需要创建自己的webchromeclient类别,并重载onprogreschanged,然后

布局文件:

需要注意的是,webView的一系列用法,例如, webView.getSettings()。setJavaScriptEnabled(true);javscriptt可用于设置;

等等,具体参考API

在new生成一个setWebChromeClient之后,可以在内部类中写入进度条。 onProgreschanged事件

总结:在Webview的设计中,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渲染引擎的启动过程

这里有Android 为了解释8.0的源代码,首先要找到Webview的真实结构函数:

该结构函数将调用另一个成员函数ensureprovidercreated(),以确保chromium动态库已加载。当chromium动态库已加载时,webview类成员函数ensureprovidercreated还将创建webviewprovider对象,并将其保存在成员变量mprovider中。这个webviewprovider实际上是真正用于实现webview功能的幕后领导者。上诉那些安卓 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()方法及其实现情况:

Webview返回getFactory Factory是通过调用webviewfactory类静态成员函数getprovider获得的。getprovider首先是判断静态成员变量sproviderinstance的值是否等于null。如果等于null,则表明目前的应用程序过程尚未加载chromium动态库。在这种情况下,需要加载chromium动态库和创建webviewew Factory,保存在静态成员变量sproviderinstance中。接下来,我们将首先分析chromium动态库的加载过程,然后分析webview Factory的创建过程。

通过调用webviewfactory类静态成员函数loadNativelipary,加载chromium动态库:

loadnativelipary将首先调用成员函数getwebviewnativeliparypaths获取要加载的chromium动态库的文件路径,然后调用另一个静态成员函数nativelowithrelrofile加载。加载时,将指定一个chromium GNURELRO Section文件。这个Chromium GNURELRO 当系统启动时,通过启动临时过程生成Section文件。其中,静态成员函数nativeloadWithrelrofile是由CNI方法制成的JNI方法 LoadWithrelrofile实现层的函数:

LoadWithrelrofile判断自己是32还是64,然后从参数lib32和lib64中选择相应的chromium动态库进行加载。

通过调用另一个函数DoloadWithrelroFile来实现这一加载过程:

函数DoloadWithrelofile的实现是通过Linker导出的函数androidlopenext在Zyogote过程保留的地址空间中加载Chromium动态库。请注意,Zygote过程fork提供了App过程,因此它还将获得Zygote过程预留的地址空间。然而,函数doloadWithrelofile将告诉函数androidlopenext,在加载chromium动态库时,参数relo描述的chromium GNURELRO Section文件的内存映射到内存中,并取代加载的chromium动态库的GNURELRO Section。这是通过指定ANDROIDLEXTUSERELRO标志来实现的。这样做的原因是参数relro描述的Chromiummium GNURELRO 与Section文件对应的Chromium动态库的加载地址与当前应用程序加载的Chromium动态库的地址一致。只要两个相同的动态库在两个不同的过程中具有相同的加载地址,其链接和重定位信息就完全相同,因此可以通过文件内存映射共享。共享后,可以达到节省内存的目的。

这一步完成后,App进程加载完成chromium动态库。回到前面分析的Webviewfactory静态成员函数getprovider,它将继续创建webviewfactory。这个webviewfactory可以用来创建webviewprovider。

Webviewfactory静态成员函数getprovider首先要确定要创建的webview Factory的类型。这种类型是通过调用另一个静态成员函数获得FactoryClass获得的:

从这里可以看出,Webviewfactory类静态成员函数getfactoryclass返回Webview com是Factory的类型.android.webview.chromium.WebViewChromiumFactoryProviderForO。这个com.android.webview.chromium.WebviewchromiumfactoryProviderforo类是前面提到的Webview Package提供的。这意味着Webviewfactory类静态成员函数getProvider创建的Webviewew Factory是WebviewchromiumFactoryProvider的对象:

Webviewchromiumfactoryprovider类的结构函数将调用awpowserproces类的静态成员函数loadlipary初始化前面加载的chromium动态库:

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

Liparyloader类静态成员函数loadnow调用另一个重载版本的静态成员函数loadnow初始化前面加载的chromium动态库:

Liparyloader类重载版的静态成员函数loadnow调用另一个静态成员函数loadalreadylocked初始化前面加载的chromium动态库:

并非所有系统在加载动态库时都支持GNURELRO,而不是文件内存映射。 Section,所以Chromium自己提供了一个Linker。通过这个Linker加载动态库时,GNURELRO可以用文件内存映射代替要加载的动态库 Section,也就是说,实现上述函数androidlopenext的功能。高于Android 在5.0中,由于系统已经提供了函数androidlopenext,chromium不会使用自己的linker来加载动态库,而是使用android系统提供的linker来加载动态库。使用系统提供的Linker,通过调用System类静态成员函数loadLipary来加载动态库。Liparyloader类静态成员函数loadaleadylocked要加载的动态库由Nativeliparies类静态成员变量liparies指定:

从这里可以看出,LiparyLoader类静态成员函数LoadalreadyLocked要加载的动态库是Chromium动态库。这个Chromium动态库已经加载在前面,所以当调用System类静态成员函数LoadLipary再次加载时,只会触发其导出的函数JNionLoad被调用而不会再加载。当Chromium动态库导出的JNionLoad被调用时,Chromium动态库将进行初始化:

最初的操作之一是为Chromium的Content层设置一种类型的AwmaindelegateMain Delegate。在Chromium的androidwebview模块中实现了Awmaindelegate。Android Webview是通过Chromiumandroidwebview模块加载和渲染网页的。Chromium在Content层中实现了加载和渲染网页的功能,因此,Chromium的androidwebview模块通过Content层实现了加载和渲染网页的功能。这样,Chromiumandroidwebview模块就可以设置Main Delegate给Content层,让它们能够相互交流。为Chromium的Content层设置Mainin 通过调用函数Setcontentmaindelegate实现Delegate:

从前面的分析可以看出,参数delegate指向Awmaindelegate对象,该Awmaindelegate对象将被函数setcontententmaindelegate保存在全球变量gcontententmain_delegate中。这一步完成后,Chromium动态库在app过程中加载,初始化工作已经完成。与此同时,该系统还为应用程序进程创建了一种WebviewfactoryProviderwebviewfactory。回到前面分析的webview类成员函数ensureprovidercreated,此时它将通过调用上述类型为webviewchromiumfactoryprovider的webviewfactory的webview为当前创建的webview创建一个webview Provider:

WebviewchromiumfactoryProvider类成员函数createwebview创建了一种webviewwwewwiew Provider。这个WebView Provider将返回Webview类成员函数ensureProvidercreated。Webview类成员函数ensureProvidercreated,然后将Webview类成员函数ensuredercreated。 Provider存储在成员变量mProvider中。通过这种方式,正在创建的WebView获得了一个WebView,类型为WebViewChromium Provider。将来通过这个Webview Provider,Chromium可以加载和渲染网页。/p>