Spec-Zone.ru › Bazel 7.0

Android Правила

Правила

  • android_binary
  • aar_import
  • android_library
  • android_instrumentation_test
  • android_local_test
  • android_device
  • android_ndk_repository
  • android_sdk_repository

android_binary

android_binary(name, deps, srcs, assets, assets_dir, compatible_with, crunch_png, custom_package, debug_key, debug_signing_keys, debug_signing_lineage_file, densities, deprecation, dex_shards, dexopts, distribs, enable_data_binding, exec_compatible_with, exec_properties, features, incremental_dexing, instruments, javacopts, key_rotation_min_sdk, licenses, main_dex_list, main_dex_list_opts, main_dex_proguard_specs, manifest, manifest_values, multidex, nocompress_extensions, package_id, plugins, proguard_apply_dictionary, proguard_apply_mapping, proguard_generate_mapping, proguard_specs, resource_configuration_filters, resource_files, restricted_to, shrink_resources, tags, target_compatible_with, testonly, visibility)

Создаёт файлы пакетов приложений Android (.apk).

Неявные целевые выходные данные

  • name.apk: Пакет приложений Android, подписанный отладочными ключами и zipaligned. Он может быть использован для разработки и отладки вашего приложения. Вы не можете распространять приложение, подписанное отладочными ключами.
  • name_unsigned.apk: Неподписанная версия вышеуказанного файла, которая может быть подписана релизными ключами перед публикацией.
  • name_deploy.jar: Java-архив, содержащий транзитивное замыкание этой цели.

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

  • name_proguard.jar: Java-архив, содержащий результат выполнения ProGuard на name_deploy.jar. Этот вывод генерируется только в том случае, если указан атрибут proguard_specs.
  • name_proguard.map: Файл сопоставления, результат выполнения ProGuard на name_deploy.jar. Этот вывод генерируется только в том случае, если указан атрибут proguard_specs и заданы proguard_generate_mapping или shrink_resources.

Примеры

Примеры правил Android можно найти в директории examples/android дерева исходного кода Bazel.

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

deps

Список метки; значение по умолчанию []

Список других библиотек, которые должны быть подключены к целевому бинарному файлу. Разрешенные типы библиотек: android_library, java_library с ограничением android и cc_library обертывания или создания .so нативных библиотек для платформы Android.
srcs

Список меток; значение по умолчанию []

Список исходных файлов, которые обрабатываются для создания цели.

srcs файлы типа .java компилируются. Для удобства чтения не следует помещать имя сгенерированного .java исходного файла в srcs. Вместо этого поместите имя зависящего правила в srcs, как описано ниже.

srcs файлы типа .srcjar распаковываются и компилируются. (Это полезно, если вам нужно сгенерировать набор файлов .java с помощью genrule или расширения build.)

assets

Список меток; значение по умолчанию []

Список ресурсов, которые должны быть упакованы. Как правило, это glob всех файлов в каталоге assets. Вы также можете ссылаться на другие правила (любое правило, которое создает файлы) или экспортированные файлы в других пакетах, при условии, что все эти файлы находятся в каталоге assets_dir соответствующего пакета.
assets_dir

Строка; значение по умолчанию ""

Строка, указывающая путь к файлам в assets. Пара assets и assets_dir описывает упакованные ресурсы, и оба атрибута должны быть указаны, либо ни один из них.
crunch_png

Булево; значение по умолчанию True

Выполнять сжатие PNG (или нет). Это независимо от обработки девятипанельных изображений, которая всегда выполняется. Это устаревший обходной путь для ошибки aapt, который исправлен в aapt2. ссылка на ошибку
custom_package

Строка; значение по умолчанию ""

Пакет Java, для которого будут сгенерированы исходные файлы Java. По умолчанию пакет определяется по каталогу, содержащему файл BUILD с правилом. Вы можете указать другой пакет, но это крайне не рекомендуется, поскольку это может привести к конфликтам с другими библиотеками, которые будут обнаружены только во время выполнения.
debug_key

Метка; значение по умолчанию "@bazel_tools//tools/android:debug_keystore"

Файл, содержащий хранилище ключей отладки, которое будет использоваться для подписи отладочного APK. Обычно не рекомендуется использовать ключ, отличный от стандартного, поэтому этот атрибут следует опустить.

ПРЕДУПРЕЖДЕНИЕ: Не используйте свои производственные ключи, они должны быть строго защищены и не должны храниться в дереве исходных кодов.

debug_signing_keys

Список меток; значение по умолчанию []

Список файлов, хранилищ ключей отладки, которые будут использоваться для подписи отладочного APK. Обычно не рекомендуется использовать ключи, отличные от стандартного ключа, поэтому этот атрибут следует опустить.

ПРЕДУПРЕЖДЕНИЕ: Не используйте свои производственные ключи, они должны быть строго защищены и не должны храниться в дереве исходных кодов.

debug_signing_lineage_file

Метка; значение по умолчанию None

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

ПРЕДУПРЕЖДЕНИЕ: Не используйте свои производственные ключи, они должны быть строго защищены и не должны храниться в дереве исходных кодов.

densities

Список строк; значение по умолчанию []

Плотности для фильтрации при построении APK. Это позволит удалить растровые ресурсы drawable, которые не будут загружаться устройством с указанными плотностями экрана, чтобы уменьшить размер APK. Соответствующий раздел compatible-screens также будет добавлен в манифест, если он еще не содержит перечисление супермножества.
dex_shards

Целое число; значение по умолчанию 1

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

Обратите внимание, что каждый фрагмент приведет к появлению по крайней мере одного dex в конечном приложении. По этой причине не рекомендуется устанавливать это значение более 1 для релизных бинарных файлов.

dexopts

Список строк; значение по умолчанию []

Дополнительные параметры командной строки для инструмента dx при генерации classes.dex. Подлежат замене "переменных make" и разбору токенов оболочки Bourne.
enable_data_binding

Булево; значение по умолчанию False

Если true, это правило обрабатывает выражения связывания данных в ресурсах макета, включенных через атрибут resource_files. Без этого параметра выражения связывания данных приводят к ошибкам сборки.

