5

In build.gradle, ho sapori di prodotti configurare:Android, Gradle, sapori di prodotto e il manifesto

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

Poi nella sezione sourceSets, io uso diverse risorse, le attività e le directory di manifesto per quei sapori:

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 finora.

In questo manifesto in uso dal sapore, che è in parte generato automaticamente, ho:

<?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" > 

ma nel manifesto originale nel progetto principale è la seguente:

<?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" > 

Questo fa sì che Gradle a fallire:

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. 

Perché è cercando di Merg e con il manifest originale, quando ho specificato dovrebbe cercare altrove?

E come posso fermarlo?

Mi aspetto che alcuni si chiederanno perché lo sto facendo in questo modo, o addirittura perché non sto usando la struttura del progetto di sapore suggerito. Bene, ho bisogno di un manifest normale da usare al di fuori di Gradle, ad es. per la distribuzione da Eclipse (una cosa alla volta, per favore!) e ho bisogno anche di versioni da iniettare dal processo di compilazione.

risposta

0

sarò tenendo in mente ciò che ha detto @CommonsWare nella loro risposta, ma per ora, ho risolto in questo modo:

<?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" > 

nota i due tools frammenti.

Sapevo di questo in origine, ma mi è stato messo fuori cercando, perché l'errore completo Gradle di cui tre problemi:

  • versionCode
  • versionName
  • l'API Maps chiave

tutti i quali sono auto-inseriti. Tuttavia ha solo sporto tools:replace come suggerimento per l'ultimo di questi, quindi ho avuto l'impressione che non avrebbe funzionato sugli attributi manifest. In effetti lo fa.

4

Perché si sta tentando di unire con il manifest originale, quando ho specificato dovrebbe cercare altrove?

Lei ha detto il manifesto sapore è altrove. Il processo di fusione manifesta unisce manifesta tutti rilevanti:

  • main
  • il tipo di generazione
  • il sapore del prodotto (s)
  • librerie

Il manifesto in main è sempre attuale.

E come posso fermarlo?

Non lo è, nella misura in cui il manifest in main è sempre pertinente.

La soluzione migliore, in generale, è quello di sbarazzarsi di versionCode e versionName da tutti manifesta, e metterli in build.gradle, dove si ha il pieno controllo programmatico.

La soluzione migliore è spostare ildal main manifest nel manifest prodotto che non viene mostrato qui. Non ho mai visto nessuno creare un solo sapore di prodotto, poiché AFAIK è inutile. — puoi sempre edificare quell'unico aroma di prodotto (come AFAIK non ci sono creazioni senza sapore una volta introdotti i sapori). Gli aromi di prodotto vengono solitamente in gruppi di 2+ (ad esempio, l'aroma google che utilizza i servizi di riproduzione e l'aroma standalone che non lo è). Se i valori in main sono realmente per il tipo non AlternateFlavour, spostare il materiale mainversion... lì.

Oltre a questo, ti invitiamo a controllare the documentation on the manifest merger process per vedere se è possibile inserire le direttive corrette per ottenere ciò che desideri.

+0

Quindi, prima di tutto, c'è un sacco di sapori qui - ho solo cercato di mantenere l'esempio dato semplice. Non posso (AFAIK) farla franca con la rimozione degli attributi dal manifest originale perché è quella usata dalla distribuzione IDE. Comunque potrei creare un terzo, senza gli attributi, e Gradle usarlo di default. Sembra eccessivo! –

+0

@RobPridham: "quello utilizzato dalla distribuzione IDE": se si utilizza Android Studio, lo strumento Varianti di generazione controlla ciò che viene utilizzato dall'IDE. – CommonsWare

+0

Infatti. Non ancora purtroppo - utilizzando ancora Eclipse e ADT per questo sviluppo, per una varietà di buone ragioni (anche se meno buone nel tempo). –

Problemi correlati