
评分:
好评:
差评:
手机扫描下载
谷歌webview是谷歌官方开发并预装在安卓系统中的核心组件,它主要用于渲染网页内容并执行相关代码,能够有效优化网页数据加载与处理,协助用户管理浏览历史记录等,用户可通过本站获取该应用,进一步探索其丰富的功能特性。
1、启用后能显著提升手机网页浏览的流畅度,优化各类网页数据的加载与呈现效果,是一款实用的网页辅助工具。
2、采用定制化的架构处理器进行高效处理,带来多样化的网页信息展示体验,系统组件可自定义配置,运行稳定可靠。
3、提供无缝接入式的操作体验,支持多种类型的应用程序调用,用户可根据需要自行安装,内容通过网页形式直接呈现。
【位置感知浏览】
根据您的位置提供更相关、更有用的资讯。
【同步功能】
可在不同设备间同步浏览历史、书签、保存的密码以及当前打开的网页标签。
【扩展支持】
允许用户通过添加扩展插件快速定制浏览器功能。
【浏览速度】
启动迅速,并能帮助用户快速找到所需信息。
以Android 8.0源码为例,首先需要定位WebView的实际构造函数:

该构造函数会调用ensureProviderCreated()成员函数,以确保Chromium动态库已被加载;在库已加载的情况下,此函数还会创建一个WebViewProvider对象并将其保存在成员变量mProvider中,这个WebViewProvider才是实现WebView各项功能的核心组件;例如loadUrl(String url)等主要方法,基本都是通过mProvider来完成的。

获得mProvider后,WebView的构造函数会继续调用mProvider.init(javaScriptInterfaces, privatepowsing)来启动网页渲染引擎;对于基于Chromium的实现,其WebViewProvider是一个WebViewChromium对象,该对象的init成员函数被调用时,便会启动Chromium的网页渲染引擎。
接下来查看ensureProviderCreated的具体实现:

WebView的ensureProviderCreated函数首先调用checkThread确保自己在正确的线程中执行,接着判断mProvider是否为null;若为null,则表示尚未为当前WebView创建Provider,此时它会先调用getFactory获取一个WebViewFactory,然后利用该工厂的createWebView方法创建一个WebViewProvider。
下面分析getFactory()方法及其实现:

getFactory返回的WebView Factory是通过WebViewFactory类的静态成员函数getProvider获得的;getProvider首先检查静态变量sProviderInstance是否为null,若为null则说明当前应用进程尚未加载Chromium动态库,此时需要加载该库并创建一个WebView Factory,将其保存在sProviderInstance中;我们先分析Chromium动态库的加载过程,再分析WebView Factory的创建。
加载Chromium动态库是通过WebViewFactory的静态成员函数loadNativeLipary完成的:

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

LoadWithRelroFile会判断自身是32位还是64位,然后从参数lib32和lib64中选择对应的Chromium动态库进行加载。
实际加载工作由另一个函数DoLoadWithRelroFile完成:

DoLoadWithRelroFile通过Linker导出的函数androiddlopenext,在Zygote进程预留的地址空间中加载Chromium动态库;应用进程由Zygote进程fork而来,因此也继承了该地址空间;此函数会告知androiddlopenext在加载时,将参数relro描述的Chromium GNURELRO Section文件映射到内存,并替换已加载库的对应部分,这是通过指定ANDROIDDLEXTUSERELRO标志实现的;之所以可行,是因为两个进程加载同一动态库的地址相同,使得链接与重定位信息完全一致,从而可通过内存映射共享,达到节省内存的目的。
完成这一步后,Chromium动态库即在应用进程中加载完毕;回到WebViewFactory的静态函数getProvider,它接下来会创建一个WebView Factory,用于后续生成WebViewProvider。
getProvider首先需要确定要创建的WebView Factory类型,这通过调用另一个静态函数getFactoryClass获得:

由此可见,getFactoryClass返回的WebView Factory类型为com.android.webview.chromium.WebViewChromiumFactoryProviderForO,该类由前述WebView包提供;这意味着getProvider创建的WebView Factory是一个WebViewChromiumFactoryProvider对象:

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

AwpowserProcess的loadLipary又调用LiparyLoader类的静态函数loadNow执行初始化:

LiparyLoader的loadNow再调用另一个重载版本的loadNow进行初始化:

重载的loadNow接着调用静态函数loadAlreadyLocked完成初始化:

并非所有系统都支持在加载动态库时以内存映射方式替换其GNURELRO Section,因此Chromium自带了一个Linker;在Android 5.0以上版本中,系统已提供androiddlopenext函数,故Chromium会使用系统Linker而非自有Linker来加载库;调用System的静态函数loadLipary即可使用系统Linker,loadAlreadyLocked要加载的库由NativeLiparies的静态变量LIpARIES指定:

由此可知,loadAlreadyLocked要加载的正是Chromium动态库;该库此前已加载,此处再次调用System.loadLipary仅会触发其导出的JNIOnLoad函数被调用,而不会重复加载;JNIOnLoad被调用时,Chromium动态库会执行初始化操作:

其中一项关键初始化是为Chromium的Content层设置一个类型为AwMainDelegate的Main Delegate;AwMainDelegate由Chromium的androidwebview模块实现,Android WebView通过该模块加载和渲染网页,而网页加载渲染功能又由Content层提供,因此androidwebview模块可通过设置Main Delegate与Content层通信;设置操作通过调用函数SetContentMainDelegate完成:

参数delegate指向一个AwMainDelegate对象,该对象会被SetContentMainDelegate保存在全局变量gcontentmain_delegate中;至此,Chromium动态库在应用进程中加载并初始化完成,同时系统也创建了一个WebViewChromiumFactoryProvider类型的WebView Factory;回到WebView的ensureProviderCreated函数,此时它将通过该工厂的createWebView方法为当前WebView创建WebView Provider:

WebViewChromiumFactoryProvider的createWebView创建的是一个WebViewChromium类型的WebView Provider;该Provider返回给ensureProviderCreated后,被保存在WebView的成员变量mProvider中;此后,WebView即可通过此Provider借助Chromium加载和渲染网页。
1、安卓设备上的谷歌搜索应用能够提供流畅的网络搜索体验。
2、此官方搜索应用可同时检索网络内容与设备本地信息。
3、本地搜索范围包括已安装应用、浏览器书签与历史、联系人以及音乐文件等。
v138.0.7204.67:
• 修复了若干问题并提升了运行速度。
最新评论