Плагін 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


Не вдалося отримати невідому властивість 'variant' для об'єкта типу com.android.build.gradle.internal.api.ApplicationVariantImpl.
ozmank

2

Це повний приклад цього питання.

Тільки вам потрібно вставити у ваш gradle 3.0+ після 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"
    }
    }

ви вставляєте його у свій gradle 3.0+ і після productFlavours ?? Ви можете поставити конкретну помилку?
Pabel

0

Я заснував gradle 3.0 більше не працює. посилання на джерело

Однак складніші завдання, які передбачають доступ до об'єктів outputFile, більше не працюють. Це тому, що конкретні варіанти завдань більше не створюються на етапі конфігурації. Це призводить до того, що плагін не знає всіх своїх вихідних даних заздалегідь, але це також означає швидший час налаштування.

тоді я використав команду gradlewдля компіляції project.and cpвихідного apk до мого вказаного шляху

У команді "Виконати" я поставив команду нижче.

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

можеш поділитися прикладом, як ти це зробив?
Амрут Бідрі

0

У мене була та сама проблема. Помилка "Не вдається встановити значення властивості лише для читання 'outputFile' ...." "

Отже, я змінив версію сховища плагінів Android на 2.3.3 у вікні Структура проекту. Зараз це працює, і помилка зникла.

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

Пізніше зробіть Clean and Rebuild для проекту і все

Сподіваюся, це буде корисним для вас.


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

-1

Після оновлення до Android Studio 3.0.0 та використання нового gradle, тепер висновки apk будуть розподілятися в каталогах за назвою ароматів та типами збірки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.