Для построения приложения Android с использованием связывания данных необходимо также сделать следующее:

  1. Установите этот атрибут для всех правил Android, которые транзитивно зависят от этого. Это связано с тем, что зависимые правила наследуют выражения связывания данных правила через объединение ресурсов. Поэтому им также необходимо строиться с использованием связывания данных для разбора этих выражений.
  2. Добавьте запись deps = для библиотеки времени выполнения связывания данных во все цели, которые установили этот атрибут. Местоположение этой библиотеки зависит от вашей настройки репозитория.
incremental_dexing

Целое число; неконфигурируемый; значение по умолчанию -1

Принудительно устанавливает, с использованием или без инкрементальной дезинтеграции, перезаписывая значения по умолчанию и флаг --incremental_dexing.
instruments

Метка; значение по умолчанию None

Целевая цель для инструментации.

Если этот атрибут установлен, это android_binary будет рассматриваться как приложение для тестирования инструментации. Цель android_binary затем может указать эту цель в атрибуте test_app.

javacopts

Список строк; значение по умолчанию []

Дополнительные параметры компилятора для этой цели. Подлежат замене "переменных make" и разбору токенов оболочки Bourne.

Эти параметры компилятора передаются в javac после глобальных параметров компилятора.

key_rotation_min_sdk

Строка; значение по умолчанию ""

Устанавливает минимальную версию платформы Android (уровень API), для которой следует использовать ключ подписи APK, повернутый на новые значения, для генерации подписи APK. Исходный ключ подписи APK будет использоваться для всех предыдущих версий платформы.
main_dex_list

Метка; значение по умолчанию None

Текстовый файл содержит список имен файлов class. Классы, определенные этими файлами, помещаются в primary classes.dex. например:
          android/support/multidex/MultiDex$V19.class
          android/support/multidex/MultiDex.class
          android/support/multidex/MultiDexApplication.class
          com/google/common/base/Objects.class
                    
Должен использоваться с multidex="manual_main_dex".
main_dex_list_opts

Список строк; значение по умолчанию []

Параметры командной строки, которые передаются создателю списка main dex. Используйте этот параметр для влияния на включенные в список main dex классы.
main_dex_proguard_specs

Список меток; значение по умолчанию []

Файлы, используемые в качестве спецификаций Proguard для определения классов, которые должны сохраняться в главном dex. Допускается только если атрибут multidex установлен в legacy.
manifest

Метка; обязательно

Имя файла манифеста Android, обычно AndroidManifest.xml. Должен быть определен, если определены resource_files или assets.
manifest_values

Словарь: Строка -> Строка; значение по умолчанию {}

Словарь значений, которые нужно переопределить в манифесте.

Любой экземпляр ${name} в манифесте будет заменен значением, соответствующим имени в этом словаре.

applicationId, versionCode, versionName, minSdkVersion, targetSdkVersion и maxSdkVersion также переопределят соответствующие атрибуты в манифесте и uses-sdk теги.

packageName будет проигнорирован и будет установлен либо из applicationId при указании, либо из пакета в манифесте.

Когда manifest_merger установлено в legacy, только applicationId, versionCode и versionName будут иметь какое-либо влияние.

multidex

Строка; значение по умолчанию "native"

Необходимо ли разделить код на несколько файлов dex.
Возможные значения:
  • native: Разделить код на несколько файлов dex при превышении лимита индекса dex 64K. Предполагается поддержка загрузки классов multidex во время выполнения нативной платформой. Работает только с Android L и новее.
  • legacy: Разделить код на несколько файлов dex при превышении лимита индекса dex 64K. Предполагается, что классы multidex загружаются кодом приложения (т. е. нет поддержки нативной платформы).
  • manual_main_dex: Разделить код на несколько файлов dex при превышении лимита индекса dex 64K. Содержимое основного файла dex необходимо указать, предоставив список классов в текстовом файле с помощью атрибута main_dex_list.
  • off: Скомпилировать весь код в один файл dex, даже если он превышает лимит индекса.
nocompress_extensions

Список строк; значение по умолчанию []

Список расширений файлов, которые следует оставить не сжатыми в apk.
package_id

Целое число; значение по умолчанию 0

Идентификатор пакета, который будет назначен ресурсам в этом двоичном файле.

См. аргумент --package-id AAPT2 для получения дополнительной информации. Обычно его можно (и следует) оставить без значения, в результате чего будет установлено значение по умолчанию 127 (0x7F).

plugins

Список метки; значение по умолчанию []

Плагины компилятора Java, которые необходимо выполнить во время компиляции. Каждый java_plugin указанный в атрибуте plugins, будет выполнен при каждом построении этой цели. Ресурсы, сгенерированные плагином, будут включены в результирующий jar целевого объекта.
proguard_apply_dictionary

Метка; значение по умолчанию None

Файл, который будет использоваться в качестве отображения для прогаарда. Разделенный по строкам файл «слов» для использования при переименовании классов и членов во время обфускации.
proguard_apply_mapping

Метка; значение по умолчанию None

Файл, который будет использоваться в качестве отображения для прогаарда. Файл отображения, сгенерированный proguard_generate_mapping, для повторного использования для применения того же отображения к новому построению.
proguard_generate_mapping

Булево значение; неконфигурируемый; значение по умолчанию False

Необходимо ли генерировать файл отображения Proguard. Файл отображения будет сгенерирован только если указан proguard_specs. Этот файл будет перечислять отображение между исходными и замаскированными именами классов, методов и полей.

ПРЕДУПРЕЖДЕНИЕ: Если этот атрибут используется, спецификация Proguard не должна содержать ни -dontobfuscate, ни -printmapping.

proguard_specs

Список меток; значение по умолчанию []

Файлы, которые будут использоваться в качестве спецификации Proguard. Этот файл будет описывать набор спецификаций, которые будут использоваться Proguard.
resource_configuration_filters

Список строк; значение по умолчанию []

