Ответ 1
Это нормально, хотя и неудачно.
Когда Studio открывает проект, он запрашивает Gradle для модели проекта. Сюда входит список модулей и каждого модуля, их исходные папки, их зависимости и вывод их сборки. В этом случае APK.
Итак, когда Studio-запросы Gradle для модели, наш плагин построит модель, которая включает в себя запуск вашего пользовательского кода, который переименовывает имя файла APK. Затем он отправляется в Studio, который записывает его.
Однако всякий раз, когда вы строите, Studio будет сообщать Gradle, но не передавать ему никакой другой информации. Gradle снова заново создаст модель и снова запустит ваш код.
Это означает, что при каждой сборке имя файла APK отличается (так как имя файла APK содержит дату для второго), но ни один из них не соответствует имени файла, созданного во время импорта проекта. Это приведет к отказу развертывания.
Сейчас нет способа иметь Gradle отправить Studio имя файла сгенерированного APK.
Изменить: лучший способ сделать это - сохранить текущий вывод, но скопировать его в новый файл для сохранения.
Я бы сделал что-то вроде этого:
android.applicationVariants.all { variant ->
def file = variant.output
// create the new task
def copyTask = project.tasks.create("copy${variant.name}Apk", Copy)
copyTask.from = file
copyTask.into = file.parent
copyTask.rename("app-", getDate() + "_myapp_" + getGitCommit() +"_")
// set up task dependencies
// first make the assemble task depend on copyTask to make sure it gets called.
variant.assemble.dependsOn copyTask
// then make copyTask depend on the actual packaging task.
copyTask.dependsOn variant.packageApplication
}
Обратите внимание, что задача копирования ожидает, что папка будет назначена, поэтому мы должны использовать правило переименования.