Spec-Zone.ru › Bazel 6.1

Правила 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

Name; required

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

deps

List of labels; optional

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

List of labels; optional

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

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

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

assets

List of labels; optional

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

String; optional

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

Boolean; optional; default is True

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

String; optional

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

Label; optional; default is @bazel_tools//tools/android:debug_keystore

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

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

debug_signing_keys

List of labels; optional

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

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

debug_signing_lineage_file

Label; optional

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

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

densities

List of strings; optional

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

Integer; optional; default is 1

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

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

dexopts

List of strings; optional

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

Boolean; optional; default is False

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

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

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

Integer; optional; nonconfigurable; default is -1

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

Label; optional

Целевой объект для инструментирования.

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

javacopts

List of strings; optional

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

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

key_rotation_min_sdk

String; optional

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

Label; optional

Текстовый файл, содержащий список имён файлов классов. Классы, определённые этими файлами, помещаются в основной 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

List of strings; optional

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

List of labels; optional

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

Label; required

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

Dictionary: String -> String; optional

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

String; optional; default is "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

List of strings; optional

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

Integer; optional; default is 0

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

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

plugins

List of labels; optional

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

Label; optional

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

Label; optional

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

Boolean; optional; nonconfigurable; default is False

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

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

proguard_specs

List of labels; optional

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

List of strings; optional

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

List of labels; optional

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

Integer; optional; default is -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

Name; required

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

aar

Label; required

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

List of labels; optional

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

Label; optional

Файл 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: Архив, содержащий исходный код ("source 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

Name; required

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

deps

List of labels; optional

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

List of labels; optional

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

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

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

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

assets

List of labels; optional

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

String; optional

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

String; optional

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

Boolean; optional; default is False

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

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

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

List of labels; optional

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

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

exports

List of labels; optional

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

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

exports_manifest

Integer; optional; default is 1

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

String; optional

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

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

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

См. примеры.

idl_parcelables

List of labels; optional

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

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

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

idl_preprocessed

List of labels; optional

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

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

idl_srcs

List of labels; optional

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

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

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

javacopts

List of strings; optional

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

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

manifest

Label; optional

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

Boolean; optional; default is False

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

List of labels; optional

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

List of labels; optional

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

List of labels; optional

Список ресурсов для упаковки. Обычно это 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-тесты инструментации. Оно запустит эмулятор, установит приложение, которое тестируется, приложение для тестирования и любые другие необходимые приложения и запустит тесты, определенные в пакете тестирования.

Атрибут 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

Name; required

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

support_apks

List of labels; optional

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

Label; required

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

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

test_app

Label; required

Цель 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/archive/<COMMIT>.tar.gz"],
    strip_prefix = "robolectric-<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:robolectric",
    ],
)

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

Аргументы

Атрибуты
name

Name; required

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

deps

List of labels; optional

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

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

srcs

List of labels; optional

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

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

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

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

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

custom_package

String; optional

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

List of strings; optional

Разрешения для фильтрации при построении apk. Соответствующий раздел совместимых экранов также будет добавлен в манифест, если он еще не содержит супермножество StarlarkListing.
enable_data_binding

Boolean; optional; default is False

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

List of strings; optional

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

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

jvm_flags

List of strings; optional

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

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

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

manifest

Label; optional

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

Dictionary: String -> String; optional

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

List of strings; optional

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

List of labels; optional

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

List of strings; optional

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

List of labels; optional

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

String; optional

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

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

runtime_deps

List of labels; optional

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

Integer; optional; default is 0

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

Запечатлённые бинарные файлы не перестраиваются, пока не изменятся их зависимости.

test_class

String; optional

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

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

use_launcher

Boolean; optional; default is 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 connect.
  • --emulator_port: Порт для экспонирования консоли управления telnet эмулятора.
  • --enable_display: Запускает эмулятор с дисплеем, если true (по умолчанию false).
  • --action: Либо start, либо kill.
  • --apks_to_install: список apk для установки на эмулятор.

Аргументы

Атрибуты
name

Name; required

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

cache

Integer; required

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

Label; optional

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

Integer; required

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

List of labels; optional

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

Integer; required

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

Integer; required

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

Label; required

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

Integer; required

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

Integer; required

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

android_ndk_repository

android_ndk_repository(name, api_level, path, repo_mapping)

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

Обратите внимание, что для сборки для 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. При компиляции вашего JNI-кода будут использоваться библиотеки уровня API 24.

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

Name; required

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

api_level

Integer; optional; nonconfigurable; default is 0

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

String; optional; nonconfigurable

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

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

repo_mapping

Dictionary: String -> String; optional

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

Например, запись "@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 будет использовать наивысший уровень Android 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 как "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

Name; required

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

api_level

Integer; optional; nonconfigurable; default is 0

Уровень Android API, используемый по умолчанию. Если не указано, будет использоваться наивысший установленный уровень 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

String; optional; nonconfigurable

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

Bazel требует версии инструментов сборки 30.0.0 или более поздней.

path

String; optional; nonconfigurable

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

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

repo_mapping

Dictionary: String -> String; optional

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

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

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

Последнее обновление 2023-03-15 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/6.1.0/reference/be/android

Spec-Zone.ru

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