Плагин Android Gradle 3.0.0-alpha2, невозможно установить значение свойства только для чтения 'outputFile'

86

я использовал этот код

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


чтобы изменить имя файла apk при создании нового apk, но поскольку я использую Android Studio 3.0 Canary 2, появляется эта ошибка:
не удается установить значение свойства только для чтения 'outputFile' ....

Мохамд Али
источник
1
Вот объяснение Плохих новостей, developer.android.com/studio/preview/features/… , очевидно, новый API планируется решить эту проблему. Прокрутите страницу ссылок вниз.
Гектор

Ответы:

207

Как Android плагин 3,0 Руководство по миграции предлагает:

  • Используйте all()вместоeach()
  • Используйте outputFileNameвместо, output.outputFileесли вы меняете только имя файла (это ваш случай)

Пример из руководства:

// 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
Мне нужно изменить путь к выходному файлу, а не только имя.
Амрут Бидри
@AmrutBidri, я думаю, было бы лучше задать новый вопрос (если на него еще нет ответа где-то на SO). Этот вопрос касался только изменения имени файла.
Павел
Да, это работает, плохо, это была проблема с моим собственным плагином, который проверяет версию Gradle.
sandrstar
7

Увидеть ниже:

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
это работает, но вы не можете изменить выходной каталог
just_user
Мне нужно изменить путь к выходному файлу, а не только имя.
Амрут Бидри
получение ошибки: Абсолютный путь не поддерживается при установке имени выходного файла
ozmank
4

Ниже код работает для меня на 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;
    }
}

Это изменит имя файла apk

Манмит Сингх Батра
источник
Не удалось получить неизвестное свойство «вариант» для объекта типа com.android.build.gradle.internal.api.ApplicationVariantImpl.
ozmank
2

Это полный пример этого вопроса.

Только вы должны вставить свой Gradle 3.0+ после продукта

    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"
    }
    }
Пабель
источник
вы вставили его в свой gradle 3.0+ и после productFlavours ?? можешь поставить конкретную ошибку?
Пабель
0

Я основал gradle 3.0, больше не работает. ссылка на источник

Однако более сложные задачи, связанные с доступом к объектам outputFile, больше не работают. Это связано с тем, что на этапе настройки больше не создаются задачи для конкретных вариантов. Это приводит к тому, что плагин не знает заранее обо всех своих выходных данных, но это также означает более быстрое время настройки.

затем я использовал команду gradlewдля компиляции проекта. cpи вывод apk на мой указанный путь

В оболочке Execute я ввел команду ниже.

./gradlew clean assembleDebug
cp $WORKSPACE/app/build/outputs/apk/debug/*.apk $WORKSPACE/JenkinsApk
Лучше
источник
Вы можете поделиться примером, как вы это сделали?
Амрут Бидри
0

У меня такая же проблема. Ошибка "Невозможно установить значение доступного только для чтения свойства 'outputFile' ...." "

Я изменил версию репозитория плагинов Android на 2.3.3 в окне «Структура проекта». Теперь он работает, и ошибка исчезла.

Структура проекта

Позже сделайте Clean и Rebuild для проекта и все.

Надеюсь, это будет вам полезно.

user3287093
источник
0

Прошло полтора года с тех пор, как был задан вопрос, но, возможно, это поможет кому-то (например, мне), кто первым обнаружит этот пост. Я считаю, что здесь был дан ответ об изменении имени файла и каталога .

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
источник
-1

После обновления до Android Studio 3.0.0 и использования нового градиента теперь выходные файлы apks будут распределяться по каталогам по названиям ароматов и типам сборки.

Мохамд Али
источник