You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 7正常Android 8崩溃:path must be convex报错求助

解决Android 8中AdaptiveIconDrawable触发的"path must be convex"崩溃问题

嘿,我之前帮朋友排查过几乎一模一样的问题,咱们来捋清楚怎么搞定它:

首先得明白崩溃的根源:这个java.lang.IllegalArgumentException: path must be convex报错是Android 8(API 26)引入**自适应图标(AdaptiveIconDrawable)**后才会出现的坑。Android 7及以下的系统对图标路径的凸性没有严格要求,但Android 8在生成图标的Outline时,强制要求路径必须是凸形的——简单说就是图标不能有凹进去的部分、交叉的线条,得是一个“向外鼓”的完整形状。

而你遇到的场景是Firebase为空时没事,有数据就崩溃,说明问题出在从Firebase获取数据后加载的图标资源上:比如数据里关联了用户头像、自定义图标,这些图标里有非凸的路径,系统处理时就触发了异常。

接下来给你几个实用的解决方案,按优先级排序:

  • 先排查并修复图标路径
    如果用的是SVG格式的图标,打开Inkscape、Figma这类编辑器,检查路径有没有凹面、交叉或者复杂的曲线。你可以用编辑器的“简化路径”功能清理多余节点,或者手动调整成凸形的形状。比如把带缺口的图标改成完整的圆形、方形,问题基本就能解决。

  • 换成Bitmap格式的图标兜底
    要是不想折腾SVG路径,直接把图标转换成PNG格式,放到对应dpi的资源文件夹里(mdpi/hdpi/xhdpi等)。BitmapDrawable不会触发AdaptiveIconDrawable的路径检查,Android 8就能正常处理了。

  • 代码层面绕过凸性检查
    如果你是自己写的自定义Drawable,或者通过代码加载图标,可以重写getOutline方法,用矩形轮廓替代路径轮廓,直接跳过系统的凸性验证:

    @Override
    public void getOutline(Outline outline) {
        // 用图标所在的矩形区域生成Outline,避免路径检查
        outline.setRect(getBounds());
    }
    

    要是用Glide、Picasso这类图片加载库加载Firebase里的远程图标,也可以配置转换规则,强制生成BitmapDrawable,比如Glide里可以加.asBitmap()的配置。

  • 验证Firebase关联的图标资源
    先临时把数据里的图标URL换成一个你确认没问题的图标(比如系统默认的ic_launcher),如果崩溃消失了,那就实锤是原来的图标资源不符合Android 8的规范,针对性修复那个图标就行。

记住,这个问题本质是Android版本对图标规范的要求差异,只要把图标或者代码适配到Android 8的规则里,就能解决啦。

内容的提问来源于stack exchange,提问作者iamkdblue

火山引擎 最新活动