Closed qaz2531883 closed 2 years ago
AppUpdater 默认已经配置了FileProvider,只要你没自定义设置过Authority,默认情况下是一致的;请先使用README中的演示app试试,确认是不是适配问题。
我自己的测试机没问题,这个问题是友盟那边报过来的,具体我也不知道什么原因,所以特来请教作者了。 出问题的版本是1.1.1版本,目前我升级到了1.1.2,看是否还会出现这种问题。 之前用的1.0.8-androidx版本没出现过这种报错,后来我有次发包把这个框架升级到了1.1.1之后,友盟才报出这个问题。
FileProvider 这个很早就适配了,理论上与使用哪个版本的 AppUpdater 没太大关系;你可以看下更多相关日志信息;并提供手机型号,系统版本之类的的信息,方便更精准的去定位分析。
FileProvider 这个很早就适配了,理论上与使用哪个版本的 AppUpdater 没太大关系;你可以看下更多相关日志信息;并提供手机型号,系统版本之类的的信息,方便更精准的去定位分析。
不过你好像对库进行过迁移,不知道是不是这里的原因导致的。报错的提示就是我上面给到的log,手机型号个系统版本各种都有,不止一台设备报错,但又不是必现。
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.xxx.xxx/files/apk/xxx.apk at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:744) at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418) at com.king.app.updater.util.AppUtils.getInstallIntent(AppUtils.java:139) at com.king.app.updater.util.NotificationUtils.showFinishNotification(NotificationUtils.java:114) at com.king.app.updater.service.DownloadService$AppDownloadCallback.onFinish(DownloadService.java:316) at com.king.app.updater.http.HttpManager$DownloadTask.onPostExecute(HttpManager.java:206) at com.king.app.updater.http.HttpManager$DownloadTask.onPostExecute(HttpManager.java:76) at android.os.AsyncTask.finish(AsyncTask.java:696) at android.os.AsyncTask.access$600(AsyncTask.java:180) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:713) at android.os.Handler.dispatchMessage(Handler.java:112) at android.os.Looper.loop(Looper.java:216) at android.app.ActivityThread.main(ActivityThread.java:7625) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987) Back traces ends. 刚刚才发现我发的日志经过了混淆,现在这个日志是混淆前的日志。
看下你的项目中是不是依赖了其他第三方库中provider配置的 authority 与AppUpdater中provider的 authority 相同导致冲突; 如果确定是因为provider配置相同导致的,则可以通过如下步骤进行解决:
在 Manifest 中添加配置:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.updater.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/app_updater_paths"/>
</provider>
自定义 authority :
appUpdater.setAuthority(context.getPackageName() + ".updater.fileProvider")
看下你的项目中是不是依赖了其他第三方库中provider配置的 authority 与AppUpdater中provider的 authority 相同导致冲突; 如果确定是因为provider配置相同导致的,则可以通过如下步骤进行解决:
- 在 Manifest 中添加配置:
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.appUpdater.fileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/app_updater_paths"/> </provider>
- 自定义 authority :
appUpdater.setAuthority(context.getPackageName() + ".appUpdater.fileProvider")
如果是我的项目的provider冲突的话,那么这个问题肯定会是必现吧,但是现在只是偶现。而且很奇怪的是在用你jcenter库的老版本的时候没有出现过这个问题,现在用你迁移了之后的库,也就是新版本会出这个问题。
.setAuthority(context.getPackageName() + ".appUpdater.fileProvider")
对了这次升级你这个框架的同时,我也把java代码改成了kotlin代码,不知道会不会有影响。
看下你的项目中是不是依赖了其他第三方库中provider配置的 authority 与AppUpdater中provider的 authority 相同导致冲突; 如果确定是因为provider配置相同导致的,则可以通过如下步骤进行解决:
- 在 Manifest 中添加配置:
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.appUpdater.fileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/app_updater_paths"/> </provider>
- 自定义 authority :
appUpdater.setAuthority(context.getPackageName() + ".appUpdater.fileProvider")
如果是我的项目的provider冲突的话,那么这个问题肯定会是必现吧,但是现在只是偶现。而且很奇怪的是在用你jcenter库的老版本的时候没有出现过这个问题,现在用你迁移了之后的库,也就是新版本会出这个问题。
这个问题我之前已经答复过你了,和使用AppUpdater的版本无关,AppUpdater各个版本之间FileProvider适配相关代码基本没改过;JCenter 和 Maven Central 都只是一个存放的仓库,所以和仓库迁移理论上也没什么关系。 至于必现和偶现,这也正是我很好奇的问题;所以这边建议你先定位下与 FileProvider 相关的配置是否有与AppUpdater中相同的 authority。
这是我的清单文件,总共4处FileProvider,前两处是注释的,后面那里红色打码的是我的包名。
然后我看了一下apk的清单文件,发现多处FileProvider,你看下是不是真的有冲突: 以下是我生成apk后的清单文件的FileProvider:
<provider
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:authorities="com.xxx.xxx.fileprovider"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@ref/0x7f140003" />
</provider>
<provider
android:name="com.tencent.bugly.beta.utils.BuglyFileProvider"
android:exported="false"
android:authorities="com.xxx.xxx.fileProvider"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@ref/0x7f140006" />
</provider>
<provider
android:name="com.king.app.updater.provider.AppUpdaterFileProvider"
android:exported="false"
android:authorities="com.xxx.xxx.fileProvider"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@ref/0x7f140000" />
</provider>
com.xxx.xxx是我的包名,只有这几个地方的android:authorities是重复的。
这是我的清单文件,总共4处FileProvider,前两处是注释的,后面那里红色打码的是我的包名。
然后我看了一下apk的清单文件,发现多处FileProvider,你看下是不是真的有冲突: 以下是我生成apk后的清单文件的FileProvider:
<provider android:name="androidx.core.content.FileProvider" android:exported="false" android:authorities="com.xxx.xxx.fileprovider" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@ref/0x7f140003" /> </provider> <provider android:name="com.tencent.bugly.beta.utils.BuglyFileProvider" android:exported="false" android:authorities="com.xxx.xxx.fileProvider" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@ref/0x7f140006" /> </provider> <provider android:name="com.king.app.updater.provider.AppUpdaterFileProvider" android:exported="false" android:authorities="com.xxx.xxx.fileProvider" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@ref/0x7f140000" /> </provider>
com.xxx.xxx是我的包名,只有这几个地方的android:authorities是重复的。
两种解决方式,一种上面说的自定义,一种是去掉重复的,有 AppUpdaterFileProvider 一个配置即可
这是我的清单文件,总共4处FileProvider,前两处是注释的,后面那里红色打码的是我的包名。 然后我看了一下apk的清单文件,发现多处FileProvider,你看下是不是真的有冲突: 以下是我生成apk后的清单文件的FileProvider:
<provider android:name="androidx.core.content.FileProvider" android:exported="false" android:authorities="com.xxx.xxx.fileprovider" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@ref/0x7f140003" /> </provider> <provider android:name="com.tencent.bugly.beta.utils.BuglyFileProvider" android:exported="false" android:authorities="com.xxx.xxx.fileProvider" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@ref/0x7f140006" /> </provider> <provider android:name="com.king.app.updater.provider.AppUpdaterFileProvider" android:exported="false" android:authorities="com.xxx.xxx.fileProvider" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@ref/0x7f140000" /> </provider>
com.xxx.xxx是我的包名,只有这几个地方的android:authorities是重复的。
两种解决方式,一种上面说的自定义,一种是去掉BuglyFileProvider,因为BuglyFileProvider 与 AppUpdaterFileProvider的配置冲突了
我自己定义的这个会有冲突问题吗?
<provider
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:authorities="com.xxx.xxx.fileprovider"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@ref/0x7f140003" />
</provider>
这是我的清单文件,总共4处FileProvider,前两处是注释的,后面那里红色打码的是我的包名。 然后我看了一下apk的清单文件,发现多处FileProvider,你看下是不是真的有冲突: 以下是我生成apk后的清单文件的FileProvider:
<provider android:name="androidx.core.content.FileProvider" android:exported="false" android:authorities="com.xxx.xxx.fileprovider" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@ref/0x7f140003" /> </provider> <provider android:name="com.tencent.bugly.beta.utils.BuglyFileProvider" android:exported="false" android:authorities="com.xxx.xxx.fileProvider" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@ref/0x7f140006" /> </provider> <provider android:name="com.king.app.updater.provider.AppUpdaterFileProvider" android:exported="false" android:authorities="com.xxx.xxx.fileProvider" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@ref/0x7f140000" /> </provider>
com.xxx.xxx是我的包名,只有这几个地方的android:authorities是重复的。
两种解决方式,一种上面说的自定义,一种是去掉BuglyFileProvider,因为BuglyFileProvider 与 AppUpdaterFileProvider的配置冲突了
我自己定义的这个会有冲突问题吗?
<provider android:name="androidx.core.content.FileProvider" android:exported="false" android:authorities="com.xxx.xxx.fileprovider" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@ref/0x7f140003" /> </provider>
你可以自己定义,但是如果定义的如其他配置的authorities相同的话,会出现重复,可能会覆盖其他配置。所以建议定义不同的FileProvider来解决冲突(前提是authorities不同),或者统一authorities配置。
感谢大佬指点!
Failed to find configured root that contains /storage/emulated/0/Android/data/XXX/files/apk/XXX.apk
at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:13) at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:2) at com.king.app.updater.util.AppUtils.getInstallIntent(AppUtils.java:6) at com.king.app.updater.util.NotificationUtils.showFinishNotification(NotificationUtils.java:4) at com.king.app.updater.service.DownloadService$AppDownloadCallback.onFinish(DownloadService.java:3) at com.king.app.updater.http.HttpManager$DownloadTask.onPostExecute(HttpManager.java:4) at com.king.app.updater.http.HttpManager$DownloadTask.onPostExecute(HttpManager.java:1) at android.os.AsyncTask.finish(AsyncTask.java:797) at android.os.AsyncTask.access$900(AsyncTask.java:195) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:814) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:219) at android.app.ActivityThread.main(ActivityThread.java:8668) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)