2014-05-15 52 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

這工作。我發現在另外一個地方提到了這一點。一旦我改變了它,它就起作用了。謝謝! –