86 votes

Plugin Android Gradle 3.0.0-alpha2, Impossible de définir la valeur de la propriété en lecture seule 'outputFile'.

J'utilisais ce code

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

pour changer le nom du fichier apk lorsque je construis un nouvel apk, mais comme j'utilise l'application Android Studio 3.0 Canary 2 cette erreur apparaît :
Impossible de définir la valeur de la propriété en lecture seule 'outputFile' ....

1 votes

Voici la mauvaise nouvelle expliquée, developer.Android.com/studio/preview/features/ Apparemment, une nouvelle interface utilisateur est prévue pour résoudre ce problème. Faites défiler jusqu'au bas de cette page de liens.

207voto

Paweł Nadolski Points 2320

Comme Guide de migration du plugin Android 3.0 suggère :

  • Utilisez all() au lieu de each()
  • Utilisez outputFileName au lieu de output.outputFile si vous changez seulement le nom du fichier (c'est votre cas)

Exemple tiré du guide :

// 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 votes

J'ai besoin de changer le chemin du fichier de sortie, pas seulement le nom.

0 votes

@AmrutBidri, je pense qu'il serait préférable de poser une nouvelle question (si elle n'a pas déjà trouvé de réponse quelque part sur SO). Cette question portait uniquement sur le changement de nom de fichier.

0 votes

Oui, cela fonctionne, ma faute, c'était un problème avec mon propre plugin qui vérifie la version de gradle.

7voto

Golan Shay Points 317

Voir ci-dessous :

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 votes

Cela fonctionne, mais vous ne pouvez pas changer le répertoire de sortie

0 votes

J'ai besoin de changer le chemin du fichier de sortie, pas seulement le nom.

0 votes

Erreur de réception : Les chemins absolus ne sont pas pris en charge lors de la définition d'un nom de fichier de sortie.

4voto

Le code ci-dessous fonctionne pour moi sur 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;
    }
}

Cela change le nom du fichier apk

0 votes

Impossible d'obtenir la propriété inconnue 'variant' pour l'objet de type com.Android.build.gradle.internal.api.ApplicationVariantImpl.

2voto

Pabel Points 47

C'est le exemple complet de cette question.

Vous devez seulement coller dans votre gradle 3.0 et plus après 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"
    }
    }

0 votes

Vous l'avez collé dans votre gradle 3.0+ et après productFlavours ? vous pouvez mettre l'erreur spécifique ?

0voto

Better Points 81

J'ai découvert que gradle 3.0 ne fonctionne plus. lien source

Cependant, les tâches plus complexes qui impliquent l'accès aux objets outputFile ne fonctionnent plus. Cela est dû au fait que les tâches spécifiques à une variante ne sont plus créées lors de l'étape de configuration. Le plugin ne connaît donc pas toutes ses sorties dès le départ, mais la configuration est plus rapide.

puis j'ai utilisé la commande gradlew pour compiler le projet.et cp l'apk de sortie vers mon chemin spécifié

Dans le shell Execute, j'ai mis la commande suivante.

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

0 votes

Pouvez-vous partager l'exemple de votre méthode ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X