Spec-Zone.ru › Bazel 6.3

Правила 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 компилируются. Для наглядности, не следует помещать имя сгенерированного .java исходного файла в srcs. Вместо этого поместите имя зависимой правила в 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 (aapt bug), которая была исправлена в 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. Соответствующий раздел compatible-screens также будет добавлен в манифест, если он уже не содержит перечень, охватывающий все варианты.
dex_shards

Integer; optional; default is 1

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

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

dexopts

List of strings; optional

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

Boolean; optional; default is False

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

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

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

Integer; optional; nonconfigurable; default is -1

Принудительно создать цель со или без инкрементального dexing, переопределяя значения по умолчанию и флаг --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

Текстовый файл, содержащий список имён файлов с классами. Классы, определённые этими файлами, помещаются в основной 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 для определения классов, которые должны храниться в основном dex. Допустимо только если атрибут multidex установлен в legacy.
manifest

Label; required

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

Dictionary: String -> String; optional

Словарь значений, которые необходимо переопределить в манифесте. Любой экземпляр ${имя} в манифесте будет заменён значением, соответствующим имени в этом словаре. 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) могут быть указаны с помощью Label также. Единственное ограничение заключается в том, что сгенерированные выходные данные должны находиться в одном каталоге "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: Архив, содержащий исходные данные ("исходный 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

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

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

  1. Установите этот атрибут для всех правил Android, которые транзитивно зависят от этого. Это связано с тем, что получатели унаследуют выражения привязки данных правила через слияние ресурсов. Поэтому им также необходимо производить сборку с использованием data binding для разбора этих выражений.
  2. Добавьте запись deps = для библиотеки runtime data binding во все целевые объекты, которые установили этот атрибут. Местоположение этой библиотеки зависит от вашей конфигурации репозитория.
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 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.
Сгенерированные файлы (из genrules) могут быть указаны с помощью метки здесь. Единственное ограничение состоит в том, что сгенерированные выходы должны находиться в одном и том же каталоге "res" с любыми другими ресурсами, которые включены.

android_instrumentation_test

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

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

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

Пример

# java/com/samples/hello_world/BUILD

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

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

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

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

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

Аргументы

Атрибуты
name

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()
Это подключает 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, это правило обрабатывает ссылки data binding, используемые в зависимостях с поддержкой data binding, используемых этим тестом. Без этого параметра зависимости data binding не будут иметь необходимой генерации кода на уровне бинарных файлов и могут привести к ошибкам сборки.
javacopts

List of strings; optional

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

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

jvm_flags

List of strings; optional

Список флагов для встраивания в скрипт-оболочку, сгенерированный для запуска этой программы. Подвергается подстановке $(location) и переменных "Make variable", а также токенизации оболочки 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} в манифесте будет заменён значением, соответствующим имени в этом словаре. 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 classpath, но в отличие от них, не в compile-time classpath. Зависимости, необходимые только во время выполнения, должны быть перечислены здесь. Инструменты анализа зависимостей должны игнорировать цели, которые появляются как в 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 т/дюйм.
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. Он будет использовать библиотеки уровня API 24 при компиляции вашего JNI-кода.

cpufeatures

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

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

Аргументы

Атрибуты
name

Name; required

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

api_level

Integer; optional; nonconfigurable; default is 0

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

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

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

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

build_tools_version

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-07-25 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.3.0/reference/be/android

Spec-Zone.ru

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