请求 android 大佬帮助解决问题

97 天前
 moonrailgun

最近我们项目出现了一些性能问题,在低配手机上会出现大量的 anr 和 oom 的问题(主要是 android 9 10)

在堆栈上的显示大多是:

invalid pthread_t 0x<sanitized> passed to pthread_getcpuclockid

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

backtrace:
  #00  pc 0x0000000000054070  /apex/com.android.runtime/lib64/bionic/libc.so (abort+164)
  #01  pc 0x00000000000b9110  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_internal_find(long, char const*)+192)
  #02  pc 0x00000000000b9030  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_internal_gettid(long, char const*)+8)
  #03  pc 0x00000000000b8e24  /apex/com.android.runtime/lib64/bionic/libc.so (pthread_getcpuclockid+24)
  #04  pc 0x0000000000498c8c  /apex/com.android.art/lib64/libart.so (art::Thread::GetCpuMicroTime() const+40)
  #05  pc 0x000000000049898c  /apex/com.android.art/lib64/libart.so (art::GetSample(art::Thread*, void*) (.__uniq.52483287290921479263723184702455367361)+204)
  #06  pc 0x0000000000498564  /apex/com.android.art/lib64/libart.so (art::Trace::RunSamplingThread(void*)+320)
  #07  pc 0x00000000000b8b98  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+208)
  #08  pc 0x0000000000055794  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)

java.lang.OutOfMemoryError

Exception java.lang.OutOfMemoryError: std::bad_alloc
  at com.facebook.jni.NativeRunnable.run
  at android.os.Handler.handleCallback (Handler.java:761)
  at android.os.Handler.dispatchMessage (Handler.java:98)
  at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java:27)
  at android.os.Looper.loop (Looper.java:156)
  at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run (MessageQueueThreadImpl.java:233)
  at java.lang.Thread.run (Thread.java:776)

如果能够有对这方面有经验的 android 大佬能支援一下帮助解决/定位问题的话,将万分感谢。

(BTW: 我们的项目是用 RN 写的)

有偿

有意向的请联系微信: amFja3lqamNuOTk5Y2w=

万分感谢

2023 次点击
所在节点    外包
12 条回复
murmurkerman
97 天前
看下 anr oom 分布,普通内存 4gb 以上设备有没有出现。然后需要通过日志埋点还愿用户路径,尝试本地复现。单堆栈信息不足以推断出问题,需要加额外的日志和诊断数据比如定时获取系统和应用内存大小使用情况。先本地本地尝试复现,使用 profier 看 cpu 和内存变化,dump head 对比下是否有大对象泄漏。
zdglf
97 天前
没内存了。应该是有泄漏,得排查
moonrailgun
97 天前
@murmurkerman 1.5g ~ 2g 手机会出现。日志埋点就是在任何地方都会出现。很奇妙。

内存控制在 400m 左右,基本没上过 500m

头疼的原因是行业均值 0.4%,我们 2%。。。。。


大佬可以私聊?
3630cn2023
97 天前
leakcanary 本地测速看有没有内存泄漏,要覆盖全部代码
debuggeeker
96 天前
@moonrailgun 2%离谱了
debuggeeker
96 天前
买低配设备本地排查,先跑半个小时 monkey ,然后排查内存泄露情况
murmurkerman
96 天前
@moonrailgun 2g 设备难,莫非是 Android5.1 之类十年前的设备。低端设备加上非原生的应用难,这类设备我也没有太好的优化方案。

我之前负责的 flutter 应用在低内存设备 3gb 一下冷启动超过 5 秒,好在 flutter 不运行在 main 线程上没有 anr ,除非不用 flutter ,没救。

建议从数据上说话,说服老板去掉这部分设备的支持。1. 活跃用户机型内存分布。2. 每个内存桶中出现 anr 和 oom 的比例。3. 每个内存桶营收数据。4. 如果是 gp 包,好像只影响这些设备上商店排名。

我觉得直接把最低 sdk 提升到 24 的样子差不多了。
murmurkerman
96 天前
看漏了。要用 react native 的工具去看。
对 react native 涉猎不多,通过关键词搜索下 react native anr memory leak
https://medium.com/@hbnguyen/detecting-and-handling-memory-leaks-in-react-native-apps-1453fea08d4d
toby1902
96 天前
最近才看到得物的团队关于类似问题的分享,得物 Android Crash 治理实践

https://mp.weixin.qq.com/s/DAofLOIRqAdCm_wiWZ6m4A
bettesafford24
96 天前
接广告接的太多了
murmurkerman
96 天前
@toby1902 我还从没见过 dns 崩溃的,神奇。最常见的还是 webview 的一些 bug 。
pursuer
95 天前
试试 android:largeHeap="true"看看能不能抢救下,最好还是把很耗内存的代码处理一下

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

https://ex.noerr.eu.org/t/1121747

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

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

© 2021 V2EX