Как использовать типы сборки (отладка или выпуск) для установки разных стилей и имен приложений?

Фон

В Android Studio у вас могут быть разные типы сборки, каждая из которых имеет свою собственную конфигурацию, похожую на вкус продукта (как показано здесь)

Эта проблема

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

Для этого, я думаю, я могу использовать файл build.gradle:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        debuggable true
    }
}

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

Я обнаружил, что могу использовать "resValue" (узнал об этом здесь), но по какой-то причине, что бы я ни делал, он не скомпилируется:

  • Если ресурс уже был объявлен (например, в имени приложения, которое переведено), он говорит, что ресурс дублируется.
  • Если ресурс не был объявлен, я не могу связаться с ним через code/xml.

Вопрос

Как использовать разные значения ресурсов для типов сборки, даже если они уже существуют?


person android developer    schedule 16.05.2015    source источник
comment
Где определены эти типы сборки debug, release. Я не могу найти описание в документах DSL.   -  person Zingam    schedule 29.04.2017
comment
@Zingam Вы увидите buildTypes в файле gradle всякий раз, когда создаете новый проект.   -  person android developer    schedule 30.04.2017


Ответы (2)


Как использовать разные значения ресурсов для типов сборки, даже если они уже существуют?

Они уже существуют в исходном наборе main. Добавьте другие исходные наборы для других интересующих вас типов сборки, где вы переопределяете нужные ресурсы.

Например, в этом примере проекта у меня есть main исходный набор и исходный набор debug. Оба имеют строковый ресурс app_name в res/values/strings.xml, но с разными значениями. В сборке debug будет использоваться версия исходного набора debug ресурса; в любой другой сборке (например, release) исходный набор debug полностью игнорируется, и используется версия исходного набора main ресурса.

Обратите внимание, что у меня нет исходного набора release. В частности, при переопределении ресурсов это совершенно нормально — вам нужен исходный набор только для типа сборки, когда вы хотите что-то изменить для этого типа сборки, а не для каждого типа сборки, который вы используете.

