Spec-Zone.ru › Bazel 6.4

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

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

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

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

dexopts

List of strings; optional

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

Boolean; optional; default is False

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

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

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

Integer; optional; nonconfigurable; default is -1

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

Label; optional

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

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

javacopts

List of strings; optional

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

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

key_rotation_min_sdk

String; optional

Устанавливает минимальную версию платформы Android (уровень API), для которой должен использоваться ключ подписи 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_proguard_specs

List of labels; optional

Файлы, используемые в качестве спецификаций Proguard для определения классов, которые должны быть сохранены в главном дексе. Допустимо только при установке атрибута 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 превышен. Содержимое основного файла 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).

END_OF_DOCUMENT_MARKER
plugins

List of labels; optional

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

Label; optional

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

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

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

Примеры

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

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

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

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

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

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

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

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

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

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

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

Аргументы

Атрибуты
name

Name; required

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

deps

List of labels; optional

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

List of labels; optional

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

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

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

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

assets

List of labels; optional

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

String; optional

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

String; optional

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

Boolean; optional; default is False

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

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

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

List of labels; optional

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

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

exports

List of labels; optional

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

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

exports_manifest

Integer; optional; default is 1

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

String; optional

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

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

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

См. примеры.

idl_parcelables

List of labels; optional

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

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

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

idl_preprocessed

List of labels; optional

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

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

idl_srcs

List of labels; optional

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

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

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

javacopts

List of strings; optional

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

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

manifest

Label; optional

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

Boolean; optional; default is False

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

List of labels; optional

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

List of labels; optional

Файлы, которые будут использоваться в качестве спецификаций Proguard. Они описывают набор спецификаций, которые будут использоваться Proguard. Если указаны, они будут добавлены к любой android_binary цели, зависящей от этой библиотеки. Включенные файлы должны содержать только идемпотентные правила, а именно -dontnote, -dontwarn, assumenosideeffects и правила, начинающиеся с -keep. Другие параметры могут быть только в 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 в свою очередь указывает приложение 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 для тестирования. Смотрите сайт Android Robolectric, чтобы узнать подробности о написании тестов Robolectric.

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

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

Примеры

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

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

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

Аргументы

Атрибуты
name

Name; required

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

deps

List of labels; optional

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

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

srcs

List of labels; optional

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

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

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

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

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

custom_package

String; optional

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

List of strings; optional

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

Boolean; optional; default is False

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

List of strings; optional

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

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

jvm_flags

List of strings; optional

Список флагов для встраивания в скрипт-оболочку, сгенерированный для запуска этого двоичного файла. Подлежат замене переменными Make $(location) и токенизации оболочки 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 также переопределят соответствующие атрибуты тегов manifest и uses-sdk. packageName будет проигнорировано и будет задано из applicationId (если указано) или из пакета в манифесте. Для использования manifest_values не требуется иметь манифест в правиле.
nocompress_extensions

List of strings; optional

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

END_OF_DOCUMENT_MARKER
  • --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. Он будет использовать библиотеки уровня 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 будет использовать самый высокий уровень API Android и версию инструментов сборки, установленных в Android SDK.
android_sdk_repository(
    name = "androidsdk",
)

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

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

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

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

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

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

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

Аргументы

Атрибуты
name

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 License. Подробнее см. Политики веб-сайта Google Developers. Java — зарегистрированный товарный знак Oracle и/или ее дочерних компаний.

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

Spec-Zone.ru

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