如何让 Android webview 渲染自己编译的 Chromium webview?

2019-04-15 15:57:09 +08:00
 tsinghan

我在做一个关于 webrtc 的项目,视频采用的是 h264 格式。 我打算用 webview 来加载视频页面, 我查了查 webview 内核用的是 Chromium,但是默认是支持 h264 这种格式

我的想法是自己编译一个 Chromium webview,修改一下参数 让其支持 h264, 参考下面文章 https://www.chromium.org/developers/how-tos/build-instructions-android-webview

目前遇到的困惑是,文章里面说安装需要 root 卸载手机的 webview,这对于用户来说 显然不可接受,可不可以安装一个和系统不冲突的,并且让安卓 webview 指定渲染这个自己编译的 webview ? 我 google 了很长时间没找到思路, 想请有这方面经验的朋友 给点方法和思路 谢谢!

12000 次点击
所在节点    Android
27 条回复
ysc3839
2019-04-15 16:07:12 +08:00
你看的那篇文章说的是构建系统级的 Webview 吧,你需要的是弄个像 Chrome 这样的独立的浏览器。
tsinghan
2019-04-15 16:35:34 +08:00
@ysc3839 这个 Chromium webview 我能编译好, 但是不知道该如何用? 在 Android 里面 用 webview 组件渲染的时候 能调用编译好的这个 webview 而不是系统的 webview
Lin0936
2019-04-15 16:56:18 +08:00
1.webview 实现可以在开发者选项切换,但需要用户自己手动。
2.参考企鹅厂 X5 内核 Webview 实现方式。
nanaw
2019-04-15 17:01:29 +08:00
你需要做一个套壳的 chromium 浏览器。。
不然即使自己额外安装 webview 的话,也只有原生系统可以手动切换
tsinghan
2019-04-15 20:08:17 +08:00
@Lin0936 这样也不行吧? 开发模式可以切换, 生产模式咋弄
tsinghan
2019-04-15 20:08:59 +08:00
@nanaw 是不是可以自己编译一个 webview 的 lib 然后在 Android app 里面指定这个 package
ysc3839
2019-04-15 23:14:52 +08:00
fvckDaybyte2
2019-04-16 09:47:37 +08:00
你都编译好了,直接在 Android 上运行呗,然后再往上加代码就行了,和 root 啥关系,为啥非要用 Android webview ……
tsinghan
2019-04-16 13:32:48 +08:00
@fvckDaybyte2 我是用 React Native 开发安卓 里面有个控件是 webview, 我编译好了只是一个 apk, 你说的直接在 Android 上运行啥意思
opengg
2019-04-17 14:35:13 +08:00
Android 4.4 以上的 webview 支持 h264。
tsinghan
2019-04-18 09:58:02 +08:00
@opengg 默认是不支持的 需要自己编译
xuhaoyangx
2019-04-19 11:40:02 +08:00

@tsinghan #11 基本没见过 5.0 之后不支持 h264,只不过见过封装不标准导致不支持的
tsinghan
2019-04-19 16:29:51 +08:00
@xuhaoyangx 不支持啊 这个我试过了 底层的 chromium 因为某些原因默认不支持,可以自己编译
xuhaoyangx
2019-04-19 16:35:59 +08:00
@tsinghan #13 我这边的机器调用 webview 都支持啊
tsinghan
2019-04-22 09:36:18 +08:00
@xuhaoyangx 方便交流一下吗 我 vx 515726818
qinmayi110
2019-11-06 23:25:05 +08:00
你标题得这个方式,最后解决了么
shuiniushushu
2020-07-17 15:56:44 +08:00
朋友你好,你的问题解决了吗?我最近也在做这件事,目前进展不多,网上资料都比较老,很多方案现在都运行不起来,现在打算自己编译 chrome,方便的话一起交流
binsys
2022-11-28 12:58:04 +08:00
回个旧帖子吧,Tencent X5 虽小但并不和胃口啊。

