Android + Gradle: Лучшее место для установки динамических архивовBaseName

В нашем Android-проекте мы хотим, чтобы имя нашего APK содержало такую ​​информацию, как дата, git имя ветки и короткий хеш-код.

Мы установили это как часть нашего defaultConfig

android {
   defaultConfig {
      setProperty("archivesBaseName", "$projectName.$branchName.$date.$buildNumber.$versionCode-$versionName-$versionSha")    
   }
}

Это работает большую часть времени, но наша сборка иногда терпит неудачу с ошибками, указывающими на то, что значение устарело (например, после переключения ветвей). Принуждение Gradle Синхронизация в Android Studio обычно исправляет его.

Итак, есть ли лучший, более надежный способ убедиться, что свойство остается в актуальном состоянии и при необходимости синхронизирует Gradle?

Ответ 1

попробуйте вызвать clean.execute() до

android { ... }

это самая дешевая "синхронизация", о которой я могу думать:)

   clean.execute()
   android {
       defaultConfig {
          setProperty("archivesBaseName", "$projectName.$branchName.$date.$buildNumber.$versionCode-$versionName-$versionSha")    
       }
    }

Ответ 2

Если во время процесса сборки возникла ошибка, появится окно "Сообщения", чтобы описать проблему. Gradle может рекомендовать некоторые параметры командной строки, которые помогут вам решить проблему, например, --stacktrace или --debug. Чтобы использовать параметры командной строки в процессе сборки:

  • Откройте диалоговое окно "Настройки или настройки": в Windows или Linux выберите Файл > Настройки в главном меню.
  • Перейдите к сборке, выполнению, развертыванию > Компилятор.
  • В текстовом поле рядом с параметрами командной строки введите параметры командной строки.
  • Нажмите OK, чтобы сохранить и выйти.

Gradle применит эти параметры командной строки в следующий раз, когда вы попытаетесь создать приложение.

Я взял информацию из эту страницу.

Ответ 3

У меня была одна и та же проблема, они не всегда соответствовали сборке.

Я решил это, используя:

project.ext.set("archivesBaseName", "myAppName"); 

в блоке defaultConfig, и у меня возникла проблема.

Не уверен, что он будет работать для ветки, номера сборки или даты, но стоит сделать это. Здесь мои конфиги, включая блок DefaultConfig. Для моего случая я использовал только жестко закодированное имя versionName и build Number (я называю его versionCode, потому что я его динамически устанавливал). Но, возможно, вы можете настроить его на свои нужды:

defaultConfig {
    minSdkVersion 15
    targetSdkVersion 22

    versionCode System.getenv("BUILD_NUMBER") as Integer ?: 0

    versionName "6.2.5." + versionCode

}
project.ext.set("archivesBaseName", "myAppname" + defaultConfig.versionName);