Spec-Zone.ru › Bazel 6.0

Правила Android

Правила

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

android_binary

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

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

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

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

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

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

Примеры

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

Аргументы

Атрибуты
name

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

Integer; optional; default is 1

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

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

dexopts

List of strings; optional

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

Boolean; optional; default is False

Если true, это правило обрабатывает выражения привязки данных (data binding) в ресурсах макета, включенных через атрибут 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 Bourne shell tokenization.

Эти параметры компилятора передаются в 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. Используйте этот параметр, чтобы повлиять на классы, включенные в основной список dex.
main_dex_proguard_specs

List of labels; optional

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

Label; required

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

Dictionary: String -> String; optional

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

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

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

Примеры

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

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

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

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

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

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

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

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

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

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

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

Аргументы

Атрибуты
name

Name; required

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

deps

List of labels; optional

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

List of labels; optional

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

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

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

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

assets

List of labels; optional

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

String; optional

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

String; optional

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

Boolean; optional; default is False

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

Дополнительные параметры компилятора для этой цели. Подвергается замене переменной «manifest» и токенизации оболочки 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 для тестирования. Подробности по написанию тестов Robolectric см. на сайте Android Robolectric.

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

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

Примеры

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

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

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

Аргументы

Атрибуты
name

Name; required

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

deps

List of labels; optional

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

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

srcs

List of labels; optional

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

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

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

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

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

custom_package

String; optional

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

List of strings; optional

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

Boolean; optional; default is False

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

List of strings; optional

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

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

jvm_flags

List of strings; optional

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

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

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

manifest

Label; optional

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

Dictionary: String -> String; optional

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

List of strings; optional

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

List of labels; optional

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

List of strings; optional

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

List of labels; optional

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

String; optional

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

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

runtime_deps

List of labels; optional

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

Integer; optional; default is 0

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

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

test_class

String; optional

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

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

use_launcher

Boolean; optional; default is True

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

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

android_device

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

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

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

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

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

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

Примеры

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

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

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

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

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

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

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

Аргументы

Атрибуты
name

Name; required

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

cache

Integer; required

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

Label; optional

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

Integer; required

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

List of labels; optional

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

Integer; required

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

Integer; required

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

Label; required

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

Integer; required

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

Integer; required

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

android_ndk_repository

android_ndk_repository(name, api_level, path, repo_mapping)

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

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

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

Примеры

android_ndk_repository(
    name = "androidndk",
)

Приведенный выше пример определит ваш Android NDK из $ANDROID_NDK_HOME и обнаружит максимальный уровень API, который он поддерживает.

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

Приведенный выше пример будет использовать Android NDK, расположенный внутри вашего рабочего пространства в ./android-ndk-r20. Он будет использовать библиотеки 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

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

String; optional; nonconfigurable

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

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

repo_mapping

Dictionary: String -> String; optional

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

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

android_sdk_repository

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

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

Примеры

Для настройки Android SDK для Bazel необходимо поместить правило android_sdk_repository с именем "androidsdk" в ваш файл WORKSPACE и установить переменную окружения $ANDROID_HOME в путь к вашему Android SDK. По умолчанию Bazel будет использовать самый высокий уровень 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

Уровень 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 и/или её аффилированных лиц.

Последнее обновление 2022-12-19 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.0.0/reference/be/android

Spec-Zone.ru

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