2012-12-18 10 views
15

Sto usando il nuovo gradle android buildsystem.Disattiva la fusione manifesto in Android Gradle Build

Il progetto è costituito da due progetti di libreria Android e un progetto principale.

Utilizzando la generazione di form, la fusione manifest deve essere abilitata in project.properties. Ma quando si utilizza il sistema gradle build la fusione manifest è abilitata per impostazione predefinita. Come posso disattivare la fusione manifest?

+0

Sarei interessato a sapere perché si desidera disattivarlo? Non abbiamo intenzione di attivarlo (in questo momento) ma vogliamo supportare tutti i casi d'uso. –

+0

@Xav: Abbiamo sviluppato il nostro progetto fino ad ora con form e non ci siamo presi cura di AndroidManifest.xml nei nostri progetti di libreria. Quindi abbiamo avuto piccoli problemi durante la migrazione a gradle a causa di errori di fusione manifest. – endian

+1

@Xav: desidero anche disattivare la fusione. La fusione manifest sembra dare priorità al manifest in main. Ho dei valori, ad esempio "icona" nel mio gusto che ha bisogno di scavalcare il main, ma la fusione sta buttando via quei valori. –

risposta

10

Edit: questo è in realtà possibile, anche se indirettamente, a partire da 0,3

Quello che dovete fare è disabilitare il compito processManifest in modo che non viene eseguito e dire ai processResources in cui il manifesto da utilizzare è:

Si noti che se si personalizza il nome del pacchetto dell'app tramite DSL, è necessario mantenere il file manifest non modificato nella posizione predefinita per fornire un nome di pacchetto coerente per le classi R e quindi avere i manifesti uniti manualmente da qualche altra parte e indirizzare a ciascuna attività di tipo processoResources. .

+3

Sto cercando "Impossibile trovare la proprietà 'buildVariants" su [email protected] "quando provo questo. – Dylan

+3

+1 questo non è più valido per il plugin 0.5+ e la documentazione non aiuta a capire come escludere manifest di alcune librerie. –

+2

Vedere sotto per una risposta aggiornata per 0.5. +/0.6. + – urish

2

Per la 0.5 + plugin è necessario cambiare da each a all in questo modo:

android.buildVariants.all { variant -> 
    variant.processResources.manifestFile = file('src/main/AndroidManifest.xml') 
    variant.processManifest.enabled=false 
} 
5

Per la 0.6 + plugin è necessario anche cambiare buildVariants-applicationVariants:.

android.applicationVariants.all { variant -> 
    variant.processResources.manifestFile = file('src/main/AndroidManifest.xml') 
    variant.processManifest.enabled=false 
} 
+0

In quale file è richiesta questa modifica? –

+1

incollandolo in 'build.gradle' dell'app che sto ricevendo errore: Errore: (92, 0) Impossibile trovare la proprietà 'processResources' su com.and[email protected]68ff5866. Open File

2

Non sembra che queste soluzioni funzionino per il plugin 1.0:

Could not find property 'processResources' on com.and[email protected]774f1d0b.

Qualcuno ha un aggiornamento? Il nostro problema è un'attività randagio che mostra nella apk finale recyclerview-v7: 21.0.3:

<activity 
    android:label="RecyclerViewTestActivity" 
    android:name="android.support.v7.widget.TestActivity"/> 

Aggiornamento: Sembra fusione manifesta può essere configurato (vedi http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger). In questo caso specifico, il TestActivity proveniente dalla libreria recyclerview-v7 può essere rimosso con:

<activity 
    android:name="android.support.v7.widget.TestActivity" 
    android:label="RecyclerViewTestActivity" 
    tools:node="remove"/> 

Grazie Filip.

+0

Il problema con la mia app è che l'apk generato ha il permesso Read_Contacts in esso tuttavia non lo sto dichiarando nel manifest. Non sei sicuro di come risolvere questo problema. –

+0

@ShajeelAfzal controlla 'build/outputs/logs/manifest-merger-debug-report.txt' per vedere dove proviene ogni bit in' build/intermediates/manifests/full/debug/AndroidManifest.xml'. (Potrebbe non essere disponibile o essere in file diversi nelle versioni precedenti, sto usando 2.0.0.) – TWiStErRob

8

Questo può aiutare.

android.applicationVariants.all{ variant -> 
     variant.outputs.each { output -> 
     output.processResources.manifestFile = file('AndroidManifest.xml') 
     output.processManifest.enabled=false 
     } 
    } 
+0

Funziona con il plugin 2.10. Il percorso del file manifest deve essere 'src/main/AndroidManifest.xml' –