google 以及手机 vendor 安全原因,限制自己编译的 webview 通过系统提供的接口替换系统 webview (通过包名以及签名限制),如果你不 root 能做到,可以找 google 拿奖金的,那是安全问题了。

大概研究了下国内各大长各有各的方案,各有千秋,干了一堆活就为了解决 webview 碎片化(附加防被手机长加广告吧)。

比如我目前就遇到 vue3 的 webview 兼容问题,ES6 proxy 之类的 坑不少(不是做前端的,不太懂,都是更新 webview 就能解决的问题)。

1. 自己编译自己的 webview ,全面改包名及类名,东西都是自己的了,相当于引用一个正常的 aar ,干啥都行。

优点:
可与系统 webview 并存,完全自己的,干啥都行。甚至可以打包上 playstore 。

缺点:
工作量太大,tracking upstream 太累,毕竟把包名类名都改了,漏下一处肯恩就是 bug ,没专门团得的小厂不好消化。
包太大,100+版本的 webview 轻松增加 100MB 以上
没生态(特指大厂不需要的 phonegap ionic capacitor reactnative 之类的生态),因为这类框架里面有的写死了对 android/webkit/WebView 类的引用,你没完美办法让他们调用 android/webkit/WebView 时转向你自己的 WebView 类。

2. 还是自己编译自己 webview ,包名类名不改,app 启动时通过对 ClassLoader 和 webviewupdate 服务及 WebViewFactory.getProvider 的某些 hook 操作,让自己的 WebViewProvider 为 WebView 服务( 5.X+以后 WebView 基本上是个壳子,实际工作交给了 Provider ),

优点:
生态在(我等小厂喜欢),工作量没 1 大,减少了一些兼容问题,

缺点:
但增加了一些兼容问题,在 android 9 + 上得考虑如何安全的越过 hidden api 限制( Provider 是 hidden api )
部分魔改 WEBVIEW 机型兼容性问题,以及资源加载问题。

3. 偷懒取巧办法(大厂可能涉到 apk 分发及授权问题)
用原厂 Google 的 webview ,(比如从 apkmirror 上找到合适版本),当 app 启动时检测当前 webkit 版本,当过低,引导用户下载并安装官方原版 webview (因为墙,得放一个合适的国内 cdn 上)。然后重启 app ,再检测新的 webview apk 包有没有,如果有,获取当前使用 webview 是否是新包,如果是,恭喜你省事儿了。但就有一些手机 rom 厂商写死了不用你安装的 google 官方原版 webview ,这时候就得重复部分 2 里的方法,在你自己 APP 级别上 hook 一些东西,让你的 app 的 webview 找 provider 时强制用 google 的 webview 。(自己的 app 自己的进程,不是替换系统共享 webview ,那不在计划内)

优点:连 webview 都不用编译了,有 google 官方维护,香。
缺点:
得引导用户从未知来源安装这个虽然是官方未修改,但依旧被各种 rom 判定并警告的 apk ( MIUI 未知来源开关界面不定位到列表的具体 apk 上,得用户自己在大列表里翻找到你想开未知来源的 app ,且被判定为系统组件,必须在开发者选项里关掉 MIUI 优化后才能安装),其他手机接触少,华为 锤子(存量用户真有啊)没这些麻烦。

在自己 app 里替换 webview provider 代码参考:
https://github.com/anxinxu/bugs
binsys
2022-11-28 13:11:59 +08:00
其实最终还得走上自己编译 chromium webview 的路线,差别无非是用原类名包名或者都改成自己的取舍问题。
真心不想以自己这技术水平以非专业团队的身份修改打包这个体量的代码。(国内下代码下工具就困难,代码量又真多)。
X5 又不能用( X5 改了包名,类名,ionic capacitor 之类的写死了 webview 类,不能用了,最重要的是官方不支持离线,必须在线分发,还不支持模拟器)。

crosswalk intel 开源技术中心 又不维护了。
jeesk
313 天前
@binsys 话说 hack webview provider 这样应该是不能上架 google play 的吧 ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/555356

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX