Spec-Zone.ru › Bazel 6.2

Правила 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, подписанный отладочными ключами и zip-архивированный. Он может использоваться для разработки и отладки приложения. Вы не можете выпустить приложение, подписанное отладочными ключами.
  • 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

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

Файлы типа .java компилируются. Для большей читабельности не рекомендуется добавлять имя сгенерированного .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 (или нет). Не зависит от обработки девяти-панельных изображений, которое всегда выполняется. Это устаревшее решение проблемы ошибки aapt, которая была исправлена в aapt2.
custom_package

String; optional

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

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

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

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

debug_signing_keys

List of labels; optional

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

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

debug_signing_lineage_file

Label; optional

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

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

densities

List of strings; optional

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

Integer; optional; default is 1

Количество фрагментов, на которые должен быть разбит dex. Это ускоряет dex, за счёт увеличения времени установки и запуска приложения. Чем больше бинарник, тем больше фрагментов следует использовать. 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

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

Label; optional

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

Если этот атрибут задан, этот android_binary будет обрабатываться как тестовое приложение для инструментальных тестов. Целевой объект android_instrumentation_test затем может указать этот целевой объект в его атрибуте 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

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

List of strings; optional

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

List of labels; optional

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

Label; required

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

Dictionary: String -> String; optional

Словарь значений, которые должны быть переопределены в манифесте. Любой экземпляр ${name} в манифесте будет заменён значением, соответствующим 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 превышен. Содержимое файла main 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_apply_mapping

Label; optional

Файл, используемый в качестве отображения для proguard. Файл отображения, сгенерированный 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-времени выполнения 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

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 variable" и разбору Bourne shell.

Эти параметры компилятора передаются в 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. Другие параметры могут появиться только в proguard_specs android_binary, чтобы обеспечить не-тождественные слияния.
resource_files

List of labels; optional

Список ресурсов для упаковки. Обычно это glob всех файлов в каталоге res.
Сгенерированные файлы (из genrule) могут быть указаны с помощью 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 в свою очередь, указывает 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: Архив, содержащий исходные коды ("source jar").
  • name_deploy.jar: Java-архив развертывания, подходящий для развертывания (создается только при явном запросе).

Примеры

Чтобы использовать Robolectric с android_local_test, добавьте репозиторий Robolectric Robolectric's repository в свой файл 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()
Это подключает необходимые для Robolectric правила maven_jar. Затем каждое правило 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

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

Файлы типа .java компилируются. Для удобства чтения, не следует помещать имя сгенерированного .java исходного файла в 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» и токенизации оболочки Bourne.

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

jvm_flags

List of strings; optional

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

Сценарий-обертка для исполняемого файла 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 также переопределят соответствующие атрибуты тегов манифеста и 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

Размер виртуальной кучи машины в мегабайтах, которую 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 Developers. Java — зарегистрированная торговая марка Oracle и/или её филиалов.

Последнее обновление 2023-05-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.2.0/reference/be/android

Spec-Zone.ru

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