Ik heb problemen met het definiëren van twee verschillende manifestbestanden voor mijn smaken in Android Studio. Dit is mijn huidige projectstructuur:
De AndroidManifest.xml
in de free
-variant ziet er als volgt uit:
<?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>
De AndroidManifest.xml
in de main
-smaak heeft geen use-permissions, maar bevat de rest van de manifestcode die door alle smaken wordt gedeeld.
De AndroidManifest.xml
in de pro
-smaak ziet er als volgt uit:
<?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 definieert de twee smaken zoals
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'
}
}
Het resultaat dat ik verwacht is dat de verschillende smaken verschillende gebruiksrechten definiëren. Dit is niet het geval.Het resultaat is momenteel dat beide smaken alleen de <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
zoals gedefinieerd in AndroidManifest.xml
in de pro-smaak.
Ik heb geprobeerd:
- Project opschonen
- Herbouwproject
- Android Studio opnieuw starten
- Synchronisatiegraad
Maar zonder succes. Hoe moet ik dit oplossen? Alle hulp wordt op prijs gesteld.
BEWERK 1
Ik heb de locatie van elk bestand van smaken AndroidManifest.xml
van elk van de res
-mappen gewijzigd in free
en pro
map. Het resultaat hiervan:
- Pro-smaak toont licentietoestemming zoals verwacht.
- Gratis smaak toont machtigingen van beide
AndroidManifest.xml
bestanden, Licentie en netwerkrechten (Moet alleen netwerk zijn)
Dit voelt als een kwestie van projectstructuur. Wat hiervan te denken?
BEWERK 2
Ik heb de samenvoegrapporten opgehaald zoals Commonsware liet doorschemeren, dit zijn de rapporten met betrekking tot uses-permissions
Gratis:
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
Antwoord 1, autoriteit 100%
Technische achtergrond:
op deze link worden de technieken en parameters uitgelegd die kunnen worden gebruikt voor het samenvoegen van manifesten: https://developer.android.com/studio/build/manage-manifests#merge_rule_markers
Eén in het bijzonder is de tools:node
die aangeeft hoe bepaalde XML-knooppunten in het manifest zich moeten gedragen tijdens het samenvoegen.
Oplossing:
om enkele machtigingen in het ene en andere in een ander manifest te verkrijgen, voegt u ALLE machtigingen toe die u nodig hebt aan de main
en verwijdert u in het smakenmanifest de machtigingen die u niet nodig heeft, zoals in het onderstaande voorbeeld:
free
verwijder de cheque-licentie
<uses-permission
android:name="com.android.vending.CHECK_LICENSE"
tools:node="remove"/>
Antwoord 2, autoriteit 40%
Je probleem komt uit een bibliotheek, niet uit je smaken. In het bijzonder vraagt qwknoteGIT:licencing-library
om CHECK_LICENSE
.
Als je die bibliotheek niet in alle smaken gebruikt, gebruik dan een gearomatiseerde compile
-instructie (bijv. proCompile
) om alleen die bibliotheek in die smaak te gebruiken.
Als je de bibliotheek voor alle smaken gebruikt, maar er zeker van bent dat je de toestemming voor één smaak niet nodig hebt, kan daar een tools:node
-attribuut worden gebruikt, in het manifest van de smaak, om die toestemming van de bibliotheek te blokkeren.
En het manifest fusierapport is je vriend. 🙂
Antwoord 3, autoriteit 13%
Dit zou het probleem in ieder geval moeten oplossen. Ik vind het handig bij het specificeren van het exacte manifest dat voor elke variant moet worden gebruikt. Proost! Het verwijst expliciet naar het manifestbestand onder elke variantmap.
android {
productFlavors {
prod {
manifest.srcFile "prod/AndroidManifest.xml"
}
dev {
manifest.srcFile "dev/AndroidManifest.xml"
}
}
...
}
Antwoord 4, autoriteit 8%
Geef uw manifest uitsluitend op onder sourceSets, In uw app 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 '.'
}
}
}
}
Antwoord 5, autoriteit 5%
Zie https://developer.android.com/studio/build/manifest- samenvoegenmet param tools:node=”merge”
Manifest met hoge prioriteit (gratis):
<activity android:name="com.example.ActivityOne"
android:screenOrientation="portrait"
tools:node="merge">
</activity>
Manifest met lage prioriteit (hoofd):
<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>
Samengevoegd manifestresultaat:
<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>
Antwoord 6, autoriteit 2%
U moet uw code wijzigen:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="se.example.package">
voor:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.your.appid">
Antwoord 7
Ik kwam hetzelfde probleem tegen en ik ontdekte dat het kwam omdat ik de “pro” en “tree” flavour map onder het lib-project had geplaatst, en het probleem was opgelost nadat ik de flavours-map onder het app-project had verplaatst