Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >线上bug修复之Path.addCircle崩溃

线上bug修复之Path.addCircle崩溃

作者头像
韦东锏
发布于 2021-09-29 07:15:12
发布于 2021-09-29 07:15:12
99700
代码可运行
举报
文章被收录于专栏:Android码农Android码农
运行总次数:0
代码可运行

本期专门介绍一个线上bug的排查跟修复过程,首先看下崩溃路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 #00 pc 00000000003ff65c /system/lib64/libhwui.so (SkPathRef::growForVerb(int, float)+336) [arm64-v8a]
2 #01 pc 00000000003fdb60 /system/lib64/libhwui.so (SkPath::conicTo(float, float, float, float, float)+144) [arm64-v8a]
3 #02 pc 000000000044c6d0 /system/lib64/libhwui.so (SkPath::addOval(SkRect const&, SkPath::Direction, unsigned int)+372) [arm64-v8a]
4 #03 pc 000000000019c05c /system/lib64/libhwui.so (SkPath::addCircle(float, float, float, SkPath::Direction)+76) [arm64-v8a]
5 #04 pc 00000000004220a8 /system/framework/arm64/boot-framework.oat [arm64-v8a]
6 java:
7 android.graphics.Path.addCircle(Path.java:593)
8 com.meitu.app.meitucamera.e.d.w(CameraAroundBlur.java:1172)
9 com.meitu.app.meitucamera.e.d.u(CameraAroundBlur.java:1049)
10 com.meitu.app.meitucamera.e.d.a(CameraAroundBlur.java:271)

接下来看下实际崩溃的代码(历史代码,有删减,实现这部分代码的人已离职)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private Path mPathFullRingBlurArea = new Path();
mPathFullRingBlurArea.reset();                                                   
mPathFullRingBlurArea.addRect(new RectF(mBlurRect), Path.Direction.CCW);         
mPathFullRingBlurArea.addCircle(mCenterPoint.x + left, mCenterPoint.y + top, mOuterRadius, Path.Direction.CW); 
mPathFullRingBlurArea.close();   

可以很明显的看到,就是addCircle方法发生的崩溃,崩溃的地方是系统类Path的方法

还有崩溃2,数量也比较高,崩溃log如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# AppExecutors-mt(32487)SIGSEGV(SEGV_MAPERR)
 1 #00    pc 000000000025cf00    /system/lib64/libhwui.so (SkPathRef::growForVerb(int, float)+456) [arm64-v8a]
 2 #01    pc 00000000003483e4    /system/lib64/libhwui.so (SkPath::addOval(SkRect const&, SkPath::Direction, unsigned int)+472) [arm64-v8a]
 3 #02    pc 00000000003481e4    /system/lib64/libhwui.so (SkPath::addCircle(float, float, float, SkPath::Direction)+72) [arm64-v8a]
 4 #03    pc 00000000002e17e8    /system/framework/arm64/boot-framework.oat [arm64-v8a]
 5 java:
 6 [Failed to get Java stack]

只有native层的log,不过有显示SkPath::addCircle信息,怀疑是同个崩溃(后来也证实,确实是同个崩溃)

当然,看到这里,就可以直接大概猜到崩溃原因的大神,请收下打的膝盖,不过自己的资历不够,于是继续分析

接下来看下其他维度的信息,看下可否辅助定位

崩溃数量:也比较高,影响了上万个用户了

崩溃设备:主要是10的系统,华为的机型

还有其他几个维度的信息,也都没有直接有助于定位问题的

接下来,尝试自己复现,发现本地无法复现,也有让测试配合验证,也没有复现,经内部讨论,怀疑会不会path的参数有问题,于是增加了参数埋点上报,跟着下个版本上线,看下线上实际崩溃时候的参数

发版后,收集log,发现线上崩溃时候的参数,跟本地自测的参数一样,没有异常,这里,初步排除参数异常问题

