Android 内容提供商权限

Android 内容提供商权限,android,Android,我继承了一个代码库,它需要与以前的版本保持相当的同步,以便在通过git推送更改时尽可能轻松地更新到新版本。我所做的更改与重新设计样式和添加新功能有关 在最新版本中,我尝试将应用程序的原始版本与此自定义版本一起安装,但出现以下错误: Failure [INSTALL_FAILED_CONFLICTING_PROVIDER] 我查看了我的源代码管理,发现在以前的版本中,我使用的是与父应用相同的权限和名称,但我不记得有过这个问题,但也许我从未测试过两个应用同时安装的情况 在清单的原始版本中,这是pr

我继承了一个代码库,它需要与以前的版本保持相当的同步,以便在通过git推送更改时尽可能轻松地更新到新版本。我所做的更改与重新设计样式和添加新功能有关

在最新版本中,我尝试将应用程序的原始版本与此自定义版本一起安装,但出现以下错误:

Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]
我查看了我的源代码管理,发现在以前的版本中,我使用的是与父应用相同的
权限
名称
,但我不记得有过这个问题,但也许我从未测试过两个应用同时安装的情况

在清单的原始版本中,这是provider元素:

<provider
    android:name="com.foo.mobile.android.provider.Provider"
    android:authorities="com.foo.android.mobile.contentprovider"
    android:exported="false" />

我尝试将权限更改为:

<provider
    android:name="com.foo.mobile.android.provider.Provider"
    android:authorities="com.bar.android.mobile.contentprovider"
    android:exported="false" />

但现在,应用程序在启动后不久就会崩溃,出现
SecurityException

java.lang.SecurityException:权限拒绝:从进程记录{42cbc998 2462:com.bar/u0a191}(pid=2462,uid=10191)打开未从uid 10189导出的提供程序com.foo.mobile.android.provider.provider

我看了很多关于这个主题的文章,也看了很多,都说我需要这个
权威机构
与众不同,但是我如何在保持与基本代码的协同作用的同时保持这种不同呢

也许我从来没有测试过两个应用程序同时安装的情况

我想情况就是这样。您不能同时安装具有支持相同权限的提供商的两个应用程序

但现在,该应用程序在启动后不久即崩溃,出现SecurityException:

我猜您更改了清单,但没有更改用于访问提供程序的
Uri
。因此,您的
com.bar
应用程序仍在尝试与
com.foo
提供商对话,而该提供商未被导出

如何在保持与基本代码的协同作用的同时保持这种不同

这可能是同一个应用程序,也可能不是

如果是同一个应用程序,则第一步是切换回原始程序包名称。唯一可能导致
失败[安装\u失败\u冲突的\u提供程序]
的原因是您更改了程序包名称,但没有更改提供程序的权限。更改软件包名称意味着,从您和您的团队以外的所有人的角度来看,它是一个完全不同的应用程序。一旦切换回原始包名(并回滚到原始提供程序权限),一切都应该正常,只是不能在同一设备上同时拥有发布版本和开发版本


如果您确实计划让此应用具有单独的程序包名称(因此现有应用的现有用户无法升级到此新应用),则需要在所有相关位置更改权限字符串。我假设您可以使用字符串资源来实现这一点,其中您有不同版本的字符串资源。或者,如果这是一个免费与付费的应用程序场景,请使用Gradle for Android进行构建,并设置单独的
免费
付费
产品风格,这可以将包名和权限数据作为构建的一部分进行修补,而无需调整源代码。

这很有效。我发现在另一个地方也提到了这一点。一旦我改变了这一点,它就起作用了。非常感谢。