2015-06-26 10 views
5

Ho un file build.gradle nella mia app androide con queste impostazioni:Override Android Gradle forma versionCode riga di comando

android { 
    ... 
    defaultConfig { 
     applicationId "some.app.id" 
     versionName '1.2' 
     versionCode 3 
     ... 
    } 
... 
} 

mio AndroidManifest.xml non contiene versionCode e non contengono versionName.

Ora voglio creare questa app su Jenkins e passare BUILD_NUMBER come versionCode per app, in modo che ogni build abbia una versione superiore.

Così nel lavoro che hava una chiamata:

./gradlew -PversionCode=$BUILD_NUMBER clean build 

Quando uso "versionCode" rinominare "app-release.apk" valore versionCode è lo stesso che è passato da riga di comando:

applicationVariants.all { variant -> 
    variant.outputs.each { output -> 
     output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "MyApp_" + "_v" + versionName + "." + versionCode + ".apk")) 
    } 
} 

Sommario

quindi ho un valore predefinito di "versionCode" impostato su 3, ma quando si costruisce sul Jenkins voglio ignorare dal comando linea.

Il problema

Il problema è che in AndroidManifest all'interno accumulo .apk applicazione è versionCode impostato a 3 invece di valore da BUILD_NUMBER. ho controllato con "discarica aapt badging"

La domanda

Può questo valore "versionCode" dal defaultconfig android essere sovrascritte dal parametro di riga di comando?

lo so, potrei usare una funzione come spiegato in: http://robertomurray.co.uk/blog/2013/gradle-android-inject-version-code-from-command-line-parameter/ ma io preferisco il modo più pulito di semplice sostituzione, ma non posso farlo funzionare.

+0

Oh, andiamo ... dovrebbe essere ovvio ... 'versionCode' param non è uguale a' andro id.defaultConfig.versionCode' ... usa 'versionCode versionCode' invece' versionCode 3' (non so se funzionerebbe, se no, poi leggere come usare i parametri del progetto) ...modifica: anche il modo in cui il link è più pulito – Selvin

+0

@Selvin Sto postando su StackOverflow dopo 2 giorni di ricerche e provando diverse versioni di parametri, quindi ho fatto alcuni dei miei compiti :) Se nessuno usa versionCode come ho descritto, allora forse non funzionerà. Ma sto guardando qualcuno che ha provato questo e forse ha più fortuna di me. – ljader

+0

... e? Non ho detto che non hai cercato .. link sembra bello e, nei tuoi panni, lo userei ... ti punto solo che non è la stessa variabile ... quello dalla linea di comando è un variabile di progetto e android.defaultConfig.versionCode è in una classe diversa ... hai provato 'versionCode versionCode' o' versionCode project.versionCode'? – Selvin

risposta

8

È possibile utilizzare le proprietà definendole in un file gradle.properties, vedere gradle documentation. Ma dovrai stare molto attento ai nomi che usi per le tue proprietà: se usi versionName quella proprietà avrà il valore corretto in gradle (puoi farlo println) ma non finirà nel tuo AndroidManifest.xml! Quindi ho scelto di usare 'versName'. (Non so abbastanza di Gradle per capire il motivo per cui questo è così ...)

Quindi, in gradle.properties è possibile definire le seguenti proprietà del vostro progetto: versCode=3 versName=1.2

e quindi modificare il file build.gradle in:

android { 
    ... 
    defaultConfig { 
     applicationId "some.app.id" 
     versionName versName 
     versionCode versCode as Integer 
     ... 
    } 
    ... 
} 

Ora è possibile ignorare sulla riga di comando come questo: ./gradlew -PversCode=4 -PversName=2.1.3 clean build

+2

FYI Avevo bisogno di versionCode versCode come Integer, altrimenti ricevevo un'eccezione che si lamentava del metodo versionCode() non trovato. –

+0

È bene sapere che è possibile sovrascrivere le proprietà dal file gradle.properties. – ljader

Problemi correlati