V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tsinghan
V2EX  ›  Android

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

  •  
  •   tsinghan · 2019-04-15 15:57:09 +08:00 · 6339 次点击
    这是一个创建于 1809 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在做一个关于 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 了很长时间没找到思路, 想请有这方面经验的朋友 给点方法和思路 谢谢!

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

    @tsinghan #11 基本没见过 5.0 之后不支持 h264,只不过见过封装不标准导致不支持的
    tsinghan
        13
    tsinghan  
    OP
       2019-04-19 16:29:51 +08:00
    @xuhaoyangx 不支持啊 这个我试过了 底层的 chromium 因为某些原因默认不支持,可以自己编译
    xuhaoyangx
        14
    xuhaoyangx  
       2019-04-19 16:35:59 +08:00
    @tsinghan #13 我这边的机器调用 webview 都支持啊
    tsinghan
        15
    tsinghan  
    OP
       2019-04-22 09:36:18 +08:00
    @xuhaoyangx 方便交流一下吗 我 vx 515726818
    qinmayi110
        16
    qinmayi110  
       2019-11-06 23:25:05 +08:00
    你标题得这个方式,最后解决了么
    shuiniushushu
        17
    shuiniushushu  
       2020-07-17 15:56:44 +08:00
    朋友你好,你的问题解决了吗?我最近也在做这件事,目前进展不多,网上资料都比较老,很多方案现在都运行不起来,现在打算自己编译 chrome,方便的话一起交流
    binsys
        18
    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
        19
    binsys  
       2022-11-28 13:11:59 +08:00
    其实最终还得走上自己编译 chromium webview 的路线,差别无非是用原类名包名或者都改成自己的取舍问题。
    真心不想以自己这技术水平以非专业团队的身份修改打包这个体量的代码。(国内下代码下工具就困难,代码量又真多)。
    X5 又不能用( X5 改了包名,类名,ionic capacitor 之类的写死了 webview 类,不能用了,最重要的是官方不支持离线,必须在线分发,还不支持模拟器)。

    crosswalk intel 开源技术中心 又不维护了。
    jeesk
        20
    jeesk  
       40 天前
    @binsys 话说 hack webview provider 这样应该是不能上架 google play 的吧 ?
    binsys
        21
    binsys  
       39 天前
    @jeesk
    不是 hack system 的 webview provider ,而是 hack 自己的 app 对 webview 的引用,当 app 调用 webview 时,拦截这个调用,并把返回内容替换为自己的私有实现,从而可以使用公版 webview api 但使用自己的 provider 实现,据我分析 字节,百度等都有类似方案。
    jeesk
        22
    jeesk  
       39 天前
    @binsys 拼多多是直接嵌入的 chromium ,貌似拼多多的方案更好?
    jeesk
        23
    jeesk  
       39 天前
    @binsys 看了, 字节跳动使用的自己的 webview . https://ttwebview.bytedance.com/870/7098
    jeesk
        24
    jeesk  
       39 天前 via Android
    刚刚去看了一下 ttwebview.搞了快三年了,文档都不全, 真是服了。 不得不说世界真的就是一个草台班子,都在摸鱼。
    binsys
        25
    binsys  
       38 天前
    @jeesk ttwebview 不是给外部人用的,他是内部自用,文档都在内部。
    jeesk
        26
    jeesk  
       38 天前
    @binsys 不管他 了, 我自己准备先研究拼多多的集成方法, 再研究 ttwebview 的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   955 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 21:47 · PVG 05:47 · LAX 14:47 · JFK 17:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.