Android Studio не запускает приложение после сборки при использовании метки времени в названии

У меня проблема с gradle и Android Studio, которая появляется только при создании в Android Studio (отлично работает BuildServer и Commandline)

applicationVariants.all { variant ->
            def file = variant.outputFile
            variant.outputFile = new File(file.parent, file.name.replace("app-", getDate() + "_myapp_" + getGitCommit() +"_"));
        }

def getDate() {
        def dateNow = new Date()
        def formattedDate = dateNow.format('yyyy-MM-dd_HH-mm-ss')
        return formattedDate
}

Работает сборка, но когда AS хочет скопировать apk на устройство, она выдает ошибку Local path doesn't exist..

Проблема заключается в том, что создаваемые файлы выглядят следующим образом:

2014-03-17_16-17-41_myapp__debug-unaligned.apk

но AS ищет:

2014-03-17_16-17-18_myapp__debug-unaligned.apk

который каким-то образом сгенерирован AS-специфическим этапом сборки, что приводит к перерасчету даты. Я попытался исправить его с помощью внешнего свойства для даты сборки, которое должно оставаться неизменным на протяжении всего процесса сборки, но, вероятно, из-за отсутствия навыков gradle это не помогло.

Возможно, у кого-то есть обходной путь для меня, чтобы моя работа по созданию в Android Studio.

Ответ 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
}

Обратите внимание, что задача копирования ожидает, что папка будет назначена, поэтому мы должны использовать правило переименования.