2014-09-23 13 views
32

Sto utilizzando la seguente configurazione semplificata in un progetto di applicazione Android.Avviso gradle: variant.getOutputFile() e variant.setOutputFile() sono deprecati

android { 
    compileSdkVersion 20 
    buildToolsVersion "20.0.0" 

    defaultConfig { 
     minSdkVersion 8 
     targetSdkVersion 20 
     versionCode 1 
     versionName "1.0.0" 

     applicationVariants.all { variant -> 
      def file = variant.outputFile 
      def fileName = file.name.replace(".apk", "-" + versionName + ".apk") 
      variant.outputFile = new File(file.parent, fileName) 
     } 
    }  
} 

Ora che ho aggiornato il plug-in per Gradle v.0.13.0 e Gradle a v.2.1. i seguenti avvisi compaiono:

WARNING [Project: :MyApp] variant.getOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead. 
WARNING [Project: :MyApp] variant.setOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead. 
WARNING [Project: :MyApp] variant.getOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead. 
WARNING [Project: :MyApp] variant.setOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead. 

Come posso riscrivere lo script Groovy per sbarazzarsi dei warning di deprecazione?

risposta

59

Costruire sulla risposta da Larry Schiefer è possibile modificare lo script per qualcosa di simile:

android { 
    applicationVariants.all { variant -> 
     variant.outputs.each { output -> 
      def outputFile = output.outputFile 
      if (outputFile != null && outputFile.name.endsWith('.apk')) { 
       def fileName = outputFile.name.replace('.apk', "-${versionName}.apk") 
       output.outputFile = new File(outputFile.parent, fileName) 
      } 
     } 
    } 
} 
+0

Hai davvero provato a eseguire questo codice? Viene visualizzato il messaggio "Impossibile trovare il file di proprietà" su com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated @ 4b50996. Questo plug-in per android gradle è brutale. – Merk

+0

@Merk In realtà, sì, sono venuto qui cercando una risposta alla stessa domanda, e finalmente sono riuscito a farlo funzionare con lo snippet sopra (anche se ho qualche codice leggermente diverso all'interno del if). Sembra che tu abbia scritto qualcosa di sbagliato se non riesci a trovare la proprietà 'file', dal momento che nessuna proprietà di questo tipo è usata nel mio snippet :) – Thorbear

+0

Sconcertante perché questa è la riga incriminata: 'output.outputFile = new File (file.parent , "AppName_playstorebuild.apk") '. BTW Sto usando 'classpath 'com.android.tools.build: gradle: 0.13.0'' – Merk

8

L'API di output variante build è stata modificata nell'ultimo plug-in Android Gradle. Ora consente più file di output (o directory), motivo per cui questo metodo è stato contrassegnato come deprecato. Se invece usi variant.outputs, ti sarà dato un Collection da poter poi iterare e ottenere ogni file di output. Dovrai verificare che l'oggetto file sia non nullo e che corrisponda ai tuoi criteri (ad esempio, ha un'estensione '.apk'). Quindi puoi creare un nuovo oggetto File e aggiungerlo all'output all'interno della raccolta.

+0

Né 'variant.outputs.outputFile.name = "NewBuildName.apk"' 'né variant.outputs.add (new File ("NewBuildName.apk")) 'ha qualche effetto, quindi non sono sicuro di quale azione stai suggerendo. – Merk

+6

Dove si trova la documentazione per vedere quali proprietà sono nell'oggetto "output"? – whizzle

+4

Sfortunatamente, a questo punto nel tempo questo è in gran parte non documentato. Devi fare affidamento sull'aiuto in linea all'interno di Android Studio (non molto utile) o andare a scavare attraverso il codice Groovy/Java all'interno del plugin stesso per trovare i dettagli. Dato che 'outputs' è una' Collezione 'dovresti essere in grado di trovare documenti sull'oggetto 'Collection' di Groovy/Java. –

16

Il frammento di codice completo assomiglia a quella:

// Customize generated apk's name with version number 
applicationVariants.all { variant -> 
    variant.outputs.each { output -> 
     def outputFile = output.outputFile 
     if (outputFile != null && outputFile.name.endsWith('.apk')) { 
      def manifestParser = new com.android.builder.core.DefaultManifestParser() 
      def fileName = outputFile.name.replace(".apk", "-DEBUG-" + manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile) + ".apk") 
      output.outputFile = new File(outputFile.parent, fileName) 
     } 
    } 
} 
Problemi correlati