Android免安装升级体系WebView内核探索

打印 上一主题 下一主题

主题 1556|帖子 1556|积分 4670

背景

Android5.0以后WebView升级需要去Google Play安装APK(图一),就算安装了以后也不肯定能行,像华为、Amazon等特殊机型WebView的Chromium版本一样平常比较低,只能用它本身的WebView无法用Google的WebView(图二)。


华为机上WebView内核的Chromium版本低于107无法播放H265视频,为了解决上述题目可以用JS实现H265播放,但是会比较卡,也可以用腾讯的X5内核,但是免费版实际chromium版本是89不支持H265视频,这个时间我就想能不能用App内的WebView APK作为内核,下图是升级WebView内核的前后结果对比

升级前在华为机上的体系WebView内核包名是com.huawei.webview,版本是14.0.0.331,UserAgent中的Chromium实际版本是99.0.4844.88,如下图所示小于107不支持H265播放

把WebView内核的包名、版本、包地点传到以下代码升级内核乐成后就可以播放H265视频了

WebView内核选择页面如下图所示

升级乐成后WebView内核的包名变成了com.google.android.webview,UserAgent中的Chromium实际版本也变成了122.0.6261.64

项目地点:WebViewUpgrade,这个项目是为了解决WebView碎片化而产生,当前处于测试阶段,如果你以为有所收获,给这个库点个赞吧,你的鼓励是我进步最大的动力,
兼容性

Android的装备五花八门,已测试以下功能和机型
功能特性

WebView包名体系版本com.google.android.webview122.0.6261.64com.android.webview113.0.5672.136com.huawei.webview14.0.0.331com.android.chrome122.0.6261.43com.amazon.webview.chromium118-5993-tv.5993.155.51 机型

厂商体系版本华为Mate3012小米1011VIVO NEX A10OPPO FIND X514 原理先容


其实原理很简朴,从上图中可以看到WebView初始化的时间会根据WebViewProviderResponse(WebViewUpdateService调用waitForAndGetProvider)和PackageInfo(PacakgeManagerService调用getPackageInfo)生成WebViewFactoryProivder,也就是说只要hook这两个方法就行,更换WebViewUpdateService和PacakgeManagerService的调用很简朴,其实就是更换Binder的本地接口调用,网上方案很多就不睁开了,如果不清楚的可以直接看代码。
更换waitForAndGetProvider值得注意的是WebViewProviderResponse对象的packageInfo查询时flags要设置成GET_SHARED_LIBRARY_FILES|GET_SIGNATURES|GET_META_DATA,后续代码中会用这些数据,不然会崩溃。

更换getPackageInfo值得注意的是

  • 用getPackageArchiveInfo查询未安装Apk的PackageInfo
  • 有些APK加上GET_SIGNATURES查询PackageInfo会找不到
  • getPackageArchiveInfo查询出来的PackageInfo不存在nativeLibraryDir,需要手动赋值
  • nativeLibraryDir传入的so路径需要运行时处置惩罚器指令集的ABI一样,不然会崩溃
  • 部分手机的packageInfo.applicationInfo.sourceDir不存在,需要手动赋值

有两个功能还没实现,盼望有了解的朋侪能提交代码解决这两个题目。

  • 运行时动态切换WebView内核,现在只能在WebView未初始化之前更换,原因是因为会报错UnsatisfiedLinkError: Shared library "/system/lib64/libwebviewchromium_plat_support.so" already opened by ClassLoader,WebView内核中会调用System.loadLibrary加载libwebviewchromium_plat_support.so,而体系限制同一个so只能被一个classLoader加载。
  • 不支持多历程功能,如果把WebViewUpdateService的isMultiProcessEnabled设为true,会报错java.lang.RuntimeException: Illegal meta data value: the child service doesn't exist, 就算把这个错误解决了,也无法用Process.startWebView手动启动WebViewZygote历程

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表