Список фильтров конфигурации ресурсов, таких как 'en', которые ограничат ресурсы в apk только теми, которые находятся в конфигурации 'en'. Для активации псевдолокализации включите псевдолокальные ресурсы en_XA и/или ar_XB.
resource_files

Список меток; значение по умолчанию []

Список ресурсов, которые должны быть упакованы. Обычно это glob всех файлов в каталоге res.
Сгенерированные файлы (из genrules) также могут быть указаны здесь с помощью Метки. Единственное ограничение заключается в том, что выходные данные, сгенерированные в результате, должны находиться в том же каталоге «res», что и любые другие файлы ресурсов, которые включены.
shrink_resources

Целое число; значение по умолчанию -1

Необходимо ли выполнять сжатие ресурсов. Ресурсы, которые не используются двоичным файлом, будут удалены из APK. Это поддерживается только для правил, использующих локальные ресурсы (т.е. атрибуты manifest и resource_files) и требует ProGuard. Он работает примерно так же, как и сжиматель ресурсов Gradle (https://developer.android.com/studio/build/shrink-code.html#shrink-resources).

Существенные различия:

  • ресурсы в values/ также будут удалены, а также основанные на файлах ресурсы
  • использует strict mode по умолчанию
  • удаление неиспользуемых ресурсов ID поддерживается только с aapt2
Если сжатие ресурсов включено, name_files/resource_shrinker.log также будет сгенерирован, содержа в себе анализ и удаленные элементы.

Возможные значения:

  • shrink_resources = 1: Включает сжатие ресурсов Android
  • shrink_resources = 0: Отключает сжатие ресурсов Android
  • shrink_resources = -1: Сжатие контролируется флагом --android_resource_shrinking.

aar_import

aar_import(name, deps, data, aar, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exports, features, licenses, restricted_to, srcjar, tags, target_compatible_with, testonly, visibility)

Это правило позволяет использовать файлы .aar в качестве библиотек для правил android_library и android_binary.

Примеры

    aar_import(
        name = "google-vr-sdk",
        aar = "gvr-android-sdk/libraries/sdk-common-1.10.0.aar",
    )

    android_binary(
        name = "app",
        manifest = "AndroidManifest.xml",
        srcs = glob(["**.java"]),
        deps = [":google-vr-sdk"],
    )

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

aar

Метка; обязательно

Файл .aar для предоставления целям Android, которые зависят от этой цели.
exports

Список меток; значение по умолчанию []

Цели для экспорта в правила, которые зависят от этого правила. См. java_library.exports.
srcjar

Метка; значение по умолчанию None

JAR-файл, содержащий исходный код для скомпилированных JAR-файлов в AAR.

android_library

android_library(name, deps, srcs, data, assets, assets_dir, compatible_with, custom_package, deprecation, distribs, enable_data_binding, exec_compatible_with, exec_properties, exported_plugins, exports, exports_manifest, features, idl_import_root, idl_parcelables, idl_preprocessed, idl_srcs, javacopts, licenses, manifest, neverlink, plugins, proguard_specs, resource_files, restricted_to, tags, target_compatible_with, testonly, visibility)

Это правило компилирует и архивирует свои исходные данные в файл .jar. Библиотека Android Runtime android.jar неявным образом добавляется в путь компиляции классов.

Неявные целевые объекты вывода

  • libname.jar: Java архив.
  • libname-src.jar: Архив, содержащий исходные коды («исходный jar»).
  • name.aar: Android 'aar' пакет, содержащий Java архив и ресурсы этой цели. Он не содержит транзитивную замыкание.

Примеры

Примеры правил Android можно найти в каталоге examples/android дерева исходных кодов Bazel.

Следующий пример демонстрирует, как установить idl_import_root. Пусть //java/bazel/helloandroid/BUILD содержит:

android_library(
    name = "parcelable",
    srcs = ["MyParcelable.java"], # bazel.helloandroid.MyParcelable

    # MyParcelable.aidl will be used as import for other .aidl
    # files that depend on it, but will not be compiled.
    idl_parcelables = ["MyParcelable.aidl"] # bazel.helloandroid.MyParcelable

    # We don't need to specify idl_import_root since the aidl file
    # which declares bazel.helloandroid.MyParcelable
    # is present at java/bazel/helloandroid/MyParcelable.aidl
    # underneath a java root (java/).
)

android_library(
    name = "foreign_parcelable",
    srcs = ["src/android/helloandroid/OtherParcelable.java"], # android.helloandroid.OtherParcelable
    idl_parcelables = [
        "src/android/helloandroid/OtherParcelable.aidl" # android.helloandroid.OtherParcelable
    ],

    # We need to specify idl_import_root because the aidl file which
    # declares android.helloandroid.OtherParcelable is not positioned
    # at android/helloandroid/OtherParcelable.aidl under a normal java root.
    # Setting idl_import_root to "src" in //java/bazel/helloandroid
    # adds java/bazel/helloandroid/src to the list of roots
    # the aidl compiler will search for imported types.
    idl_import_root = "src",
)

# Here, OtherInterface.aidl has an "import android.helloandroid.CallbackInterface;" statement.
android_library(
    name = "foreign_interface",
    idl_srcs = [
        "src/android/helloandroid/OtherInterface.aidl" # android.helloandroid.OtherInterface
        "src/android/helloandroid/CallbackInterface.aidl" # android.helloandroid.CallbackInterface
    ],

    # As above, idl_srcs which are not correctly positioned under a java root
    # must have idl_import_root set. Otherwise, OtherInterface (or any other
    # interface in a library which depends on this one) will not be able
    # to find CallbackInterface when it is imported.
    idl_import_root = "src",
)

# MyParcelable.aidl is imported by MyInterface.aidl, so the generated
# MyInterface.java requires MyParcelable.class at compile time.
# Depending on :parcelable ensures that aidl compilation of MyInterface.aidl
# specifies the correct import roots and can access MyParcelable.aidl, and
# makes MyParcelable.class available to Java compilation of MyInterface.java
# as usual.
android_library(
    name = "idl",
    idl_srcs = ["MyInterface.aidl"],
    deps = [":parcelable"],
)

# Here, ServiceParcelable uses and thus depends on ParcelableService,
# when it's compiled, but ParcelableService also uses ServiceParcelable,
# which creates a circular dependency.
# As a result, these files must be compiled together, in the same android_library.
android_library(
    name = "circular_dependencies",
    srcs = ["ServiceParcelable.java"],
    idl_srcs = ["ParcelableService.aidl"],
    idl_parcelables = ["ServiceParcelable.aidl"],
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этого целевого объекта.

deps

Список метки; по умолчанию []

Список других библиотек для линковки. Разрешенные типы библиотек: android_library, java_library с ограничением android и cc_library обертывание или создание .so нативных библиотек для платформы Android.
srcs

Список метки; по умолчанию []

Список .java или .srcjar файлов, которые обрабатываются для создания целевого объекта.

srcs файлы типа .java компилируются. Для удобочитаемости не стоит включать имя сгенерированного .java исходного файла в srcs. Вместо этого укажите имя зависимой правила в srcs, как описано ниже.

srcs файлы типа .srcjar распаковываются и компилируются. (Это полезно, если вам нужно сгенерировать набор файлов .java с помощью genrule или расширения сборки.)

Если srcs опущено, то любая зависимость, указанная в deps экспортируется из этого правила (см. экспорт java_library для получения дополнительной информации об экспорте зависимостей). Однако это поведение скоро будет устаревать; старайтесь не полагаться на него.

assets

Список метки; по умолчанию []

Список ресурсов для упаковки. Обычно это glob всех файлов в каталоге assets. Вы также можете ссылаться на другие правила (любое правило, которое создаёт файлы) или экспортированные файлы в других пакетах, при условии, что все эти файлы находятся в каталоге assets_dir соответствующего пакета.
assets_dir

Строка; по умолчанию ""

Строка, указывающая путь к файлам в assets. Пара assets и assets_dir описывают упакованные ресурсы, и оба атрибута должны быть указаны или ни один из них.
custom_package

Строка; по умолчанию ""

Пакет Java, для которого будут сгенерированы Java-источники. По умолчанию пакет определяется по каталогу, где находится файл BUILD, содержащий правило. Вы можете указать другой пакет, но это крайне не рекомендуется, так как это может привести к конфликтам в классе с другими библиотеками, которые будут обнаружены только во время выполнения.
enable_data_binding

Булево значение; по умолчанию False

Если true, это правило обрабатывает выражения привязки данных в ресурсах макета, включённых через атрибут resource_files. Без этого параметра выражения привязки данных вызывают ошибки сборки.

Для сборки приложения Android с привязкой данных вам также необходимо выполнить следующие действия:

  1. Установите этот атрибут для всех правил Android, которые транзитивно зависят от этого. Это связано с тем, что зависимые правила наследуют выражения привязки данных правила через слияние ресурсов. Таким образом, им также требуется сборка с привязкой данных для анализа этих выражений.
  2. Добавьте запись deps = для библиотеки времени выполнения привязки данных ко всем целевым объектам, которые установили этот атрибут. Расположение этой библиотеки зависит от вашей настройки хранилища.
exported_plugins

Список метки; по умолчанию []

Список java_plugin (например, процессоров аннотаций), которые нужно экспортировать в библиотеки, которые напрямую зависят от этой библиотеки.

Указанный список java_plugin будет применяться к любой библиотеке, которая напрямую зависит от этой библиотеки, так же, как если бы эта библиотека явно объявила эти метки в plugins.

exports

Список метки; по умолчанию []

Замкнутое множество всех правил, достижимых через атрибуты exports, считаются прямыми зависимостями любого правила, которое напрямую зависит от целевого объекта с exports.

exports не являются прямыми зависимостями правила, к которому они относятся.

exports_manifest

Целое число; по умолчанию 1

Экспортировать ли записи манифеста в android_binary целевые объекты, которые зависят от этого целевого объекта. uses-permissions атрибуты никогда не экспортируются.
idl_import_root

Строка; по умолчанию ""

Путь, относительный к пакету, к корню дерева пакетов Java, содержащих исходные idl-файлы, включенные в эту библиотеку.

Этот путь будет использоваться в качестве корня импорта при обработке исходных файлов idl, которые зависят от этой библиотеки.

Когда idl_import_root указан, оба idl_parcelables и idl_srcs должны находиться в пути, указанном пакетом Java объекта, который они представляют, в idl_import_root. Когда idl_import_root не указан, оба idl_parcelables и idl_srcs должны находиться в пути, указанном их пакетом, под корнем Java.

См. примеры.

idl_parcelables

Список метки; по умолчанию []

Список определений Android IDL для предоставления в качестве импортов. Эти файлы будут доступны в качестве импортов для любого android_library целевого объекта, который зависит от этой библиотеки, непосредственно или через её транзитивное замыкание, но не будут переведены в Java или скомпилированы.

Только .aidl файлы, которые соответствуют напрямую .java исходникам в этой библиотеке, должны быть включены (например, пользовательские реализации Parcelable), иначе idl_srcs должен использоваться.

Эти файлы должны быть размещены соответствующим образом, чтобы компилятор aidl мог их найти. См. описание idl_import_root для получения информации о том, что это означает.

idl_preprocessed

Список метки; по умолчанию []

Список предобработанных определений Android IDL для предоставления в качестве импортов. Эти файлы будут доступны в качестве импортов для любого android_library целевого объекта, который зависит от этой библиотеки, непосредственно или через её транзитивное замыкание, но не будут переведены в Java или скомпилированы.

Только предварительно обработанные .aidl файлы, которые соответствуют напрямую .java исходникам в этой библиотеке, должны быть включены (например, пользовательские реализации Parcelable), иначе используйте idl_srcs для определений Android IDL, которые необходимо перевести в Java-интерфейсы и idl_parcelable для необработанных файлов AIDL.

idl_srcs

Список метки; по умолчанию []

Список определений Android IDL для перевода в Java-интерфейсы. После генерации Java-интерфейсов они будут скомпилированы вместе с содержимым srcs.

Эти файлы будут доступны в качестве импортов для любого android_library целевого объекта, который зависит от этой библиотеки, непосредственно или через её транзитивное замыкание.

Эти файлы должны быть размещены соответствующим образом, чтобы компилятор aidl мог их найти. См. описание idl_import_root для получения информации о том, что это означает.

javacopts

Список строк; по умолчанию []

Дополнительные параметры компилятора для этого целевого объекта. Подлежат замене переменных "Переменные make" и токенизации оболочки Bourne.

Эти параметры компилятора передаются javac после глобальных параметров компилятора.

manifest

Метка; по умолчанию None

Имя файла манифеста Android, обычно AndroidManifest.xml. Должно быть определено, если определены resource_files или assets.
neverlink

Булево значение; по умолчанию False

Используйте эту библиотеку только для компиляции, а не во время выполнения. Выходы правила, помеченного как neverlink, не будут использоваться при создании .apk. Полезно, если библиотека будет предоставлена средой выполнения во время выполнения.
plugins

Список метки; по умолчанию []

Плагины Java-компилятора для запуска во время компиляции. Каждый java_plugin в атрибуте plugins будет выполняться при каждой сборке этого целевого объекта. Ресурсы, сгенерированные плагином, будут включены в результирующий jar целевого объекта.
proguard_specs

Список метки; по умолчанию []

Файлы, которые будут использоваться в качестве спецификации Proguard. Они будут описывать набор спецификаций, которые будут использоваться Proguard. Если указаны, они будут добавлены к любому android_binary целевому объекту, зависящему от этой библиотеки. Включённые здесь файлы должны иметь только идемпотентные правила, а именно -dontnote, -dontwarn, assumenosideeffects и правила, начинающиеся с -keep. Другие параметры могут появляться только в android_binary proguard_specs, чтобы обеспечить нетавтологические слияния.
resource_files

Список метки; по умолчанию []

Список ресурсов для упаковки. Обычно это glob всех файлов в каталоге res.
Сгенерированные файлы (из genrules) могут быть указаны меткой Label здесь. Единственное ограничение состоит в том, что сгенерированные выходные данные должны находиться в том же каталоге «res», что и любые другие файлы ресурсов, которые включены.

android_instrumentation_test

android_instrumentation_test(name, data, args, compatible_with, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, licenses, local, restricted_to, shard_count, size, support_apks, tags, target_compatible_with, target_device, test_app, testonly, timeout, toolchains, visibility)

Правило android_instrumentation_test выполняет тесты Android instrumentation. Оно запустит эмулятор, установит приложение, которое тестируется, приложение для тестов и любые другие необходимые приложения, и запустит тесты, определённые в пакете тестов.

Атрибут test_app указывает android_binary, содержащий тест. Эта android_binary в свою очередь указывает приложение, которое тестируется, через атрибут instruments.

Пример

# java/com/samples/hello_world/BUILD

android_library(
    name = "hello_world_lib",
    srcs = ["Lib.java"],
    manifest = "LibraryManifest.xml",
    resource_files = glob(["res/**"]),
)

# The app under test
android_binary(
    name = "hello_world_app",
    manifest = "AndroidManifest.xml",
    deps = [":hello_world_lib"],
)
# javatests/com/samples/hello_world/BUILD

android_library(
    name = "hello_world_test_lib",
    srcs = ["Tests.java"],
    deps = [
      "//java/com/samples/hello_world:hello_world_lib",
      ...  # test dependencies such as Espresso and Mockito
    ],
)

# The test app
android_binary(
    name = "hello_world_test_app",
    instruments = "//java/com/samples/hello_world:hello_world_app",
    manifest = "AndroidManifest.xml",
    deps = [":hello_world_test_lib"],
)

android_instrumentation_test(
    name = "hello_world_uiinstrumentation_tests",
    target_device = ":some_target_device",
    test_app = ":hello_world_test_app",
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

support_apks

Список меток; по умолчанию []

Другие APK, которые необходимо установить на устройстве перед запуском теста instrumentation.
target_device

Метка; обязательно

android_device, на котором должен выполняться тест.

Для запуска теста на уже запущенном эмуляторе или физическом устройстве, используйте эти аргументы: --test_output=streamed --test_arg=--device_broker_type=LOCAL_ADB_SERVER --test_arg=--device_serial_number=$device_identifier

test_app

Метка; обязательно

Цель android_binary, содержащая классы тестов. Цель android_binary должна указывать, какую цель она тестирует, через атрибут instruments.

android_local_test

android_local_test(name, deps, srcs, data, args, compatible_with, custom_package, densities, deprecation, enable_data_binding, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, javacopts, jvm_flags, licenses, local, manifest, manifest_values, nocompress_extensions, plugins, resource_configuration_filters, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, shard_count, size, stamp, tags, target_compatible_with, test_class, testonly, timeout, toolchains, use_launcher, visibility)

Это правило предназначено для тестирования правил android_library локально (в отличие от тестирования на устройстве). Оно работает с фреймворком тестирования Android Robolectric. Подробности о написании тестов Robolectric см. на сайте Android Robolectric.

Неявные цели вывода

  • name.jar: Java архив тестов.
  • name-src.jar: Архив, содержащий исходные файлы ("исходный jar").
  • name_deploy.jar: Java архив развертывания, подходящий для развертывания (создаётся только при явном запросе).

Примеры

Чтобы использовать Robolectric с android_local_test, добавьте репозиторий Robolectric в свой файл WORKSPACE:

http_archive(
    name = "robolectric",
    urls = ["https://github.com/robolectric/robolectric-bazel/archive/<COMMIT>.tar.gz"],
    strip_prefix = "robolectric-bazel-<COMMIT>",
    sha256 = "<HASH>",
)
load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories")
robolectric_repositories()
Это подключает необходимые правила maven_jar для Robolectric. Затем каждое правило android_local_test должно зависеть от @robolectric//bazel:robolectric. См. пример ниже.
android_local_test(
    name = "SampleTest",
    srcs = [
        "SampleTest.java",
    ],
    manifest = "LibManifest.xml",
    deps = [
        ":sample_test_lib",
        "@robolectric//bazel:android-all",
    ],
)

android_library(
    name = "sample_test_lib",
    srcs = [
         "Lib.java",
    ],
    resource_files = glob(["res/**"]),
    manifest = "AndroidManifest.xml",
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

deps

Список метки; значение по умолчанию []

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

Список разрешённых правил в deps - это android_library, aar_import, java_import, java_library, и java_lite_proto_library.

srcs

Список метки; значение по умолчанию []

Список исходных файлов, которые обрабатываются для создания цели. Обязательно, за исключением специального случая, описанного ниже.

srcs файлы типа .java компилируются. Для большей читаемости не следует помещать имя сгенерированного .java исходного файла в srcs. Вместо этого поместите имя зависимого правила в srcs, как описано ниже.

srcs файлы типа .srcjar распаковываются и компилируются. (Это полезно, если вам нужно сгенерировать набор файлов .java с помощью genrule или расширения сборки.)

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

Атрибут srcs обязателен и не может быть пустым, если не указан runtime_deps.

custom_package

Строка; значение по умолчанию ""

Пакет Java, в котором будет сгенерирован класс R. По умолчанию пакет определяется по каталогу, где находится файл BUILD, содержащий правило. Если вы используете этот атрибут, вам, вероятно, также потребуется использовать test_class.
densities

Список строк; значение по умолчанию []

Плотности для фильтрации при построении apk. Соответствующий раздел compatible-screens также будет добавлен в манифест, если он еще не содержит набора StarlarkListing.
enable_data_binding

Булево; значение по умолчанию False

Если true, это правило обрабатывает ссылки на привязку данных, используемые в зависимостях с включенной привязкой данных, используемыми этим тестом. Без этого параметра зависимостям привязки данных не будет необходимого кода генерации на уровне бинарных файлов, и могут возникнуть ошибки сборки.
javacopts

Список строк; значение по умолчанию []

Дополнительные параметры компилятора для этой библиотеки. Подлежат подстановке "переменных Make" и разбору Bourne shell.

Эти параметры компилятора передаются javac после глобальных параметров компилятора.

jvm_flags

Список строк; значение по умолчанию []

Список флагов для встраивания в оболочку скрипта, сгенерированного для запуска этого двоичного файла. Подлежат подстановке $(location), "переменных Make", и разбору Bourne shell.

Оболочка скрипта для Java-бинарника включает определение CLASSPATH (для поиска всех зависимых jar-файлов) и вызывает нужный интерпретатор Java. Команда, сгенерированная оболочкой скрипта, включает имя главного класса, за которым следует "$@", так что вы можете передать другие аргументы после имени класса. Однако аргументы, предназначенные для обработки JVM, должны быть указаны *перед* именем класса в командной строке. Содержимое jvm_flags добавляется в оболочку скрипта перед указанием имени класса.

Обратите внимание, что этот атрибут *не оказывает влияния* на выходы *_deploy.jar.

manifest

Метка; значение по умолчанию None

Имя файла манифеста Android, обычно AndroidManifest.xml. Должно быть определено, если определены resource_files или assets, или если какой-либо из манифестов из библиотек, которые тестируются, содержит тег minSdkVersion.
manifest_values

Словарь: Строка -> Строка; значение по умолчанию {}

Словарь значений, которые будут переопределены в манифесте. Любой экземпляр ${name} в манифесте будет заменен значением, соответствующим имени в этом словаре. applicationId, versionCode, versionName, minSdkVersion, targetSdkVersion и maxSdkVersion также переопределят соответствующие атрибуты тегов манифеста и uses-sdk. packageName будет проигнорировано и будет установлено либо из applicationId, если указано, либо из пакета в манифесте. Нет необходимости иметь манифест в правиле для использования manifest_values.
nocompress_extensions

Список строк; значение по умолчанию []

Список расширений файлов, которые не нужно сжимать в ресурсном apk.
plugins

Список меток; значение по умолчанию []

Плагины компилятора Java для запуска во время компиляции. Каждое java_plugin в этом атрибуте будет выполнено при каждом построении этого правила. Библиотека также может унаследовать плагины от зависимостей, использующих exported_plugins. Ресурсы, сгенерированные плагином, будут включены в результирующий jar этого правила.
resource_configuration_filters

Список строк; значение по умолчанию []

Список фильтров конфигурации ресурсов, например 'en', которые ограничат ресурсы в apk только теми, что находятся в конфигурации 'en'.
resource_jars

Список меток; значение по умолчанию []

Устарело: Используйте java_import и deps или runtime_deps вместо этого.
resource_strip_prefix

Строка; значение по умолчанию ""

Префикс пути для удаления из Java-ресурсов.

Если указано, этот префикс пути удаляется из каждого файла в атрибуте resources. Ошибка, если файл ресурса не находится в этом каталоге. Если не указано (значение по умолчанию), путь к файлу ресурса определяется по тому же логике, что и пакет Java исходных файлов. Например, исходный файл в stuff/java/foo/bar/a.txt будет находиться в foo/bar/a.txt.

runtime_deps

Список меток; значение по умолчанию []

Библиотеки, которые нужно сделать доступными для конечного двоичного файла или теста только во время выполнения. Как и обычные deps, они будут отображаться в runtime classpath, но в отличие от них, не в compile-time classpath. Зависимости, необходимые только во время выполнения, должны быть перечислены здесь. Инструменты анализа зависимостей должны игнорировать цели, которые появляются как в runtime_deps, так и в deps.
stamp

Целое число; значение по умолчанию 0

Нужно ли кодировать информацию о сборке в двоичный файл. Возможные значения:
  • stamp = 1: Всегда встраивать информацию о сборке в двоичный файл, даже в сборках с --nostamp. Этот параметр следует избегать, так как он потенциально убивает кэширование удалённых копий двоичного файла и любых последующих действий, которые зависят от него.
  • stamp = 0: Всегда заменять информацию о сборке постоянными значениями. Это даёт хороший кэш результатов сборки.
  • stamp = -1: Встраивание информации о сборке контролируется флагом --[no]stamp.

Отмеченные двоичные файлы *не* перестраиваются, если их зависимости не изменились.

test_class

Строка; значение по умолчанию ""

Класс Java, который должен быть загружен запуском теста.

Этот атрибут указывает имя класса Java, который должен быть запущен этим тестом. Это редко нужно устанавливать. Если этот аргумент опущен, будет использован класс Java, имя которого соответствует name этого android_local_test правила. Класс теста должен быть аннотирован org.junit.runner.RunWith.

use_launcher

Булево; значение по умолчанию True

Нужно ли использовать пользовательский загрузчик для двоичного файла.

Если этот атрибут установлен в false, атрибут launcher и связанный --java_launcher флаг будут проигнорированы для этой цели.

android_device

android_device(name, cache, compatible_with, default_properties, deprecation, distribs, exec_compatible_with, exec_properties, features, horizontal_resolution, licenses, platform_apks, ram, restricted_to, screen_density, system_image, tags, target_compatible_with, testonly, vertical_resolution, visibility, vm_heap)

Это правило создаёт эмулятор Android, сконфигурированный с заданными параметрами. Этот эмулятор можно запустить с помощью команды bazel run или выполнив сгенерированный скрипт напрямую. Рекомендуется использовать существующие правила android_device, а не определять свои собственные.

Это правило является подходящей целью для флага --run_under для bazel test и blaze run. Он запускает эмулятор, копирует цель, которая тестируется/выполняется, в эмулятор и соответственно тестирует или запускает её.

android_device поддерживает создание изображений KVM, если основное изображение system_image основано на X86 и оптимизировано для архитектуры процессора I686. Чтобы использовать KVM, добавьте tags = ['requires-kvm'] к правилу android_device.

Неявные выходные цели

  • name_images/userdata.dat: Содержит файлы изображений и снимки для запуска эмулятора
  • name_images/emulator-meta-data.pb: Содержит сериализованную информацию, необходимую для передачи эмулятору для его перезапуска.

Примеры

Следующий пример показывает, как использовать android_device. //java/android/helloandroid/BUILD содержит

android_device(
    name = "nexus_s",
    cache = 32,
    default_properties = "nexus_s.properties",
    horizontal_resolution = 480,
    ram = 512,
    screen_density = 233,
    system_image = ":emulator_images_android_16_x86",
    vertical_resolution = 800,
    vm_heap = 32,
)

filegroup(
    name = "emulator_images_android_16_x86",
    srcs = glob(["androidsdk/system-images/android-16/**"]),
)

//java/android/helloandroid/nexus_s.properties содержит:

ro.product.brand=google
ro.product.device=crespo
ro.product.manufacturer=samsung
ro.product.model=Nexus S
ro.product.name=soju

Эта директива сгенерирует изображения и стартовый скрипт. Вы можете запустить эмулятор локально, выполнив команду bazel run :nexus_s -- --action=start. Скрипт предоставляет следующие флаги:

  • --adb_port: Порт для экспонирования adb. Если вы хотите использовать adb-команды с эмулятором, используйте этот порт для подключения adb.
  • --emulator_port: Порт для экспонирования консоли управления эмулятора telnet.
  • --enable_display: Запускает эмулятор с дисплеем, если значение true (по умолчанию false).
  • --action: Либо start, либо kill.
  • --apks_to_install: Список APK-файлов для установки на эмулятор.

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

cache

Целое число; обязательно

Размер кеш-раздела эмулятора в мегабайтах. Минимальное значение — 16 мегабайт.
default_properties

Метка; значение по умолчанию None

Единственный файл свойств, который будет размещен в /default.prop на эмуляторе. Это позволяет автору правила дополнительно настроить эмулятор, чтобы он больше походил на реальное устройство (в частности, управлять строками UserAgent и другим поведением, которое может привести к тому, что приложение или сервер будут вести себя иначе на конкретном устройстве). Свойства в этом файле переопределят только для чтения свойства, обычно устанавливаемые эмулятором, такие как ro.product.model.
horizontal_resolution

Целое число; обязательно

Разрешение экрана по горизонтали в пикселях для эмуляции. Минимальное значение — 240.
platform_apks

Список меток; значение по умолчанию []

Список APK-файлов, которые будут установлены на устройстве во время загрузки.
ram

Целое число; обязательно

Объем оперативной памяти в мегабайтах для эмуляции устройства. Это относится ко всему устройству, а не только к конкретному приложению, установленному на устройстве. Минимальное значение — 64 мегабайта.
screen_density

Целое число; обязательно

Плотность эмулированного экрана в пикселях на дюйм. Минимальное значение — 30 ppi.
system_image

Метка; обязательно

Файл-группа, содержащая следующие файлы:
  • system.img: Система раздел
  • kernel-qemu: Ядро Linux, которое будет загружено эмулятором
  • ramdisk.img: Образ initrd, который будет использоваться при загрузке
  • userdata.img: Начальный раздел userdata
  • source.properties: Файл свойств, содержащий информацию об изображениях
Эти файлы являются частью Android SDK или предоставляются сторонними разработчиками (например, Intel предоставляет изображения x86).
vertical_resolution

Целое число; обязательно

Разрешение экрана по вертикали в пикселях для эмуляции. Минимальное значение — 240.
vm_heap

Целое число; обязательно

Размер виртуальной кучи в мегабайтах, которую Android будет использовать для каждого процесса. Минимальное значение — 16 мегабайт.

android_ndk_repository

android_ndk_repository(name, api_level, path, repo_mapping)

Настраивает Bazel для использования Android NDK для поддержки построения Android-целей с нативным кодом.

Обратите внимание, что это реализация android_ndk_repository заменяется реализацией в Starlark. Поддержка будущих версий NDK, включая версии 25 и выше, будет реализована в версии Starlark android_ndk_repository. См. rules_android_ndk для версии Starlark.

Обратите внимание, что для построения для Android также требуется правило android_sdk_repository в вашем файле WORKSPACE.

Для получения дополнительной информации, прочтите полную документацию по использованию Android NDK с Bazel.

Примеры

android_ndk_repository(
    name = "androidndk",
)

В приведенном выше примере будет определен ваш Android NDK из $ANDROID_NDK_HOME и будет определена самая высокая поддерживаемая API-версия.

android_ndk_repository(
    name = "androidndk",
    path = "./android-ndk-r20",
    api_level = 24,
)

В приведенном выше примере будет использован Android NDK, расположенный в вашем рабочем пространстве в ./android-ndk-r20. Будут использованы библиотеки API-уровня 24 при компиляции JNI-кода.

cpufeatures

Android NDK содержит библиотеку cpufeatures, которая может использоваться для определения процессора устройства во время выполнения. Следующий пример демонстрирует, как использовать cpufeatures с Bazel.

# jni.cc
#include "ndk/sources/android/cpufeatures/cpu-features.h"
...
# BUILD
cc_library(
    name = "jni",
    srcs = ["jni.cc"],
    deps = ["@androidndk//:cpufeatures"],
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

api_level

Целое число; не настраиваемое; значение по умолчанию 0

Уровень API Android для компиляции. Если не указано, будет использоваться наивысший установленный API-уровень.
path

Строка; не настраиваемое; значение по умолчанию ""

Абсолютный или относительный путь к Android NDK. Должен быть задан либо этот атрибут, либо переменная окружения $ANDROID_NDK_HOME.

Android NDK можно загрузить с сайта разработчика Android.

repo_mapping

Словарь: Строка -> Строка; значение по умолчанию {}

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

Например, запись "@foo": "@bar" объявляет, что всякий раз, когда этот репозиторий зависит от "@foo" (например, зависимость от "@foo//some:target"), он должен фактически разрешать эту зависимость в глобально объявленном "@bar" ("@bar//some:target").

android_sdk_repository

android_sdk_repository(name, api_level, build_tools_version, path, repo_mapping)

Настраивает Bazel для использования локального Android SDK для поддержки построения Android-целей.

Примеры

Минимальные действия для настройки Android SDK для Bazel — поместить правило android_sdk_repository с именем "androidsdk" в ваш файл WORKSPACE и установить переменную окружения $ANDROID_HOME в путь к вашему Android SDK. Bazel по умолчанию будет использовать самый высокий уровень API и версию инструментов построения, установленных в Android SDK.
android_sdk_repository(
    name = "androidsdk",
)

Для обеспечения воспроизводимости построений можно задать атрибуты path, api_level и build_tools_version. Построение завершится ошибкой, если Android SDK не имеет установленного указанного API-уровня или версии инструментов построения.

android_sdk_repository(
    name = "androidsdk",
    path = "./sdk",
    api_level = 19,
    build_tools_version = "25.0.0",
)

В приведенном выше примере также показано использование пути, относительного к рабочему пространству, для Android SDK. Это полезно, если Android SDK является частью вашего рабочего пространства Bazel (например, если он добавлен в систему управления версиями).

Библиотеки поддержки

Библиотеки поддержки доступны в Android SDK Manager как "Android Support Repository". Это версия набор общих Android-библиотек, таких как библиотеки Support и AppCompat, упакованный как локальный Maven-репозиторий. android_sdk_repository генерирует цели Bazel для каждой из этих библиотек, которые могут использоваться в зависимостях целей android_binary и android_library.

Имена сгенерированных целей взяты из координат Maven библиотек в Android Support Repository, отформатированных как @androidsdk//${group}:${artifact}-${version}. Следующий пример показывает, как цель android_library может зависеть от версии 25.0.0 библиотеки v7 appcompat.

android_library(
    name = "lib",
    srcs = glob(["*.java"]),
    manifest = "AndroidManifest.xml",
    resource_files = glob(["res/**"]),
    deps = ["@androidsdk//com.android.support:appcompat-v7-25.0.0"],
)

Аргументы

Атрибуты
name

Имя; обязательно

Уникальное имя для этой цели.

api_level

Целое число; не настраиваемое; значение по умолчанию 0

Уровень API Android, по умолчанию используемый для сборки. Если не указан, будет использован самый высокий установленный уровень API.

Уровень API, используемый для данной сборки, может быть изменён флагом android_sdk. android_sdk_repository создаёт цель android_sdk для каждого установленного уровня API в SDK с именем @androidsdk//:sdk-${level}, независимо от того, задан ли этот атрибут. Например, чтобы собрать для уровня API, отличного от стандартного: bazel build --android_sdk=@androidsdk//:sdk-19 //java/com/example:app.

Чтобы просмотреть все цели android_sdk, созданные android_sdk_repository , можно запустить bazel query "kind(android_sdk, @androidsdk//...)".

build_tools_version

Строка; не настраиваемое; значение по умолчанию ""

Версия Android build tools для использования в Android SDK. Если не указана, будет использована последняя установленная версия build tools.

Bazel требует build tools версии 30.0.0 или выше.

path

Строка; не настраиваемое; значение по умолчанию ""

Абсолютный или относительный путь к Android SDK. Должен быть указан либо этот атрибут, либо переменная среды $ANDROID_HOME.

Android SDK можно загрузить на сайте разработчиков Android https://developer.android.com.

repo_mapping

Словарь: Строка -> Строка; значение по умолчанию {}

Словарь, сопоставляющий имена локальных репозиториев с глобальными именами репозиториев. Это позволяет контролировать разрешение зависимостей рабочего пространства для зависимостей данного репозитория.

Например, запись "@foo": "@bar" указывает, что при возникновении зависимости этого репозитория от "@foo" (например, при зависимости от "@foo//some:target"), эта зависимость должна разрешаться в глобально объявленном репозитории "@bar" ("@bar//some:target").

За исключением случаев, когда указано иное, содержимое этой страницы лицензировано по лицензии Creative Commons Attribution 4.0, а примеры кода лицензированы по лицензии Apache 2.0. Дополнительная информация представлена в Политике сайта Google для разработчиков. Java является зарегистрированным товарным знаком Oracle и/или её аффилированных лиц.

Последнее обновление 2023-12-11 UTC.

Licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License.
https://bazel.build/versions/7.0.0/reference/be/android

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API