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:
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é:
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:
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
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"/>
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. :-)
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"
}
}
...
}
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">
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 '.'
}
}
}
}