Android Studio twee smaken met verschillende manifest-bestanden

Ik heb problemen met het definiëren van twee verschillende manifestbestanden voor mijn smaken in Android Studio. Dit is mijn huidige projectstructuur:

Huidige projectstructuur

De AndroidManifest.xmlin 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.xmlin de main-smaak heeft geen use-permissions, maar bevat de rest van de manifestcode die door alle smaken wordt gedeeld.

De AndroidManifest.xmlin 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.xmlin 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.xmlvan elk van de res-mappen gewijzigd in freeen promap. Het resultaat hiervan:

  1. Pro-smaak toont licentietoestemming zoals verwacht.
  2. 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:nodedie 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 mainen verwijdert u in het smakenmanifest de machtigingen die u niet nodig heeft, zoals in het onderstaande voorbeeld:

freeverwijder 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-libraryom 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

Other episodes