5

In build.gradle, ich habe Produkt Aromen ein:Android, Gradle, Produkt Aromen und das Manifest

productFlavors 
{ 
    AlternateFlavour 
    { 
     applicationId "com.myapp.alternateflavour" 
    } 
} 

Dann im sourceSets Abschnitt, verwende ich andere Ressource, Vermögen und manifestieren Verzeichnisse für diese Aromen:

sourceSets { 
    main { 
     manifest.srcFile 'AndroidManifest.xml' 
     java.srcDirs = ['src'] 
     res.srcDirs = ['res'] 
     assets.srcDirs = ['assets'] 
    } 

    AlternateFlavour { 
     manifest.srcFile 'manifest-tmp/AlternateFlavour/AndroidManifest.xml' 
     java.srcDirs = ['src'] 
     res.srcDirs = ['res-tmp/AlternateFlavour'] 
     assets.srcDirs = ['assets-tmp/AlternateFlavour'] 
     } 
    } 

OK so weit.

In diesem manifest durch das Aroma verwendet werden, die automatisch erzeugten teil ist, habe ich:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myapp.myapp" 
    android:versionCode="1010000" 
    android:versionName="V1.1.0.DEBUG" > 

:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myapp.myapp" 
    android:versionCode="1010001" 
    android:versionName="V1.1.0.1" > 

aber in der ursprünglichen manifest in dem Stammprojekt wie folgt ist Dies bewirkt, dass Gradle zum scheitern verurteilt:

Error: 
    Attribute [email protected] value=(1010001) from AndroidManifest.xml:4:5-28 
    is also present at AndroidManifest.xml:4:5-28 value=(1010000). 
Attributes of <manifest> elements are not merged. 

Warum es versucht, MERG e mit dem ursprünglichen Manifest überhaupt, wenn ich es spezifiziert habe, sollte es woanders suchen?

Und wie kann ich das stoppen?

Ich erwarte, dass einige fragen werden, warum ich es auf diese Weise überhaupt mache, oder tatsächlich, warum ich nicht die vorgeschlagene Geschmacksprojektstruktur verwende. Nun, ich brauche ein normales Manifest außerhalb von Gradle, z. Für die Bereitstellung von Eclipse (bitte eins nach dem anderen) und ich brauche auch Versionen, die vom Build-Prozess injiziert werden.

Antwort

0

Ich werde daran zu halten, was @CommonsWare in ihrer Antwort sagte, aber jetzt habe ich dieses Problem gelöst, wie folgt:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    package="com.myapp.myapp" 
    tools:replace="android:versionName,android:versionCode" 
    android:versionCode="1010001" 
    android:versionName="V1.1.0.1" > 

Beachten Sie die beiden tools Schnipsel.

Ich kannte diese ursprünglich, aber ich habe versucht, es abschrecken, weil die volle Gradle Fehler auf drei Probleme genannt:

  • version
  • version
  • die Maps API-Schlüssel

, die alle automatisch eingefügt werden. Allerdings gab es nur tools:replace als Vorschlag für die letzte von denen, so dass ich den Eindruck hatte, dass es auf manifest Attribute nicht funktionieren würde. Tatsächlich tut es das.

4

Warum versucht es mit dem ursprünglichen Manifest überhaupt zu verschmelzen, wenn ich angegeben habe, sollte es woanders suchen?

Sie sagten der Geschmack Manifest ist woanders. Das Manifest Fusionsprozess verschmilzt alle relevanten Manifeste:

  • main
  • die Buildtyp
  • der Produktgeschmack (e)
  • Bibliotheken

Das Manifest in main ist immer relevant.

Und wie kann ich das stoppen?

Das tun Sie nicht, sofern das Manifest in main immer relevant ist.

Die beste Lösung, im Allgemeinen ist, von versionCode und versionName von alle Manifeste loszuwerden, und legen Sie sie in build.gradle, wo Sie die volle programmatische Kontrolle haben.

Die nächstbeste Lösung ist, die versionCode und versionName aus dem main Manifest in das Produkt Geschmack, der Ihnen zeigt, sind hier nicht zu bewegen. Ich habe noch nie jemanden gesehen, der nur einen Produktgeschmack kreiert hat, denn AFAIK ist sinnlos. — Sie können immer nur diesen einen Produktgeschmack kreieren (als AFAIK gibt es keine geschmacklosen Builds, sobald Sie Aromen eingeführt haben). Produktaromen kommen normalerweise in Gruppen von 2+ (z. B. der google Geschmack, der Play Services verwendet, und dem standalone Geschmack, der nicht verwendet wird). Wenn die Werte in main wirklich für den nicht-AlternateFlavour Geschmack sind, verschieben Sie Ihre mainversion... Sachen dort.

Darüber hinaus können Sie gerne the documentation on the manifest merger process überprüfen, um zu sehen, ob Sie die richtigen Anweisungen setzen können, um zu bekommen, was Sie wollen.

+0

Also zuerst, es gibt viele Geschmacksrichtungen hier - ich habe nur versucht, das gegebene Beispiel einfach zu halten. Ich kann nicht (AFAIK) mit dem Entfernen der Attribute aus dem ursprünglichen Manifest davonkommen, da dies der von der IDE-Bereitstellung verwendete ist. Allerdings könnte ich möglicherweise eine dritte ohne die Attribute erstellen und Gradle standardmäßig verwenden. Scheint übertrieben! –

+0

@RobPridham: "Das ist das von der IDE-Bereitstellung verwendete Format" - Wenn Sie Android Studio verwenden, steuert das Tool zum Erstellen von Varianten, was von der IDE verwendet wird. – CommonsWare

+0

In der Tat. Leider noch nicht - immer noch mit Eclipse und ADT für diese Entwicklung, für eine Vielzahl von guten (wenn auch weniger gut über Zeit) Gründen. –