jenly1314 / AppUpdater

🚀 AppUpdater一个专注于App更新,一键傻瓜式集成App版本升级的轻量开源库。(集成步骤超简单)
https://jenly1314.github.io/AppUpdater/
MIT License
882 stars 128 forks source link

有时候会出现file_provider的问题导致报错 #26

Closed qaz2531883 closed 2 years ago

qaz2531883 commented 2 years ago

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)

jenly1314 commented 2 years ago

AppUpdater 默认已经配置了FileProvider,只要你没自定义设置过Authority,默认情况下是一致的;请先使用README中的演示app试试,确认是不是适配问题。

qaz2531883 commented 2 years ago

我自己的测试机没问题,这个问题是友盟那边报过来的,具体我也不知道什么原因,所以特来请教作者了。 出问题的版本是1.1.1版本,目前我升级到了1.1.2,看是否还会出现这种问题。 之前用的1.0.8-androidx版本没出现过这种报错,后来我有次发包把这个框架升级到了1.1.1之后,友盟才报出这个问题。

jenly1314 commented 2 years ago

FileProvider 这个很早就适配了,理论上与使用哪个版本的 AppUpdater 没太大关系;你可以看下更多相关日志信息;并提供手机型号,系统版本之类的的信息,方便更精准的去定位分析。

qaz2531883 commented 2 years ago

FileProvider 这个很早就适配了,理论上与使用哪个版本的 AppUpdater 没太大关系;你可以看下更多相关日志信息;并提供手机型号,系统版本之类的的信息,方便更精准的去定位分析。

不过你好像对库进行过迁移,不知道是不是这里的原因导致的。报错的提示就是我上面给到的log,手机型号个系统版本各种都有,不止一台设备报错,但又不是必现。

qaz2531883 commented 2 years ago

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. 刚刚才发现我发的日志经过了混淆,现在这个日志是混淆前的日志。

jenly1314 commented 2 years ago

看下你的项目中是不是依赖了其他第三方库中provider配置的 authority 与AppUpdater中provider的 authority 相同导致冲突; 如果确定是因为provider配置相同导致的,则可以通过如下步骤进行解决:

  1. 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>
  2. 自定义 authority

    appUpdater.setAuthority(context.getPackageName() + ".updater.fileProvider")
qaz2531883 commented 2 years ago

看下你的项目中是不是依赖了其他第三方库中provider配置的 authority 与AppUpdater中provider的 authority 相同导致冲突; 如果确定是因为provider配置相同导致的,则可以通过如下步骤进行解决:

  1. 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>
  1. 自定义 authority
    appUpdater.setAuthority(context.getPackageName() + ".appUpdater.fileProvider")

如果是我的项目的provider冲突的话,那么这个问题肯定会是必现吧,但是现在只是偶现。而且很奇怪的是在用你jcenter库的老版本的时候没有出现过这个问题,现在用你迁移了之后的库,也就是新版本会出这个问题。

qaz2531883 commented 2 years ago

.setAuthority(context.getPackageName() + ".appUpdater.fileProvider")

对了这次升级你这个框架的同时,我也把java代码改成了kotlin代码,不知道会不会有影响。

jenly1314 commented 2 years ago

看下你的项目中是不是依赖了其他第三方库中provider配置的 authority 与AppUpdater中provider的 authority 相同导致冲突; 如果确定是因为provider配置相同导致的,则可以通过如下步骤进行解决:

  1. 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>
  1. 自定义 authority
    appUpdater.setAuthority(context.getPackageName() + ".appUpdater.fileProvider")

如果是我的项目的provider冲突的话,那么这个问题肯定会是必现吧,但是现在只是偶现。而且很奇怪的是在用你jcenter库的老版本的时候没有出现过这个问题,现在用你迁移了之后的库,也就是新版本会出这个问题。

这个问题我之前已经答复过你了,和使用AppUpdater的版本无关,AppUpdater各个版本之间FileProvider适配相关代码基本没改过;JCenter 和 Maven Central 都只是一个存放的仓库,所以和仓库迁移理论上也没什么关系。 至于必现和偶现,这也正是我很好奇的问题;所以这边建议你先定位下与 FileProvider 相关的配置是否有与AppUpdater中相同的 authority

qaz2531883 commented 2 years ago

image 这是我的清单文件,总共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是重复的。

jenly1314 commented 2 years ago

image 这是我的清单文件,总共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 一个配置即可

qaz2531883 commented 2 years ago

image 这是我的清单文件,总共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>
jenly1314 commented 2 years ago

image 这是我的清单文件,总共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配置。

qaz2531883 commented 2 years ago

感谢大佬指点!