2014-05-15 5 views
0

Je hérite d'une base de code qui doit être conservée en parfaite synchronisation avec la version précédente pour que la mise à jour des nouvelles versions soit aussi simple que possible lorsqu'elles appliquent les modifications via git. Les changements que je fais sont liés au re-style et à l'ajout de nouvelles fonctionnalités.Autorités du fournisseur de contenu

Dans la dernière version, je cherchais à installer à la fois la version originale de l'application à côté de cette version personnalisée et a obtenu cette erreur:

Failure [INSTALL_FAILED_CONFLICTING_PROVIDER] 

Je regardais à travers mon contrôle de code source et a constaté que dans les versions précédentes I utilisait le même authorities et name que l'application parente, mais je ne me souviens pas d'avoir ce problème, mais peut-être que je n'ai jamais testé le cas où les deux applications ont été installées en même temps?

Dans la version originale du manifeste, c'est l'élément fournisseur:

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

J'ai essayé de changer l'autorité à ceci:

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

Mais les application se bloque peu de temps après le lancement avec 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

J'ai regardé sur SO et vu un couple de questions sur ce sujet et a également regardé the documentation et tout dit que j'ai besoin de ce authorities pour être différent, mais comment puis-je garder cela différent tout en gardant une synergie avec le code de base?

Répondre

1

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

Je présume que c'est le cas. Vous ne pouvez pas installer deux applications avec des fournisseurs prenant en charge la même autorité en même temps.

But now the app crashes shortly after launch with SecurityException:

Je pense que vous avez changé votre manifeste, mais vous ne l'avez pas modifié le Uri que vous utilisez pour accéder au fournisseur. Par conséquent, votre application com.bar essaie toujours de parler au fournisseur com.foo et ce fournisseur n'est pas exporté.

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

Soit c'est la même application, soit elle ne l'est pas.

S'il s'agit de la même application, la première étape consiste à revenir au nom du package d'origine. La seule façon d'obtenir Failure [INSTALL_FAILED_CONFLICTING_PROVIDER] est que vous avez modifié le nom du package et que vous n'avez pas modifié les droits du fournisseur. Changer le nom du paquet signifie que, du point de vue de tout le monde en dehors de vous et de votre équipe, c'est une application complètement différente. Une fois que vous êtes revenu au nom de package d'origine (et restauré à l'autorité fournisseur d'origine), tout devrait bien se passer, sauf que vous ne pourrez pas avoir la version de version et la version de développement sur le même périphérique au même temps. Si vous prévoyez effectivement que cette application dispose d'un nom de package distinct (les utilisateurs existants de l'application existante ne peuvent pas passer à cette nouvelle application), vous devrez modifier la chaîne d'autorité à tous les emplacements appropriés. Je suppose que vous pouvez le faire en utilisant une ressource de chaîne, où vous avez différentes versions de la ressource de chaîne. Ou, si c'est un free-vs.scénario d'application payante, passez à faire vos builds en utilisant Gradle pour Android, et configurez les saveurs de produit free et paid, qui peuvent patcher votre nom de paquet et les données d'autorité dans le cadre des versions, sans avoir à modifier le code source.

+0

Cela a fonctionné. J'ai trouvé qu'il y avait une référence à cela dans un autre endroit. Une fois que j'ai changé cela, ça a marché. Je vous remercie! –

Questions connexes