Android 7正常Android 8崩溃: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




