Android Studio de deux saveurs avec différents fichiers manifest
Je vais avoir des problèmes avec la définition de deux fichiers de manifeste pour mon saveurs dans Android Studio. C'est mon projet en cours de la structure:
La 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>
La AndroidManifest.xml
dans le main
saveur n'a pas d'utilisations des autorisations, mais contient le reste du manifeste de code qui est partagée entre tous les saveurs.
La 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>
construire.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 que j'attends, c'est que les différentes saveurs définit les différentes utilisations des autorisations. Ce n'est pas le cas. Le résultat est actuellement que les deux saveurs définit seulement le <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
tel que défini dans AndroidManifest.xml
dans la pro de la saveur.
J'ai essayé:
- Propre projet
- Projet de reconstruction de
- Redémarrer Android Studio
- Sync gradle
Mais sans succès. Comment suis-je résoudre ce problème? Toute aide est appréciée.
EDIT 1
J'ai changé l'emplacement de chacun des saveurs AndroidManifest.xml
fichier à partir de chacun des res
dossiers à free
et pro
dossier. Le résultat de ceci:
- Pro saveur montre de Licence, d'autorisation comme prévu.
- Gratuit saveur indique les autorisations de deux
AndroidManifest.xml
des fichiers, des Licences et des autorisations de réseau (Doit être unique réseau)
Cela se sent comme un problème de structure de projet. Que faire de cette?
EDIT 2
J'ai tiré les rapports de fusion comme Commonsware a laissé entendre, ce sont les rapports concernant uses-permissions
Gratuit:
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
- Je ne suis pas sûr de savoir exactement à qui vous avez à utiliser (tu c'est un commentaire, pas une réponse), mais vous pouvez probablement obtenir ce que tu veux en utilisant certaines des
tools:node
déclaration tools.android.com/tech-docs/new-build-system/user-guide/... - "Le résultat est actuellement que les deux saveurs définit seulement le <uses-permission android:name="com.android.des distributeurs de.CHECK_LICENSE" /> tel que défini dans AndroidManifest.xml dans la pro de la saveur. "- comment avez-vous déterminé ce?
- J'ai deux saveurs installé sur mon HTC one x, et quand je suis à la vérification des autorisations pour chacun, ils disent tous les deux "contrôle de Licence pour Google Play" (Traduit à partir de mon téléphone avec le suédois locale, peut-être pas la traduction exacte en anglais). Aucun d'entre eux déclarent internet autorisations.
- Regarder le manifeste rapport de fusion(s) dans
app/build/output/apk/
et voir ce qu'ils vous disent. - "J'ai changé l'emplacement de chacun des saveurs AndroidManifest.xml fichier de chacune des res dossiers gratuit et pro dossier" -- c'est là où ils sont censés être. Le manifeste va à la racine de la sourceset, si elle est
main
, une saveur de sourceset, ou un type de build du sourceset. "Que faire de cela?" -- Je répète ma recommandation: Regardez le manifeste rapport de fusion(s) dansapp/build/output/apk/
et voir ce qu'ils vous disent. - Je n'ai jamais fait d'autorisation de fusion, mais encore une fois, certains de la
tools:node
devrait. Consulter le lien que j'ai posté. Peut-être ajouter TOUTES les autorisations pour les principaux manifeste et supprimer ceux que vous ne voulez pas sur chaque avec<permission android:name="name" tools:node="remove"
à partir de fichiers individuels. - J'ai ajouté le rapport de sorties et enlève ce qui ne met pas l'accent sur
uses-permission
s. Je suis désolé, mais je n'ai jamais été en contact avec cette avant. Je ne sais pas comment les interpréter. - Je viens d'essayer votre solution, et cela a fonctionné. S'il vous plaît un résumé de vos commentaires comme réponse.
- Votre problème provient d'une bibliothèque, pas vos saveurs. Plus précisément,
qwknoteGIT:licencing-library
demandeCHECK_LICENSE
. Si vous n'êtes pas à l'aide de cette bibliothèque dans toutes les saveurs, utilisez une saveur decompile
déclaration (par exemple,proCompile
) à n'utiliser que de la bibliothèque dans cette saveur. - Je vous remercie pour votre temps et d'efforts de la Marque. Il est logique maintenant que vous avez dit. N'hésitez pas à poster votre réponse, et je vais upvote pour la future réponse d'asile.
Vous devez vous connecter pour publier un commentaire.
Tech contexte:
sur ce lien, il explique les techniques et les paramètres que vous pouvez utiliser pour manifester la fusion: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-tools:node-markers
Un spécifique est la
tools:node
qui souligne à quel point certains nœuds XML sur le manifeste doit se comporter alors que la fusion.Solution:
pour obtenir certaines autorisations dans un seul et différent dans d'autres manifeste, ajouter TOUTES les autorisations dont vous avez besoin pour la
main
et dans les saveurs manifeste de supprimer ceux que vous n'avez pas besoin, comme dans l'exemple ci-dessous:free
supprimer la vérification de licenceandroid:name="com.android.vending.CHECK_LICENSE"
juste pour une seule version "pro" manifesteVotre problème provient d'une bibliothèque, pas vos saveurs. Plus précisément,
qwknoteGIT:licencing-library
demandeCHECK_LICENSE
.Si vous n'êtes pas à l'aide de cette bibliothèque dans toutes les saveurs, utilisez une saveur de
compile
déclaration (par exemple,proCompile
) à n'utiliser que de la bibliothèque dans cette saveur.Si vous utilisez la bibliothèque pour tous de saveurs, mais se sentir confiants que vous n'avez pas besoin de la permission de l'un de saveur, d'où un
tools:node
attribut peut être utilisé, dans le goût de manifester, de bloquer l'autorisation fournie par la bibliothèque.Et le manifeste rapport de fusion est votre ami. 🙂
Ce qui devrait résoudre le problème, au moins. Je trouve qu'il est utile en précisant le manifeste à utiliser pour chaque variante. Cheers! Il demande explicitement le fichier de manifeste sous chaque variante du dossier.
AndroidManifest.xml
fichiers, gradle lui-même prend de la saveur les dossiers sauf si vous avez changé leur chemin d'accès par défaut (que je ne recommande pas).Vous devez modifier votre code:
pour:
Spécifier votre Manifeste exclusivement sous sourceSets, Dans votre App construire.gradle