主源码集定义的文件路径为何在Android Flavor中不可见?
关于多Flavor维度下FileProvider路径资源不生效的问题
Flavor维度配置
payments(最高优先级):包含GooglePay、CreditCard、NoPayments三个Flavorads:包含WithAds、WithoutAds两个Flavorapi:包含MaxAPI29、DefaultAPI两个Flavor
FileProvider配置情况
主源码集(main)中定义了本应被所有Flavor共用的文件路径配置:main/res/xml/file_paths.xml内容:
<?xml version="1.0" encoding="utf-8"?> <paths> <external-cache-path name="update" path="." /> <external-path name="input_files" path="." /> <external-path name="output_files" path="output_directory/" /> </paths>
主源码集的AndroidManifest.xml中通过如下方式引用该配置:
<?xml version="1.0" encoding="utf-8"?> <manifest ...> <application ...> <provider android:name="androidx.core.content.FileProvider" android:authorities="@string/app_fileprovider" android:exported="false" android:grantUriPermissions="true" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application> </manifest>
出现的异常
运行应用时抛出如下异常:
java.lang.IllegalArgumentException: Failed to find configured root that contains /... at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:800) at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:442)
临时解决方法
必须将file_paths.xml复制到最高优先级维度(payments)的每个Flavor目录下,应用才能正常运行:
- 复制到
GooglePay/res/xml/、CreditCard/res/xml/、NoPayments/res/xml/后问题解决 - 复制到低优先级维度(如
api的MaxAPI29)无法解决问题
补充说明
payments维度的CreditCard和NoPayments两个Flavor依赖了一个外部库,该库也定义了file_paths.xml:
<?xml version="1.0" encoding="utf-8"?> <paths> <external-cache-path name="update" path="." /> </paths>
库的AndroidManifest.xml中也包含完全相同的<provider>块,但库中的路径配置同样无法被Flavor识别,也需要复制到对应Flavor目录才生效。
核心疑问
为什么主源码集定义的file_paths.xml无法被Flavor共用?其他资源(如字符串)都能正常共用,这是否是预期行为?如果是,相关的官方说明在哪里?
内容的提问来源于stack exchange,提问作者Viktor Brešan
相关产品推荐
相关产品推荐

