Plug-in Android Gradle 3.0.0-alpha2, não é possível definir o valor da propriedade somente leitura 'outputFile'

86

eu estava 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 alterar o nome do arquivo apk ao criar um novo apk, mas como uso o Android Studio 3.0 Canary 2, este erro aparece:
Não é possível definir o valor da propriedade somente leitura 'outputFile' ....

Mohamd Ali
fonte
1
aqui estão as más notícias explicadas, developer.android.com/studio/preview/features/… , aparentemente, uma nova API está planejada para resolver isso. Role até o final da página de links.
Hector

Respostas:

207

Como o guia de migração do plugin Android 3.0 sugere:

  • Use em all()vez deeach()
  • Use em outputFileNamevez de output.outputFilese você alterar apenas o nome do arquivo (esse é o seu caso)

Exemplo do guia:

// 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
fonte
1
Preciso mudar o caminho do arquivo de saída, não apenas o nome.
Amrut Bidri
@AmrutBidri, acho que seria melhor fazer uma nova pergunta (se ainda não foi respondida em algum lugar do SO). Esta questão foi apenas para alterar o nome do arquivo.
Paweł Nadolski
Sim, funciona, meu mal, foi um problema com meu próprio plugin que verifica a versão do Gradle.
sandrstar
7

Ver abaixo:

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
fonte
1
isso funciona, mas você não pode alterar o diretório de saída
just_user
Preciso mudar o caminho do arquivo de saída, não apenas o nome.
Amrut Bidri
erro de obtenção: caminho absoluto não é suportado ao definir um nome de arquivo de saída
ozmank
4

O código abaixo está funcionando para mim no 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;
    }
}

Isso muda o nome do arquivo apk

Manmeet Singh Batra
fonte
Não foi possível obter a propriedade desconhecida 'variante' para o objeto do tipo com.android.build.gradle.internal.api.ApplicationVariantImpl.
ozmank
2

Este é o exemplo completo desta questão.

Só você tem que colar em seu gradle 3.0+ apó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"
    }
    }
Pabel
fonte
você colou no seu gradle 3.0+ e depois do productFlavours ?? pode colocar o erro especifico?
Pabel
0

Eu fundei o Gradle 3.0 não é mais trabalho. link da fonte

No entanto, tarefas mais complicadas que envolvem o acesso a objetos outputFile não funcionam mais. Isso ocorre porque as tarefas específicas da variante não são mais criadas durante o estágio de configuração. Isso faz com que o plugin não conheça todas as suas saídas antecipadamente, mas também significa tempos de configuração mais rápidos.

então usei o comando gradlewpara compilar o projeto e cpo apk de saída para o meu caminho especificado

Em Execute shell, coloquei abaixo o comando.

./gradlew clean assembleDebug
cp $WORKSPACE/app/build/outputs/apk/debug/*.apk $WORKSPACE/JenkinsApk
Melhor
fonte
você pode compartilhar o exemplo de como você fez isso?
Amrut Bidri
0

Eu tive o mesmo problema. Erro "Não é possível definir o valor da propriedade somente leitura 'outputFile' ...." "

Então, o que fiz foi mudar a versão do repositório de plug-ins do Android para 2.3.3 na janela Estrutura do projeto. Funciona agora e o erro desapareceu.

Estrutura do Projeto

Mais tarde, faça Limpar e Reconstruir para o projeto e pronto

Espero que isso seja útil para você.

user3287093
fonte
0

Faz um ano e meio que a pergunta foi feita, mas talvez isso ajude alguém (como eu) que descobrir este post primeiro. Acredito que a resposta para alterar o nome do arquivo e diretório foi respondida aqui .

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

Após atualizar para o Android Studio 3.0.0 e usar o novo gradle, agora, a saída do apks será distribuída em diretórios por nome de sabores e tipos de compilação.

Mohamd Ali
fonte