V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
retrocode
V2EX  ›  问与答

[技术相关]有大手子吗?进来讨论下,安卓 POS 机给 webview 分配了极小的内存( jsHeapSizeLimit )导致程序闪退,有人遇到过吗?

  •  1
     
  •   retrocode · 163 天前 · 993 次点击
    这是一个创建于 163 天前的主题,其中的信息可能已经有所发展或是发生改变。

    客户机是微信支付 POS 机, 推广款免费摆店里那种, 安卓 8.1, 只有 2G 内存, 启动剩余 900mb 左右, 系统自带的 webview 版本是 61, 应用内置了腾讯 X5 内核, 由于性能问题考虑,程序采取的策略是启动预读取全部需要数据(webview 嘛), 最近发现了部分产线闪退的情况, 我们测试发现是 X5 内核给 webview 分配了一个极低的最大内存(132mb), 导致当程序 webview 占用内存达到 160mb 左右时(实测出来的数据)程序就会因为 GC 被干掉导致闪退

    数据来源是通过 performance.memory.jsHeapSizeLimit 获取统计到的

    我进行了下测试,编写个测试 html 不间断生成对象,同时记录内存占用一直到闪退,测试发现原生 webview61 默认给分配的是 527.38mb, 腾讯 X5 则只给程序分配了 132.56mb, 严谨起见我安装了个夸克浏览器(webview100)发现夸克也给测试页面分配了 527.38mb(夸克到达极限内存的情况是页面重载而不是闪退)

    很奇怪的一点, 感觉这个最大内存限制似乎来自于某项配置但我没找到, 不然没理由夸克和系统的 webview 分配的内存是完全一致的,腾讯 X5 这项就小的离谱了

    以下图中数据均来自于 performance.memory , 堆大小和总堆大小可以不用管安卓端 webview 这两项数据是初始页面数据不会刷新, 最终占用内存是调试模式查看的, 所有图片全部是 闪退/重载前 最后一刻拍的,可以看到夸克和系统 webview 数据很接近基本一致, 证明 performance.memory.jsHeapSizeLimit 确实有参考性

    以下为夸克数据(webview100) Imgur

    以下为系统 webview 数据(webview61) Imgur

    以下为腾讯 X5 数据(webview89) Imgur

    现在我的问题有没有什么操作可以扩大 安卓端系统为 webview 分配的最大内存 很搞不太想适配 webview61...

    第 1 条附言  ·  160 天前
    X5 的官方真的是, 加群几天不给通过无反应, 看个文档还得申请也是好久没回应, 真的是佛了
    11 条回复    2024-07-19 10:04:12 +08:00
    Cabana
        1
    Cabana  
       162 天前 via iPhone
    夸克用的就是系统内核,跟系统 webview 一样是肯定的
    Cabana
        2
    Cabana  
       162 天前 via iPhone
    @Cabana 想当然了,没注意楼主截图里夸克用的是 Chrome 内核
    murmur
        3
    murmur  
       162 天前
    pos 是要扫码么,扫码用的摄像机很吃资源的,这玩意有可能才是闪退的元凶

    现在还真有人刷信用卡啊,不都是绑着码刷卡么
    retrocode
        4
    retrocode  
    OP
       162 天前 via iPhone
    @murmur 不是扫码,测试页面单纯生成对象占内存,达到 160mb 也会闪退,当然闪退不是核心问题,这种销售软件连重载都是不能接受的,我司主要是开便利店的,要同时兼容 windows 和安卓,所以核心选的 webview 。主要是问题设备是支付宝和微信支付送的,所以配置很低。
    retrocode
        5
    retrocode  
    OP
       162 天前 via iPhone
    @murmur 核心问题是无论如何 x5 分配的 130mb 也太低了,即使现在优化好了后续还是得注意此类问题。很费解,都不知道 x5 哪里配置有问题( x5 也没多少配置……)
    bagel
        6
    bagel  
       162 天前
    你们接入 x5 应该有对接人吧,找他们问问。x5 改不了还有个办法:用 svelte 这种框架,内存占用能比 react 低 50%,当然你得做好别内存泄漏。
    IvanLi127
        7
    IvanLi127  
       162 天前
    一百多兆也不算太小。chromium 是能调,x5 不了解,这个限制一般就是浏览器内核限的,x5 应该是得能调,不然就太半成品了
    liu731
        8
    liu731  
       162 天前
    android:largeHeap="true"
    okakuyang
        9
    okakuyang  
       162 天前
    我没仔细研究过安卓这边的情况,我推测一下。如果你用系统 webview 和 chromewebview ,夸克浏览器不是一项以体积小闻名吗?估计没有带 webview 内核,是调用的系统的 chrome webview 。其中系统 webview 和 chrome webview 都是被系统支持的可选组件,他们的进程是独立于你的 App 的,如果内存爆了,被系统杀掉,是不影响你主 App 的进程的,所以表现是重载。(这一点 iOS 上是这样的,iOS 的 webview 内存限制是 300M )但是你用腾讯 x5 的话,可能它是作为动态库和你 App 一起加载的,是和你主 App 绑在一起的,webview 占用的内存和你 App 的内存是一起算的,那么当然它不可能设置那么大,因为你主 App 还要使用一部分内存。因为 x5 现在也不怎么维护了,使用起来也有不可调和的矛盾,我现在是不用 x5 了,我现在用的是第三方开发者维护的一个 cosswalk 项目,或者用火狐的内核。缺点是安装包体积会增加 50 多兆左右,优势是 webview 版本新一点,但是关于这两个内存限制我没有去了解。
    kimzn33251
        10
    kimzn33251  
       162 天前
    你的 webview 被杀死时,app 处于前台还是后台,一般说来处于前台不会被系统干掉,因为你有最高的进程优先级,所以我对你说的干掉不是很明确。还是说你的 app OOM 了,表现出来是闪退,这需要抓一下 crash 日志看下具体错误再进一步分析。
    retrocode
        11
    retrocode  
    OP
       160 天前
    @kimzn33251 无需其他分析了, 就是内存分配的问题, 这我截图里提到的 https://supermario.vip/test.html 测试页面纯生成对象, 写了 demo 启动直接访问, 甚至在 X5 内核 demo 和 系统自带浏览器里 访问结果都是一样的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3699 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 10:35 · PVG 18:35 · LAX 02:35 · JFK 05:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.