person CommonsWare    schedule 16.05.2015
comment
То есть вы имеете в виду, что мне не нужно использовать buildTypes в файле build.gradle для этой задачи, а просто поместить файлы ресурсов в папки каждого типа сборки? В папке src, один в основной и один в папках отладки? - person android developer; 16.05.2015
comment
@androiddeveloper: Для встроенных типов сборки debug и release да. Вы также можете изобретать свои собственные типы сборки, если это необходимо, и для этого вам нужно будет использовать build.gradle (для определения типов) в дополнение к наборам источников (для предоставления альтернативных входных данных для сборки, таких как заменяющие версии ресурсов). - person CommonsWare; 16.05.2015
comment
Я понимаю. Хоть мне это и не нужно (ну, по крайней мере сейчас), не подскажете, как установить другую папку для другого типа сборки, который вы сами создаете? Кроме того, работает ли та же операция (поместить файлы в эти папки) и для java-файлов (я предполагаю, что это не так)? - person android developer; 16.05.2015
comment
Кроме того, для чего именно используется resValue? - person android developer; 16.05.2015
comment
@androiddeveloper: не могли бы вы сказать мне, как установить другую папку для другого типа сборки, который вы создаете сами? -- см. mezzanine в build.gradle примера приложения, на которое я ссылался. работает ли та же операция (помещения файлов в эти папки) и для java-файлов - да, за исключением того, что вы не можете заменить классы Java, определенные в другом исходном наборе (например, main). для чего именно используется resValue? -- это было бы для случаев, когда вы хотите определить (а не заменить) ресурс на основе вычислений, сделанных в build.gradle. - person CommonsWare; 16.05.2015
comment
Насчет мезонина, я не вижу папки, которая была создана для него, поэтому, возможно, я недостаточно ясно выразился: я имел в виду, как вы готовите папку для нового типа сборки? О Java я думал так: переопределение классов (точный путь к классу) невозможно. Имеет смысл. Что касается resValue, это кажется редкостью, может быть, для кода версии (например, основанного на текущем времени)? - person android developer; 16.05.2015
comment
@androiddeveloper: я имел в виду, как вы готовите папку для нового типа сборки? -- гм, mkdir? Я имею в виду, что вы создаете каталог с именем mezzanine так же, как вы создаете каталог с именем debug. Единственное отличие состоит в том, что вы должны сообщить Gradle о существовании mezzanine, что делается в build.gradle. это кажется редкостью - согласен. - person CommonsWare; 16.05.2015
comment
Насчет мезонина, ок, я подумал, что вам нужно указать его в файле build.gradle, так как остальные были по умолчанию (например, нет папки с именем релиз). - person android developer; 16.05.2015
comment
@androiddeveloper: И вы это делаете, как я указал -and-app-names/30279350?noredirect=1#comment48657206_30279350">здесь и здесь. Цитируя предыдущий комментарий, вы также можете изобретать свои собственные типы сборки, если это необходимо, и для этого вам нужно будет использовать build.gradle (для определения типов) в дополнение к исходным наборам... - person CommonsWare; 16.05.2015
comment
хорошо, извините. вероятно, пропустил ту часть, что дополнительные папки называются наборами источников (правильно?). - person android developer; 16.05.2015
comment
@androiddeveloper: В исходном обсуждении main и debug называются наборами исходников. Это термин Gradle (хотя я думаю, что Maven может использовать его и для своей системы сборки). - person CommonsWare; 16.05.2015
comment
Еще раз спасибо. Теперь я отметил ваш ответ. Вы молодец и вам терпения! - person android developer; 16.05.2015
comment
Я думаю, что в Android-Studio есть ошибка с этой функцией. Сначала он работал, как и ожидалось, но когда я изменил значения (одного логического ресурса), а затем обратно, он действует так, как будто сборка отладки похожа на сборку выпуска. Придется проверить это дальше и, возможно, создать POC. Могу ли я показать вам эту проблему, если я смогу воспроизвести ее? - person android developer; 17.05.2015
comment
@androiddeveloper: Если вы зарегистрируете проблему на b.android.com, рассмотрите возможность ссылки на нее здесь. - person CommonsWare; 17.05.2015
comment
Не могу воспроизвести на POC. Может быть, я просто сделал что-то не так. В любом случае, спасибо. - person android developer; 18.05.2015
comment
Я установил свой URL-адрес в файле сборки для типа сборки отладки, возможно ли каким-то образом перепроектировать файл сборки и показать мой URL-адрес, который мне не нужен, или мой URL-адрес, определенный в типе сборки отладки, будет раскрыт, если я загрузите релиз apk в playstore. - person Aman Verma; 10.11.2018
comment
@AmanVerma: отображается ли мой URL-адрес, определенный в типе отладочной сборки, если я загружаю релизный apk в playstore. -- если вы сделали это правильно, этот URL не будет существовать в выпуске APK. - person CommonsWare; 10.11.2018
comment
debug {отлаживаемый true applicationIdSuffix .debug строка resValue, BASE_URL, строка resValue 'Mytesting URL', app_name, UAT APP} - person Aman Verma; 10.11.2018
comment
@AmanVerma: этот URL-адрес не должен существовать в release APK, если это единственное место, где вы определили этот URL-адрес. - person CommonsWare; 10.11.2018
comment
Ага. Это единственное место, где я установил URL. Однако, если я ищу этот конкретный URL-адрес, я нахожу его еще в одном месте, которое называется debug\..\generated. Я думаю, что он генерируется автоматически и не будет виден в выпуске APK или нет? - person Aman Verma; 10.11.2018
comment
@AmanVerma: содержимое каталога debug в каталоге build не включается в release APK. Если у вас есть дополнительные вопросы, задайте отдельный вопрос о переполнении стека. - person CommonsWare; 10.11.2018
comment
@CommonsWare Я уже задавал этот вопрос, но никто не ответил... это ссылка... stackoverflow.com/questions/53232057/ - person Aman Verma; 10.11.2018

В File|Project Structure|app|Flavors у нас есть:

Version Name: 1.3

В файле ресурсов Strings у нас есть:

<string name="app_name">MyAppTitle</string>

В «onCreate» класса MainActivity:

...
//add version to application title
int versionCode = BuildConfig.VERSION_CODE; // unused in my application
String versionName = BuildConfig.VERSION_NAME;
this.setTitle(this.getTitle() + " v"+  versionName);
...

Результат "MyAppTitle v1.3"

person Piero    schedule 15.08.2016
comment
Это не изменяет значение ресурса для отладки и выпуска. Не то, о чем я спрашивал - person android developer; 16.08.2016
comment
как это связано? OP хочет установить разные типы сборки, и имя приложения должно быть установлено по-разному для каждого типа сборки. - person sziraqui; 23.01.2018