Plugin Android Gradle 3.0.0-alpha2, impossibile impostare il valore della proprietà di sola lettura 'outputFile'


86

stavo usando questo codice

applicationVariants.all { variant -> 
    variant.outputs.each { output ->
        def SEP = "_"
        def flavor = variant.productFlavors[0].name
        def buildType = 
        variant.variantData.variantConfiguration.buildType.name
        def version = variant.versionName
        def date = new Date()
        def formattedDate = date.format('ddMMyy_HHmm')
        def newApkName = PROJECT_NAME + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"
        def file = new File(newApkName)
        output.outputFile = file
    }
}


per cambiare il nome del file apk quando creo un nuovo apk, ma poiché utilizzo Android Studio 3.0 Canary 2 viene visualizzato questo errore:
Impossibile impostare il valore della proprietà di sola lettura 'outputFile' ....


1
Ecco la cattiva notizia spiegata, developer.android.com/studio/preview/features/… , a quanto pare è prevista una nuova API per risolvere questo problema. Scorri fino alla fine della pagina dei link.
Ettore

Risposte:


207

Come suggerisce la guida alla migrazione del plugin 3.0 per Android :

  • Usa all()invece dieach()
  • Usa outputFileNameinvece di output.outputFilese cambi solo il nome del file (questo è il tuo caso)

Esempio dalla guida:

// If you use each() to iterate through the variant objects,
// you need to start using all(). That's because each() iterates
// through only the objects that already exist during configuration time—
// but those object don't exist at configuration time with the new model.
// However, all() adapts to the new model by picking up object as they are
// added during execution.
android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.name}-${variant.versionName}.apk"
    }
}

1
Ho bisogno di cambiare il percorso del file di output, non solo il nome.
Amrut Bidri

@AmrutBidri, penso che sarebbe meglio fare una nuova domanda (se non ha già risposto da qualche parte su SO). Questa domanda era solo per cambiare il nome del file.
Paweł Nadolski

Sì, funziona, colpa mia, è stato un problema con il mio plugin che controlla la versione gradle.
sandrstar

7

Vedi sotto:

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def newApkName = applicationId + "-" + variant.versionName + "(" + variant.versionCode + ")" + ".apk";
        outputFileName = new File("${project.projectDir}/../outputs/apks/" + variant.name, newApkName);
    }
}

1
funziona, ma non è possibile modificare la directory di output
just_user

Ho bisogno di cambiare il percorso del file di output, non solo il nome.
Amrut Bidri

errore ottenuto: il percorso assoluto non è supportato quando si imposta un nome file di output
ozmank

4

Il codice seguente funziona per me su Android Studio Canary 3.0.0-alpha3

android.applicationVariants.all {
    variant.outputs.all {
        def newApkName
        newApkName = "APPLICATION_NAME-" + defaultConfig.versionName + "-" + defaultConfig.versionCode".apk"
        outputFileName = newApkName;
    }
}

Questo cambia il nome del file apk


Impossibile ottenere la proprietà sconosciuta "variant" per l'oggetto di tipo com.android.build.gradle.internal.api.ApplicationVariantImpl.
ozmank

2

Questo è l' esempio completo di questa domanda.

Devi solo incollare il tuo gradle 3.0+ dopo productFlavours

    android.applicationVariants.all { variant ->
    variant.outputs.all {

        def SEP = "_"
        def flavor = variant.productFlavors[0].name
        def buildType = variant.variantData.variantConfiguration.buildType.name
        def version = variant.versionName
        def versionCode = variant.versionCode
        def date = new Date();
        def formattedDate = date.format('ddMMyy_HHmm')

        outputFileName = "${flavor}${SEP}${buildType}${SEP}${version}${SEP}${versionCode}${SEP}${formattedDate}.apk"
    }
    }

l'hai incollato nel tuo gradle 3.0+ e dopo productFlavours ?? puoi mettere l'errore specifico?
Pabel

0

Ho fondato Gradle 3.0 non funziona più. collegamento alla fonte

Tuttavia, le attività più complesse che implicano l'accesso agli oggetti outputFile non funzionano più. Questo perché le attività specifiche della variante non vengono più create durante la fase di configurazione. Ciò fa sì che il plug-in non conosca tutti i suoi output in anticipo, ma significa anche tempi di configurazione più rapidi.

quindi ho usato il comando gradlewper compilare il progetto e cpl'apk di output nel mio percorso specificato

In Execute shell, ho messo sotto il comando.

./gradlew clean assembleDebug
cp $WORKSPACE/app/build/outputs/apk/debug/*.apk $WORKSPACE/JenkinsApk

puoi condividere l'esempio di come hai fatto?
Amrut Bidri

0

Ho avuto lo stesso problema. Errore "Impossibile impostare il valore della proprietà di sola lettura 'outputFile' ...." "

Quindi quello che ho fatto è stato cambiare la versione di Android Plugin Repository alla 2.3.3 nella finestra Struttura del progetto. Ora funziona e l'errore è scomparso.

Struttura del progetto

Successivamente, esegui Clean and Rebuild per il progetto e il gioco è fatto

Spero che questo ti sia utile.


0

È passato un anno e mezzo da quando è stata posta la domanda ma forse questo aiuterà qualcuno (come me) che scopre per primo questo post. Credo che la risposta per cambiare il nome del file e la directory sia stata risolta qui .

applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def relativeRootDir = output.packageApplication.outputDirectory.toPath()
                     .relativize(rootDir.toPath()).toFile()
            output.outputFileName = new File( "$relativeRootDir/release", newOutputName)
        }
    }

-1

Dopo l'aggiornamento ad Android Studio 3.0.0 e l'utilizzo del nuovo gradle, ora l'output degli apk verrà distribuito nelle directory in base al nome dei gusti e ai tipi di build.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.