一问题背景
最近项目app发布新版本,通过bugly后台发现,在调用系统相册的功能处会出现崩溃“failed to find configured root that contains xxx”,赶紧找来手机测测,发现没问题呀,又多找了几部手机试试,发现也是ok的呀,然后对比报错的系统版本是Android7.0–9.0,而且不是一部机型有问题,应该跟机型没关系,相应的又找了7.0–9.0的系统来试,发现也是ok。怎么办呢?
二问题分析
从日志信息来看,应该是路径配置有问题,然后发现路径配置的也没问题,就去网上搜,网上确实能搜到一波遇到同样问题的同学,比较多的问题是增加root-path标签,但是经过仔细研究,这个标签是应用于外部sd卡存储设备的,而我们访问的是外部存储,使用exteranl-path应该是没问题的,再次陷入僵局。
好在有个同事的手机上能够出现这个崩溃,这就给我们能够大量的试错提供了条件,经过多次调试,终于找到了问题的关键,请看下图:
调用Fileprovider.getUriForFile最终会走到上图这个方法,请看图中画圈的地方,provider内部有缓存处理,如果缓存找到,则不会在查找,而作为缓存的key是 authority,这样说来,authority是唯一标示一个provider的关键信息,不能重复,现在肯定是工程内部存在多个一样authority的provider。最终验证现实果然如此
三总结
关键问题是如何能够定位到原因?反思下整个过程,一开始就追着路径书写配置方面去查找了,这个方向其实是有问题的,但报错信息确实就是提示:路径不对。很容易就会朝着这个方向去走,如果没有复现此问题的手机,基本就会通过修改路径来观察。关键就是通过调试和源码分析定位到了问题。启发:
1、首先应该明白基本原理。比如本次问题的fileprovider,平时用的很少,基本是使用的时候才会去网上搜搜,看怎么配置,怎么写调用代码,然后能使用了就ok了。出了问题呢,则会专注到问题点上去排查。如此则会导致方向一旦走错,则浪费很大精力,而且不能全面把控问题。比较省力的方式是首先知晓原理,比如provider的使用比较多的其实是配置在androidmanifes的部分,通过指定路径,定义authority,指定类名,来标示一个特定provider,那么authority就很重要,再通过源码去确认
1、最好复现问题才能验证修改是否有效