2014-05-15 50 views
0

我继承了一个代码库,需要与以前的版本保持公平同步,以便在通过git推送更改时尽可能无痛地更新到新版本。我所做的更改与重新设计样式和添加新功能有关。内容提供程序权威

在最新的版本中,我试图同时安装应用程序旁边这个定制版的原始版本,并得到这个错误:

Failure [INSTALL_FAILED_CONFLICTING_PROVIDER] 

我通过我的源代码控制看了一下,发现在以前的版本我使用相同的authoritiesname作为父应用程序,但我不记得有这个问题,但也许我从来没有测试两个应用程序同时安装的情况?

在清单的原始版本,这是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: Permission Denial: opening provider com.foo.mobile.android.provider.Provider from ProcessRecord{42cbc998 2462:com.bar/u0a191} (pid=2462, uid=10191) that is not exported from uid 10189

我看过,所以看到一个couplequestions关于这个话题,也看了the documentation,这一切都说我需要这个authorities是不同的,但我怎么能保持这个不同,同时保持与基本代码的协同作用?

回答

1

maybe I just never tested the case where both apps were installed at the same time?

我会认为是这样。您不能同时安装两个支持相同权限的提供程序的应用程序。

But now the app crashes shortly after launch with SecurityException:

我的猜测是,你改变了你的清单,但你并没有改变您正在使用访问提供商Uri。因此,您的com.bar应用程序仍在尝试与com.foo提供程序通话,并且该提供程序未导出。

how can I keep this different while keeping synergy with the base code?

要么这是同一个应用程序,要么不是。

如果它是同一个应用程序,则您的第一步是切换回原始软件包名称。你可能得到的唯一方法是Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]是因为你改变了软件包名称并且没有改变提供者的权限。更改软件包名称意味着,从您和您的团队以外的所有人的角度来看,这是一个完全不同的应用程序。一旦您切换回原始软件包名称(并回滚到原始提供程序的权限),一切都应该没问题,除非您不能在同一设备上使用相同设备上的发行版本和开发版本时间。

如果确实打算让此应用具有单独的软件包名称(因此现有应用的现有用户无法升级到此新应用),则需要在所有相关位置更改授权字符串。我推测你可以使用字符串资源来做到这一点,在这里你有不同版本的字符串资源。或者,如果这是一个free-vs。付费应用场景,转而使用Gradle for Android构建您的构建版,并设置单独的freepaid产品风格,这可以修补程序包名称和权限数据作为构建的一部分,而无需调整源代码。

+0

这工作。我发现在另外一个地方提到了这一点。一旦我改变了它,它就起作用了。谢谢! –