Complemento de Android Gradle 3.0.0-alpha2, no se puede establecer el valor de la propiedad de solo lectura 'outputFile'

86

estaba usando este código

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


para cambiar el nombre del archivo apk cuando construyo un nuevo apk, pero como uso Android Studio 3.0 Canary 2, aparece este error:
No se puede establecer el valor de la propiedad de solo lectura 'outputFile' ....

Mohamd Ali
fuente
1
Aquí están las malas noticias explicadas, developer.android.com/studio/preview/features/… , aparentemente se planea una nueva API para resolver esto. Desplácese hasta el final de esa página de enlaces.
Héctor

Respuestas:

207

Como sugiere la guía de migración del complemento de Android 3.0 :

  • Usar en all()lugar deeach()
  • Úselo en outputFileNamelugar de output.outputFilesi cambia solo el nombre del archivo (ese es su caso)

Ejemplo de la guía:

// 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
fuente
1
Necesito cambiar la ruta del archivo de salida, no solo el nombre.
Amrut Bidri
@AmrutBidri, creo que sería mejor hacer una nueva pregunta (si aún no está respondida en algún lugar de SO). Esta pregunta fue solo para cambiar el nombre del archivo.
Paweł Nadolski
Sí, funciona, mal, fue un problema con mi propio complemento que verifica la versión de Gradle.
Sandrstar
7

Vea abajo:

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
fuente
1
esto funciona, pero no puede cambiar el directorio de salida
just_user
Necesito cambiar la ruta del archivo de salida, no solo el nombre.
Amrut Bidri
error de obtención: la ruta absoluta no es compatible al configurar un nombre de archivo de salida
ozmank
4

El siguiente código me funciona en 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;
    }
}

Esto cambia el nombre del archivo apk

Manmeet Singh Batra
fuente
No se pudo obtener la propiedad desconocida 'variante' para el objeto de tipo com.android.build.gradle.internal.api.ApplicationVariantImpl.
ozmank
2

Este es el ejemplo completo de esta pregunta.

Solo tienes que pegar en tu gradle 3.0+ after 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"
    }
    }
Pabel
fuente
¿Lo has pegado en tu gradle 3.0+ y después de productFlavours? ¿Puedes poner el error específico?
Pabel
0

Fundé gradle 3.0 ya no funciona. enlace fuente

Sin embargo, las tareas más complicadas que implican acceder a los objetos outputFile ya no funcionan. Esto se debe a que las tareas específicas de variante ya no se crean durante la etapa de configuración. Esto da como resultado que el complemento no conozca todas sus salidas por adelantado, pero también significa tiempos de configuración más rápidos.

luego usé el comando gradlewpara compilar el proyecto y cpel apk de salida en mi ruta especificada

En Ejecutar shell, puse el comando debajo.

./gradlew clean assembleDebug
cp $WORKSPACE/app/build/outputs/apk/debug/*.apk $WORKSPACE/JenkinsApk
Mejor
fuente
¿Puedes compartir el ejemplo de cómo lo hiciste?
Amrut Bidri
0

Yo tuve el mismo problema. Error "No se puede establecer el valor de la propiedad de solo lectura 'outputFile' ...." "

Entonces, lo que hice fue cambiar la versión del repositorio de complementos de Android a 2.3.3 en la ventana Estructura del proyecto. Funciona ahora y el error desapareció.

Estructura del proyecto

Más tarde, haga Clean and Rebuild para el proyecto y eso es todo.

Espero que esto sea útil para ti.

user3287093
fuente
0

Este es un año y medio desde que se hizo la pregunta, pero tal vez esto ayude a alguien (como yo) que descubra esta publicación primero. Creo que la respuesta para cambiar el nombre del archivo y el directorio se respondió aquí .

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
fuente
-1

Después de actualizar a Android Studio 3.0.0 y usar el nuevo gradle, ahora, la salida de apks se distribuirá en directorios por nombre de sabores y tipos de compilación.

Mohamd Ali
fuente