接下来,继续本地排查,path其实很多地方都在用,其他地方都没有问题,排除是系统Path类的异常,对代码继续断点跟打log验证,发现一个可疑的现象 出问题的这个方法,存在多线程调用的现象

可以发现,有主线程跟异步线程在调用这个方法,时间间隔几十毫秒,path类是用于canvas绘制的,绘制必定是主线程,path本身也不是线程安全的类,由此分析,多线程去操作同一个path实例,本身是不合理的,应该统一放主线程操作,于是做下如下修复

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void updateDiscontinuousBlurAreaPaths() {                                                       
    if (Looper.getMainLooper() != Looper.myLooper()) {
        //path不是线程安全的类,如果不是主线程调用,统一改成主线程调用
        AppExecutors.executeMain(new Runnable() {     
            @Override                                 
            public void run() {                       
                updateDiscontinuousBlurAreaPaths();   
            }                                         
        });                                           
        return;                                       
    }   
    //省略该方法的其他代码
}

修改后,由于无法本地验证,所以等到了下个版本上线后,看了下崩溃情况

发版后发现,最新版本没有再出现了,随着新版本逐渐覆盖上去,整体崩溃持续下降,由此确定问题已修复。

行数:63

字数:846

主题:默认主题

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
干货:ANR日志分析全面解析
这句话说的很笼统,要想深入分析定位ANR,需要知道更多知识点,一般来说,ANR按产生机制,分为4类:
2020labs小助手
2021/06/08
2.5K0
[精彩总结] 🦀️Rust 移动端开发体验
因为rust.cc不支持一些github支持的markdown语法,想要有更好的体验,可以跳到这里
MikeLoveRust
2022/11/28
2.3K0
[精彩总结] 🦀️Rust 移动端开发体验
OpenCv在Android Framework层集成 | 踩坑备忘
OpenCv在计算机视觉方面大有用处,这篇文章主要记录在Android Framework集成OpenCv,对Camera数据流进行处理,遇到的问题记录备忘。
小驰行动派
2024/11/23
1321
OpenCv在Android Framework层集成 | 踩坑备忘
【错误记录】Android 应用执行报错 ( java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[ )
Android 应用中 , 引入了 ijkplayer , 其中涉及到需要加载 libijkffmpeg.so 动态库 , 在 64 位手机中 , 报如下错误 ;
韩曙亮
2023/03/30
1.1K0
【错误记录】Android 应用执行报错 ( java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[ )
AudioTrack引发的应用Crash分析
还有一个信息是对应的场景是音频焦点丢失情况下。 本地尝试复现发现复现不出来,压测也没有复现。 google上搜了下,也有对应的issue,不过没有fix:https://issuetracker.google.com/issues/234934924
一只小虾米
2023/02/17
1.2K0
Android自定义系列——7.Path之基本操作
为了兼容性(偷懒) 本表格中去除了部分API21(即安卓版本5.0)以上才添加的方法。
老马的编程之旅
2022/06/22
8810
Android自定义系列——7.Path之基本操作
Android项目开发填坑记-so文件引发的攻坚战
我负责的项目A要求有播放在线视频的功能,当时从别人的聊天记录的一瞥中发现百度有相关的SDK,当时找到的是Baidu-T5Player-SDK-Android-1.4s,项目中Demo的so库只有armeabi-v7a 版的,由于需要使用的时候拷贝一些界面和图片资源到现有的项目中,所以我就索性直接打包成了aar,经过一番修改就上线了。
他叫自己MR.张
2019/07/01
1.4K0
Android 的 so 文件加载机制提问源码总结参考资料
本文的结论是跟着 System.loadlibrary() 一层层源码走进去,个人对其的理解所整理的,那么开始看源码之前,先来提几个问题:
请叫我大苏
2018/10/25
2.1K0
基于Paddle Lite在Android手机上实现图像分类
Paddle Lite是飞桨基于Paddle Mobile全新升级推出的端侧推理引擎,在多硬件、多平台以及硬件混合调度的支持上更加完备,为包括手机在内的端侧场景的AI应用提供高效轻量的推理能力,有效解决手机算力和内存限制等问题,致力于推动AI应用更广泛的落地。
夜雨飘零
2020/08/02
7900
基于Paddle Lite在Android手机上实现图像分类
ANR日志解析
这句话说的很笼统,要想深入分析定位ANR,需要知道更多知识点,一般来说,ANR按产生机制,分为4类:
派大星在吗
2021/12/16
2.1K0
FFmpeg4.0.2编译32位和64位动态库,并且引入到Android项目中
近期刚好用到FFmpeg来处理视频编码,由于网上各种版本的so库大部分都32位的,所以打算自己来编译32位和64位的库,我之前有写编译32位的库https://cloud.tencent.com/developer/article/1661468里面有关于ndk和32位的相关配置。今天主要是总结一下FFmpeg的64位的动态库编译。
包子388321
2020/07/14
2.9K0
自定义控件详解(二):Path类 相关用法
Path:路径 绘制路径:void drawPath (Path path, Paint paint) Path 可以绘制的路径 一、直线路径 1、基本方法       void moveTo (
听着music睡
2018/06/08
9200
Android关于Path你所知道的和不知道的一切
张风捷特烈
2024/01/26
2920
Android关于Path你所知道的和不知道的一切
Flutter的原理及美团的实践
Flutter是Google开发的一套全新的跨平台、开源UI框架,支持iOS、Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件。自从2017年5月发布第一个版本以来,目前Flutter已经发布了近60个版本,并且在2018年5月发布了第一个“Ready for Production Apps”的Beta 3版本,6月20日发布了第一个“Release Preview”版本。
美团技术团队
2019/04/04
3.3K0
Flutter的原理及美团的实践
系统应用集成过程中的一些坑背景知识点正文埋坑后记参考资料
埋这些坑的最初来源是由于测试人员在集成新终端设备时提了个 bug: app 在这个设备上无法启动。
请叫我大苏
2018/11/29
1.1K0
系统应用集成过程中的一些坑背景知识点正文埋坑后记参考资料
【错误记录】Android Studio 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | 指定 APK 打包动态库的 CPU 架构 )
外部引用 so 动态库 , 如果只有一个 armeabi-v7a 的动态库 , 那么如果在 arm64 的手机上执行 , 就会报如下出错误 ;
韩曙亮
2023/03/29
7230
【错误记录】Android Studio 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | 指定 APK 打包动态库的 CPU 架构 )
Path类的最全面详解 - 自定义View应用系列
举例说明2:(非零环绕数规则) 从上面方法分析到,任何图形都是由点连成线组成的,是具备方向的,看下图:(矩形是顺时针)
Carson.Ho
2019/02/22
6640
Android自定义View【实战教程】3⃣️----Paint类、Path类以及PathEffect类详解
Style.FILL:实心 Style.FILL_AND_STROKE:同时显示实心和空心 Style.STROKE:空心
先知先觉
2019/01/21
1.2K0
【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )
② 主要作用 : 主要作用是配置本工程中的 C/C++ 源码如何编译成动态库的 ;
韩曙亮
2023/03/27
3.2K0
【错误记录】Android 应用配置第三方 so 动态库 ( /data/app/comxxx==/base.apk/lib/arm64-v8a]couldn‘t find “libx.so“ )
Java 中加载动态库时 , 由于在应用中没有配置对应动态库信息 , 报上述错误 ;
韩曙亮
2023/03/29
9930
【错误记录】Android 应用配置第三方 so 动态库 ( /data/app/comxxx==/base.apk/lib/arm64-v8a]couldn‘t find “libx.so“ )
推荐阅读
相关推荐
干货:ANR日志分析全面解析
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验