Ich habe Probleme beim Definieren von zwei verschiedenen Manifestdateien für meine Varianten in Android Studio. Dies ist meine aktuelle Projektstruktur:
Das AndroidManifest.xml
im free
Geschmack sieht so aus:
<?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>
Das AndroidManifest.xml
in der main
Variante hat keine Verwendungsberechtigungen, enthält jedoch den Rest des Manifestcodes, der von allen Varianten gemeinsam genutzt wird.
Das AndroidManifest.xml
im pro
Geschmack sieht so aus:
<?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 definiert die beiden Geschmacksrichtungen wie
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'
}
}
Das Ergebnis, das ich erwarte, ist, dass die verschiedenen Geschmacksrichtungen unterschiedliche Verwendungsberechtigungen definieren. Das ist nicht der Fall. Das Ergebnis ist derzeit, dass beide Geschmacksrichtungen nur die in der Pro-Geschmacksrichtung definierten <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
definieren AndroidManifest.xml
.
Ich habe versucht:
- Projekt reinigen
- Projekt neu erstellen
- Starten Sie Android Studio neu
- Gradle synchronisieren
Aber ohne Erfolg. Wie soll ich das beheben? Jede Hilfe wird geschätzt.
BEARBEITEN 1
Ich änderte die Lage der einzelnen Aromen AndroidManifest.xml
Datei von jedem der res
Ordner free
und pro
Ordner. Das Ergebnis davon:
- Pro Flavour zeigt die Lizenzberechtigung wie erwartet an.
- Free Flavour zeigt Berechtigungen aus beiden
AndroidManifest.xml
Dateien, Lizenz- und Netzwerkberechtigungen (sollte nur Netzwerk sein)
Dies scheint ein Problem der Projektstruktur zu sein. Was soll man daraus machen?
BEARBEITEN 2
Ich habe die Zusammenführungsberichte gezogen, wie Commonsware angedeutet hat. Dies sind die Berichte zu uses-permissions
Kostenlos:
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
Profi:
uses-permission#com.android.vending.CHECK_LICENSE
MERGED from qwknoteGIT:licencing-library:unspecified:26:5
tools:node
Deklarationstools verwendest. Android.com/tech-docs/new-build -System / Benutzerhandbuch /…app/build/output/apk/
und sehen Sie, was sie Ihnen sagen.qwknoteGIT:licencing-library
fordertCHECK_LICENSE
. Wenn Sie diese Bibliothek nicht in allen Geschmacksrichtungen verwenden, verwenden Sie eine aromatisiertecompile
Anweisung (z. B.proCompile
), um diese Bibliothek nur in dieser Geschmacksrichtung zu verwenden.Antworten:
Technischer Hintergrund:
Unter diesem Link werden die Techniken und Parameter erläutert, die für das Zusammenführen von Manifesten verwendet werden können: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-tools:node -Marker
Eine davon ist die
tools:node
, die darauf hinweist, wie sich bestimmte XML-Knoten im Manifest beim Zusammenführen verhalten sollen.Lösung:
Um einige Berechtigungen in einem und in einem anderen Manifest zu erhalten, fügen Sie ALLE Berechtigungen hinzu, die Sie benötigen,
main
und entfernen Sie im Flavour-Manifest diejenigen, die Sie nicht benötigen, wie im folgenden Beispiel:free
Entfernen Sie die Schecklizenz<uses-permission android:name="com.android.vending.CHECK_LICENSE" tools:node="remove"/>
quelle
android:name="com.android.vending.CHECK_LICENSE"
einfach nur ein einziges "Pro" -Versionsmanifest hinzufügenIhr Problem kommt aus einer Bibliothek, nicht aus Ihren Aromen. Insbesondere
qwknoteGIT:licencing-library
fordertCHECK_LICENSE
.Wenn Sie diese Bibliothek nicht in allen Geschmacksrichtungen verwenden, verwenden Sie eine aromatisierte
compile
Anweisung (z. B.proCompile
), um diese Bibliothek nur in dieser Geschmacksrichtung zu verwenden.Wenn Sie die Bibliothek für alle Geschmacksrichtungen verwenden, sich jedoch sicher sind, dass Sie die Berechtigung für eine Geschmacksrichtung nicht benötigen
tools:node
, kann im Manifest der Geschmacksrichtung ein Attribut verwendet werden, um die von der Bibliothek bereitgestellte Berechtigung auszublenden.Und der offensichtliche Fusionsbericht ist dein Freund. :-)
quelle
Dies sollte zumindest das Problem lösen. Ich finde es nützlich, das genaue Manifest anzugeben, das für jede Variante verwendet werden soll. Prost! Es verweist explizit auf die Manifestdatei unter jedem Variantenordner.
android { productFlavors { prod { manifest.srcFile "prod/AndroidManifest.xml" } dev { manifest.srcFile "dev/AndroidManifest.xml" } } ... }
quelle
AndroidManifest.xml
Dateien anzugeben. Gradle selbst übernimmt sie aus den Flavour-Ordnern, es sei denn, Sie haben ihren Standardpfad geändert (was ich nicht empfehlen würde).Geben Sie Ihr Manifest ausschließlich unter sourceSets in Ihrer App build.gradle an
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 '.' } } } }
quelle
Sie sollten Ihren Code ändern:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="se.example.package">
zum:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.your.appid">
quelle
Siehe https://developer.android.com/studio/build/manifest-merge mit param tools: node = "merge"
Manifest mit hoher Priorität (kostenlos):
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" tools:node="merge"> </activity>
Manifest mit niedriger Priorität (Main):
<activity android:name="com.example.ActivityOne" android:windowSoftInputMode="stateUnchanged"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
Zusammengeführtes offensichtliches Ergebnis:
<activity android:name="com.example.ActivityOne" android:screenOrientation="portrait" android:windowSoftInputMode="stateUnchanged"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
quelle
Ich bin auf dasselbe Problem gestoßen und habe festgestellt, dass ich den Flavour-Ordner "pro" und "tree" unter das lib-Projekt gestellt habe. Das Problem wurde behoben, nachdem ich den Flavour-Ordner unter das App-Projekt verschoben habe
quelle