Если вы работаете над большим Android-проектом, вы знаете, насколько мучительной может быть длительная сборка. Любая настройка, которая может сократить время сборки, экономит много часов разработчика, особенно для ваших локальных сборок. Если ваше приложение поддерживает более одного языка, вы можете сократить это время, пропустив обработку ресурсов для языков, которые вам не нужны во время разработки. Android поддерживает удаление неиспользуемых альтернативных ресурсов во время сборки с помощью свойства resConfigs. При работе над приложением вам, вероятно, понадобится один язык для проверки работоспособности функций; другие просто занимают время и место в вашей сборке.

Добавление resConfigs в ваш проект

На самом деле добавить resConfigs в ваш проект очень просто. Укажите языки, которые не хотите отфильтровать из своей сборки, в блоке конфигурации Android по умолчанию в build.gradle файле модуля приложения. Например, чтобы отфильтровать все альтернативные ресурсы не на английском языке, добавьте следующее:

Однако, как только вы отметите это изменение, это затронет всех: других разработчиков, вашу систему CI и даже ваши производственные выпуски. Это изменение невозможно сделать для любого приложения, которое должно поддерживать несколько языков. Итак, как можно обойти это ограничение?

Делаем resConfigs настраиваемым

Вам необходимо разрешить каждой сборке указывать, какие языки, если таковые имеются, она хочет отфильтровать. Свойство resConfigs должно быть настраиваемым на основе настроек конкретного разработчика (т. Е. Настроек, которые не зарегистрированы в системе управления версиями).

Сначала добавьте новое свойство Gradle в место, которое не зарегистрировано, но выбирается системой сборки. Для этого хорошо подходит ваш gradle.properties файл пользовательского уровня. Посмотрите, где этот файл существует в вашей системе. Я назвал новое свойство supportedResConfigs:

Укажите языки, которые вы хотите поддерживать, добавив список кодов языков, разделенных запятыми. Это может быть как вам угодно, так и коротко. Вы также можете закомментировать эту строку, если не хотите фильтровать какие-либо ресурсы.

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

Это создает новое свойство с именем supportedResConfigs, которое либо null, если свойство Gradle не определено, либо представляет собой список, содержащий все языки, которые вы хотите поддерживать.

Наконец, укажите это свойство при указании resConfigs:

Не забудьте применить buildTasks.gradle (или как вы его называете), если вы включили этот код в отдельный файл.

После добавления этот код позволяет каждому отдельному разработчику указать языки, которые он хочет поддерживать в своих локальных сборках. Это также позволяет вашей системе CI и другим сборкам, не предназначенным для разработчиков, полностью игнорировать свойство resConfigs и включать все языки.

Дополнительные параметры resConfigs

resConfigs управляет не только языковыми ресурсами, включенными в вашу сборку. Вы можете ссылаться на значения для любого квалификатора ресурса. Мы обсудили фильтрацию ненужных языков, но что, если вы также хотите отфильтровать элементы для рисования в темном режиме? Или не включать ландшафтные макеты? Или, может быть, по какой-то причине все сразу?

Этот фрагмент отфильтровывает все альтернативные ресурсы из папки ресурсов с любым квалификатором не-en языка, любым квалификатором не-notnight ночного режима и любым квалификатором ориентации, отличным от port. У вас есть ресурсы, которые вы хотите включить в en-night папку? Очень жаль! Несмотря на то, что это ресурсы на английском языке, они исключаются из-за квалификатора night. Как упоминалось ранее, список значений может быть сколь угодно обширным и бессмысленным. Но пока это можно настроить, это ни на кого не повлияет.

Шон работает в Livefront, где все настраивается.