4

Je modifie le projet Android actuel afin qu'il puisse être installé sur le même périphérique pour plusieurs configurations et configs de construction.espace réservé applicationId manifeste pour plusieurs styles de construction ne fonctionne pas

build.gradle:

{ 
    // ... 
    defaultConfig { 
     applicationId "com.myapp" 
     manifestPlaceholders = [ 
      manifestApplicationId: "${applicationId}", 
      onesignal_app_id: "xxxx", 
      onesignal_google_project_number: "xxxx" 
     ] 
    // ... 
    } 

    productFlavors { 
     production { 
      applicationId "com.myapp" 
      // ... 
     } 

     dev { 
      applicationId "com.myapp.dev" 
      // ... 
     } 

     // ... 
    } 

    buildTypes { 
     release { 
      // ... 
     } 

     debug { 
      applicationIdSuffix ".debug" 
      // ... 
     } 
    } 

    // ... 
} 

AndroidManifest.xml:

<manifest ... > 
    <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" /> 
    <permission 
    android:name="${applicationId}.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" />  
    <!-- ... --> 

    <receiver 
     android:name="com.onesignal.GcmBroadcastReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <category android:name="${applicationId}" /> 
     </intent-filter> 
    </receiver> 

    <!-- ... --> 
</manifest> 

Lorsque je compile à la fois le débogage et la libération version de la même saveur, je suis arrivé message d'erreur:

...

INSTALL_FAILED_DUPLICATE_PERMISSION

perm = com.myapp.permission.C2D_MESSAGE

pkg = com.myapp.dev

...

espace réservé manifestApplicationId est venu de AndroidManifest.xml sur la bibliothèque OneSignal selon les instructions sur https://documentation.onesignal.com/docs/android-sdk-setup

Quelqu'un at-il une idée de comment résoudre ce problème? Je vous remercie.

+0

Je pense qu'il s'agit d'un doublon de http://stackoverflow.com/questions/27043933/install-failed-duplicate-permission-c2d-message. Vous devez désinstaller l'application de l'appareil et le réinstaller. – Blehi

+0

@Blehi: Bien sûr, la désinstallation de la variante installée permettra de se débarrasser de l'erreur. Mais mon but est d'installer toutes les variantes sur le même appareil. Je vous remercie. – Wellsen

Répondre

10

OneSignal nécessite que la clé manifestPlaceholdersmanifestApplicationId soit définie sur applicationId (nom de votre package AKA). Cela peut être fait en le définissant dans votre buildTypes comme suit.

buildTypes { 
    debug { 
     defaultConfig { 
     manifestPlaceholders = [manifestApplicationId   : "${applicationId}", 
           onesignal_app_id    : "11111111-1111-1111-1111-111111111111", 
           onesignal_google_project_number: "111111111"] 
     } 
    } 

    release { 
     defaultConfig { 
     manifestPlaceholders = [manifestApplicationId   : "${applicationId}", 
           onesignal_app_id    : "22222222-2222-2222-2222-222222222222", 
           onesignal_google_project_number: "222222222"] 
     } 
    } 
} 

Mise à jour: manifestApplicationId n'est plus nécessaire pour 3.3.0 et plus récente du SDK OneSignal.

+0

Merci pour votre réponse. J'ai ajouté ces espaces réservés à l'intérieur de la fermeture defaultConfig sur chaque buildType comme ci-dessus, maintenant j'ai eu la construction échouée: Erreur: L'exécution a échoué pour la tâche ': app: processProductionReleaseManifest'. > Aucun enregistrement pour la clé [permission # $ {manifesteApplicationId} .permission.C2D_MESSAGE] – Wellsen

+0

Modifier: j'ai oublié de supprimer des outils: overrideLibrary et des outils: remplacer mon manifeste que j'ai ajouté auparavant. Après que j'ai fait cela, l'erreur est de retour à "dupliquer la permission". Nous essayons toujours de trouver la solution maintenant ... – Wellsen

+0

@Wellsen Après avoir fait ce changement '.gradle', vous devrez désinstaller les deux applications, puis les réinstaller. L'un d'entre eux a probablement la mauvaise autorisation, c'est donc nécessaire. – jkasten