web-dev-qa-db-fra.com

Android Studio deux versions avec différents fichiers manifest

J'ai des problèmes avec la définition de deux fichiers manifestes différents pour mes versions dans Android Studio. Voici la structure de mon projet actuel:

Current project structure

Le AndroidManifest.xml dans le free saveur ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="se.example.package">
    <uses-permission Android:name="Android.permission.INTERNET" />
    <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
</manifest>

Le AndroidManifest.xml dans la version main n'a pas de permissions use, mais contient le reste du code de manifeste partagé par toutes les variantes.

Le AndroidManifest.xml dans le pro saveur ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="se.example.package">
    <uses-permission Android:name="com.Android.vending.CHECK_LICENSE" />
</manifest>

build.gradle définit les deux saveurs comme

productFlavors {
    free {
        applicationId 'se.example.package.free'
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName '1.0'
    }
    pro {
        minSdkVersion 14
        applicationId 'se.example.package.pro'
        targetSdkVersion 21
        versionCode 2
        versionName '1.1'
    }
}

Le résultat auquel je m'attends est que les différentes variantes définissent différentes utilisations-autorisations. Ce n'est pas le cas. Il en résulte actuellement que les deux variantes définissent uniquement le <uses-permission Android:name="com.Android.vending.CHECK_LICENSE" /> comme défini dans AndroidManifest.xml dans la saveur pro.

J'ai essayé:

  • Projet propre
  • Reconstruire le projet
  • Redémarrer Android Studio
  • Gradation de synchronisation

Mais sans succès. Comment vais-je résoudre ce problème? Toute aide est appréciée.

EDIT 1

J'ai changé l'emplacement de chaque saveur AndroidManifest.xml fichier de chacun des dossiers res vers le dossier free et pro. Le résultat de ceci:

  1. La version Pro indique que l'autorisation de licence est attendue.
  2. Saveur libre affiche les autorisations des deux AndroidManifest.xml fichiers, licence et autorisations réseau (doit être uniquement réseau)

Cela ressemble à un problème de structure de projet. Que faire de ça?

EDIT 2

J'ai tiré les rapports de fusion comme le laissait entendre Commonsware, ce sont les rapports concernant uses-permissions

Libre:

uses-permission#com.Android.vending.CHECK_LICENSE
ADDED from qwknoteGIT:licencing-library:unspecified:26:5
    Android:name
        ADDED from qwknoteGIT:licencing-library:unspecified:26:22

Pro:

uses-permission#com.Android.vending.CHECK_LICENSE
MERGED from qwknoteGIT:licencing-library:unspecified:26:5
55
Marcus

Contexte technique:

sur ce lien, il explique les techniques et paramètres pouvant être utilisés pour la fusion de manifestes: http://tools.Android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC -tools: node-markers

Un en particulier est le tools:node qui indique comment certains nœuds XML du manifeste doivent se comporter lors de la fusion.

Solution:

pour obtenir certaines permisions dans un manifeste et différentes dans un autre manifeste, ajoutez TOUTES les autorisations nécessaires au main et, dans le manifeste des arômes, supprimez celles dont vous n'avez pas besoin, comme dans l'exemple ci-dessous:

free supprimer la licence de vérification

<uses-permission
   Android:name="com.Android.vending.CHECK_LICENSE" 
   tools:node="remove"/>
49
Budius

Votre problème vient d'une bibliothèque, pas de vos goûts. Plus précisément, qwknoteGIT:licencing-library Demande CHECK_LICENSE.

Si vous n'utilisez pas cette bibliothèque dans toutes les versions, utilisez une instruction aromatisée compile (par exemple, proCompile) pour n'utiliser cette bibliothèque que dans cette version.

Si vous utilisez la bibliothèque pour tous les goûts, mais que vous n’êtes pas obligé d’avoir besoin de l’autorisation dans un des goûts, c’est là que l’attribut tools:node Peut être utilisé, dans le manifeste de l’arôme, pour bloquer l’autorisation fournie par la bibliothèque.

Et le rapport de fusion manifeste est votre ami. :-)

21
CommonsWare

Cela devrait au moins résoudre le problème. Je trouve utile de spécifier le manifeste exact à utiliser pour chaque variante. À votre santé! Il dirige explicitement le fichier manifeste sous chaque dossier de variantes.

    Android {
      productFlavors {
        prod {
          manifest.srcFile "prod/AndroidManifest.xml"
        }
        dev {
          manifest.srcFile "dev/AndroidManifest.xml"
        }
      }
      ...

}
3
Rowland Mtetezi

Vous devriez changer votre code:

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="se.example.package">

pour:

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    package="com.your.appid">
1
partizan

Spécifiez votre manifeste exclusivement sous sourceSets, dans votre application build.gradle

 Android {
    productFlavors {
                bizdartFlavourNoCallLog {
            minSdkVersion 16
            applicationIdSuffix '.bizdart'
            targetSdkVersion 26
            dimension "tier"
            sourceSets {
                main {
                    manifest.srcFile "src/bizdartFlavourNoCallLog/AndroidManifest.xml"
                }
            }
            copy {
                from 'src/bizdartFlavourNoCallLog/'
                include '*.json'
                into '.'
                }
            }
       }
    }
0
Ebin Joy