Android Gradle 3.0.0-alpha2-Plugin, Der Wert der schreibgeschützten Eigenschaft 'outputFile' kann nicht festgelegt werden.

86

Ich habe diesen Code verwendet

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
    }
}


um den Namen der Apk-Datei zu ändern, wenn ich eine neue Apk erstelle, aber da ich Android Studio 3.0 Canary 2 verwende , erscheint dieser Fehler:
Der Wert der schreibgeschützten Eigenschaft 'outputFile' kann nicht festgelegt werden ....

Mohamd Ali
quelle
1
Hier sind die schlechten Nachrichten erklärt, developer.android.com/studio/preview/features/… , anscheinend ist eine neue API geplant, um dies zu beheben. Scrollen Sie zum Ende dieser Linkseite.
Hector

Antworten:

207

Wie der Migrationsleitfaden für Android Plugin 3.0 vorschlägt:

  • Verwenden Sie all()anstelle voneach()
  • Verwenden Sie outputFileNameanstelle von, output.outputFilewenn Sie nur den Dateinamen ändern (das ist Ihr Fall).

Beispiel aus der Anleitung:

// 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"
    }
}
Paweł Nadolski
quelle
1
Ich muss den Pfad der Ausgabedatei ändern, nicht nur den Namen.
Amrut Bidri
@AmrutBidri, ich denke, es wäre am besten, eine neue Frage zu stellen (wenn sie nicht schon irgendwo auf SO beantwortet wird). Diese Frage diente nur zum Ändern des Dateinamens.
Paweł Nadolski
Ja, es funktioniert, mein schlechtes, es war ein Problem mit meinem eigenen Plugin, das die Gradle-Version überprüft.
Sandstar 24.
7

Siehe unten:

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);
    }
}
Golan Shay
quelle
1
Dies funktioniert, aber Sie können das Ausgabeverzeichnis nicht ändern
just_user
Ich muss den Pfad der Ausgabedatei ändern, nicht nur den Namen.
Amrut Bidri
Fehler erhalten: Absoluter Pfad wird nicht unterstützt, wenn ein Ausgabedateiname festgelegt wird
ozmank
4

Der folgende Code funktioniert für mich auf 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;
    }
}

Dies ändert den Namen der apk-Datei

Manmeet Singh Batra
quelle
Unbekannte Eigenschaft 'variante' für Objekt vom Typ com.android.build.gradle.internal.api.ApplicationVariantImpl konnte nicht abgerufen werden.
Ozmank
2

Dies ist das vollständige Beispiel dieser Frage.

Nur Sie müssen Ihren Gradle 3.0+ nach productFlavours einfügen

    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"
    }
    }
Pabel
quelle
Haben Sie es in Ihren Gradle 3.0+ und nach productFlavours eingefügt? Sie können den spezifischen Fehler setzen?
Pabel
0

Ich habe Gradle 3.0 gegründet, das funktioniert nicht mehr. Quelllink

Kompliziertere Aufgaben, bei denen auf outputFile-Objekte zugegriffen wird, funktionieren jedoch nicht mehr. Dies liegt daran, dass in der Konfigurationsphase keine variantenspezifischen Aufgaben mehr erstellt werden. Dies führt dazu, dass das Plugin nicht alle Ausgänge im Voraus kennt, aber es bedeutet auch schnellere Konfigurationszeiten.

dann habe ich den Befehl verwendet gradlew, um project.and cpdie Ausgabe apk auf meinen angegebenen Pfad zu kompilieren

In Execute Shell habe ich unten Befehl geputtet.

./gradlew clean assembleDebug
cp $WORKSPACE/app/build/outputs/apk/debug/*.apk $WORKSPACE/JenkinsApk
Besser
quelle
Kannst du das Beispiel teilen, wie du es gemacht hast?
Amrut Bidri
0

Ich hatte das gleiche Problem. Fehler "Der Wert der schreibgeschützten Eigenschaft 'outputFile' kann nicht festgelegt werden ...." "

Ich habe also die Version des Android Plugin Repository im Fenster Projektstruktur auf 2.3.3 geändert. Es funktioniert jetzt und der Fehler ist verschwunden.

Projektstruktur

Führen Sie später Clean and Rebuild für das Projekt durch und fertig

Hoffe das wäre hilfreich für dich.

user3287093
quelle
0

Dies ist anderthalb Jahre her, seit die Frage gestellt wurde, aber vielleicht hilft dies jemandem (wie mir), der diesen Beitrag zuerst entdeckt. Ich glaube, die Antwort zum Ändern des Dateinamens und des Verzeichnisses wurde hier beantwortet .

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

Nach dem Update auf Android Studio 3.0.0 und der Verwendung des neuen Gradles wird die Ausgabe von Apks nun in Verzeichnissen nach Geschmacksnamen und Build-Typen verteilt.

Mohamd Ali
quelle