Gradle Скопируйте файл APK с помощью задачи публикации в Android Studio 3.0

До версии плагина Android 3.0.0-alpha4 я использовал следующее для публикации различных вариантов моих APK по определенному пути к файлу:

def publish = project.tasks.create("publishAll")
android.applicationVariants.all { variant ->
  def task = project.tasks.create("publish${variant.name}Apk", Copy)
  task.from(variant.outputs[0].outputFile)
  task.into(buildDir)

  task.dependsOn variant.assemble
  publish.dependsOn task
}

Первоначально я получил это из этого ответа от Ксавье Дюкроэ: в проекте Android Gradle

Что касается новых обновлений предварительной версии Android Studio, в которой используется версия 3.0.0-alpha4, variant.outputFile устарел. Каков новый предлагаемый способ достижения чего-то подобного?

РЕДАКТИРОВАТЬ: Похоже, в настоящее время нет возможности получить доступ к вариантному выходному файлу, как указано здесь: https://developer.android.com/studio/preview/features/new-android-plugin-migration.html#variant_api

Похоже, нам придется подождать, пока они не введут эти API.


person Aneem    schedule 16.06.2017    source источник
comment
Кажется, это не связано с новой версией. Вы проверяли этот stackoverflow.com/questions/25997866/?   -  person romtsn    schedule 19.06.2017
comment
Как вы думаете, почему variant.outputFile устарел? Я использую ту же настройку, и я не вижу проблем.   -  person azizbekian    schedule 19.06.2017


Ответы (1)


Если вы не используете abi splits, следующий фрагмент работает

project.afterEvaluate {
    android.applicationVariants.all { variant ->
        // create file where to copy 
        def backupFolder = rootProject.file("backup")
        def backupFile = new File(backupFolder, String.format("%s_v%s.%d.apk", variant.flavorName, variant.versionName, variant.versionCode))

        variant.outputs.all { output ->
            Task copyAndRenameAPKTask = project.task("copyAndRename${variant.name.capitalize()}APK", type: Copy) {
                from output.outputFile.getParent()
                into backupFolder
                include output.outputFileName
                rename(output.outputFileName, backupFile.getName())
            }

            // if copyAndRenameAPKTask needs to automatically execute assemble before
            copyAndRenameAPKTask.dependsOn(variant.assemble)
            copyAndRenameAPKTask.mustRunAfter(variant.assemble)

            // if assemble needs to automatically execute copyAndRenameAPKTask after
            variant.assemble.finalizedBy(copyAndRenameAPKTask)
        }
    }
}
person Sergii Pechenizkyi    schedule 19.06.2017
comment
Только что попробовал, у меня работает, спасибо! Я предполагаю, что основной вывод состоит в том, чтобы поместить всю эту логику в блок project.afterEvaluate, как вы это сделали, чтобы выходной файл был доступен. - person Aneem; 19.06.2017
comment
Я использую AS 2.3.3, но получаю сообщение об ошибке, используя этот код: Ошибка: (51, 0) Нет подписи метода: java.util.ArrayList.all() применим для типов аргументов: (build_e5fu7jxf39bbzgzwdximl8s6$_run_closure3$_closure8 $_closure9) значения: [build_e5fu7jxf39bbzgzwdximl8s6$_run_closure3$_closure8$_closure9@4cce4d64] Возможные решения: any(), tail(), tail(), last(), last(), add(java.lang.Object) - person CptanPanic; 20.07.2017