Plug-in Android Gradle 3.0.0-alpha2, impossible de définir la valeur de la propriété en lecture seule 'outputFile'


86

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 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
Voici les mauvaises nouvelles expliquées, developer.android.com/studio/preview/features/… , apparemment une nouvelle API est prévue pour résoudre ce problème. Faites défiler vers le bas de cette page de liens.
Hector

Réponses:


207

Comme le suggère le guide de migration du plugin Android 3.0 :

  • Utiliser à la all()place deeach()
  • Utilisez outputFileNameplutôt que output.outputFilesi vous changez uniquement le nom du fichier (c'est votre cas)

Exemple 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
Je dois changer le chemin du fichier de sortie, pas seulement le nom.
Amrut Bidri

@AmrutBidri, je pense qu'il serait préférable de poser une nouvelle question (si elle n'est pas déjà répondue quelque part sur SO). Cette question concernait uniquement le changement de nom de fichier.
Paweł Nadolski

Oui ça marche, mon mauvais, c'était un problème avec mon propre plugin qui vérifie la version gradle.
sandrstar

7

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
cela fonctionne, mais vous ne pouvez pas changer le répertoire de sortie
just_user

Je dois changer le chemin du fichier de sortie, pas seulement le nom.
Amrut Bidri

obtention d'une erreur: le chemin absolu n'est pas pris en charge lors de la définition d'un nom de fichier de sortie
ozmank

4

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


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

2

Ceci est l' exemple complet de cette question.

Il vous suffit de coller votre gradle 3.0+ après le produit

    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'avez-vous collé dans votre gradle 3.0+ et après productFlavours ?? vous pouvez mettre l'erreur spécifique?
Pabel

0

J'ai fondé Gradle 3.0 n'est plus un travail. lien source

Cependant, les tâches plus compliquées qui impliquent l'accès aux objets outputFile ne fonctionnent plus. En effet, les tâches spécifiques aux variantes ne sont plus créées lors de la phase de configuration. Cela fait que le plugin ne connaît pas toutes ses sorties à l'avance, mais cela signifie également des temps de configuration plus rapides.

puis j'ai utilisé la commande gradlewpour compiler le projet etcp l'apk de sortie vers mon chemin spécifié

Dans Execute shell, j'ai mis la commande ci-dessous.

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

pouvez-vous partager l'exemple comment vous l'avez fait?
Amrut Bidri

0

J'ai eu le même problème. Erreur "Impossible de définir la valeur de la propriété en lecture seule 'outputFile' ...." "

J'ai donc changé la version du référentiel de plugins Android en 2.3.3 dans la fenêtre Structure du projet. Cela fonctionne maintenant et l'erreur a disparu.

Structure du projet

Plus tard, nettoyez et reconstruisez pour le projet et c'est tout

J'espère que cela vous sera utile.


0

Cela fait un an et demi que la question a été posée mais peut-être que cela aidera quelqu'un (comme moi) qui découvre ce post en premier. Je crois que la réponse pour changer le nom du fichier et le répertoire a été répondu ici .

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

Après la mise à jour vers Android Studio 3.0.0 et l'utilisation du nouveau gradle, la sortie des apks sera maintenant distribuée dans les répertoires par nom de saveurs et types de build.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.