主要观点总结
某应用经历灰度发布后出现线上ANR告警,排查后定位到页面onCreate方法执行过久,经火焰图及反编译发现本应是if语句的代码变成了do-while语句,导致主线程卡死。问题涉及自定义插桩工具weaver和R8编译工具。通过分析字节码和ASM方法复制原理,最终定位到多线程并发复制methodNode时导致的labelNode对象被替换的问题。通过增加类锁解决了问题。
关键观点总结
关键观点1: 背景介绍
应用经历灰度发布后线上出现ANR告警,定位到页面onCreate方法执行过久,经查火焰图和反编译发现代码逻辑异常。
关键观点2: 问题分析
初步分析是if和do-while语句互相转化的问题,涉及R8编译工具和自定义插桩工具weaver。通过对字节码和插桩原理的分析,定位到多线程并发复制methodNode导致的labelNode对象被替换的问题。
关键观点3: 解决方法
通过增加类锁解决多线程并发复制methodNode的问题,确保每个线程的复制操作互不干扰。
关键观点4: 总结
问题是由于字节码异常在多线程环境下引发的,对于涉及代码编辑操作的插件开发,需要特别关注并发场景下的稳定性。此类问题在业务规模扩大或环境变更时可能更容易出现。
免责声明
免责声明:本文内容摘要由平台算法生成,仅为信息导航参考,不代表原文立场或观点。
原文内容版权归原作者所有,如您为原作者并希望删除该摘要或链接,请通过
【版权申诉通道】联系我们处理。