Android 규칙

문제 신고 소스 보기

규칙

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: 디버그 키로 서명되고 zipaligned인 Android 애플리케이션 패키지 파일로, 애플리케이션을 개발하고 디버그하는 데 사용할 수 있습니다. 디버그 키로 서명한 경우 애플리케이션을 출시할 수 없습니다.
  • name_unsigned.apk: 출시 전 서명 키로 공개될 수 있는 위 파일의 서명되지 않은 버전입니다.
  • name_deploy.jar: 이 타겟의 전이적 클로저가 포함된 자바 보관 파일입니다.

    배포 jar에는 이 대상의 런타임 클래스 경로를 처음부터 끝까지 검색한 클래스 로더가 찾을 수 있는 모든 클래스가 포함되어 있습니다.

  • name_proguard.jar: name_deploy.jar에서 ProGuard를 실행한 결과를 포함하는 자바 보관 파일입니다. 이 출력은 proguard_specs 속성이 지정된 경우에만 생성됩니다.
  • name_proguard.map: name_deploy.jar에서 ProGuard를 실행한 매핑 파일 결과입니다. 이 출력은 proguard_specs 속성이 지정되고 proguard_generate_mapping 또는 shrink_resources가 설정된 경우에만 생성됩니다.

Android 규칙의 예는 Bazel 소스 트리의 examples/android 디렉터리에서 찾을 수 있습니다.

인수

속성
name

Name; required

이 타겟의 고유한 이름입니다.

deps

List of labels; optional

바이너리 대상에 연결할 다른 라이브러리 목록입니다. 허용되는 라이브러리 유형은 android_library, java_library(android 제약 조건이 있음), cc_library는 Android 타겟 플랫폼의 .so 네이티브 라이브러리를 래핑하거나 생성하는 것입니다.
srcs

List of labels; optional

타겟을 만들기 위해 처리되는 소스 파일의 목록입니다.

.java 유형의 srcs 파일이 컴파일됩니다. 가독성을 위해 생성된 .java 소스 파일의 이름을 srcs에 넣는 것은 좋지 않습니다. 대신 아래에 설명된 대로 종속 규칙 이름을 srcs에 넣습니다.

.srcjar 유형의 srcs 파일이 압축 해제되고 컴파일됩니다. genrule 또는 build 확장자를 사용하여 .java 파일 세트를 생성해야 하는 경우 유용합니다.

assets

List of labels; optional

패키징할 애셋 목록입니다. 일반적으로 assets 디렉터리에 있는 모든 파일의 glob입니다. 또한 모든 파일이 해당하는 패키지의 assets_dir 디렉터리 아래에 있는 경우 다른 패키지 (파일을 생성하는 규칙) 또는 내보낸 파일을 참조할 수도 있습니다.
assets_dir

String; optional

assets의 파일 경로를 제공하는 문자열입니다. assetsassets_dir 쌍은 패키징된 애셋을 설명하며, 두 속성을 모두 제공하거나 모두 제공하지 않아야 합니다.
crunch_png

Boolean; optional; default is True

PNG 크런칭을 실행합니다. 이는 항상 수행되는 나인 패치 처리와는 별개입니다. 이 방법은 aapt2에서 수정된 aapt 버그에 대한 지원 중단 해결 방법입니다.
custom_package

String; optional

자바 소스가 생성될 자바 패키지입니다. 기본적으로 이 패키지는 규칙이 포함된 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를 빌드할 때 필터링할 밀도입니다. 이렇게 하면 지정된 화면 밀도의 기기에서 로드하지 않는 래스터 드로어블 리소스가 제거되어 APK 크기가 줄어듭니다. 해당하는 호환 가능 화면 섹션에도 이미 상위 집합 목록이 포함되어 있지 않으면 이 섹션이 매니페스트에 추가됩니다.
dex_shards

Integer; optional; default is 1

덱싱을 분해해야 하는 샤드 수입니다. 이렇게 하면 앱 설치와 시작 시간을 낮추면서 덱싱을 훨씬 더 빠르게 할 수 있습니다. 바이너리가 클수록 더 많은 샤드를 사용해야 합니다. 25개는 실험을 시작하기에 적절한 값입니다.

각 샤드에는 최종 앱에 하나 이상의 dex가 생성됩니다. 따라서 출시 바이너리의 경우 dex를 2개 이상으로 설정하는 것은 권장되지 않습니다.

dexopts

List of strings; optional

class.dex를 생성할 때 dx 도구의 추가 명령줄 플래그입니다. '변수 만들기' 대체 및 본 셸 토큰화가 적용됩니다.
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

이 타겟의 추가 컴파일러 옵션입니다. '변수 만들기' 대체 및 본 셸 토큰화가 적용됩니다.

이러한 컴파일러 옵션은 전역 컴파일러 옵션 이후에 javac에 전달됩니다.

key_rotation_min_sdk

String; optional

APK의 서명을 생성하는 데 APK의 순환된 서명 키를 사용해야 하는 최소 Android 플랫폼 버전 (API 수준)을 설정합니다. APK의 원래 서명 키는 모든 이전 플랫폼 버전에 사용됩니다.
main_dex_list

Label; optional

텍스트 파일에는 클래스 파일 이름 목록이 포함됩니다. 이러한 클래스 파일에 의해 정의된 클래스는 기본 class.dex에 배치됩니다. 예를 들면 다음과 같습니다.
          android/support/multidex/MultiDex$V19.class
          android/support/multidex/MultiDex.class
          android/support/multidex/MultiDexApplication.class
          com/google/common/base/Objects.class
                    
multidex="manual_main_dex"와 함께 사용해야 합니다.
main_dex_list_opts

List of strings; optional

기본 dex 목록 빌더에 전달할 명령줄 옵션입니다. 이 옵션을 사용하여 기본 dex 목록에 포함된 클래스에 영향을 미칩니다.
main_dex_proguard_specs

List of labels; optional

Proguard 사양으로 사용하여 기본 dex에서 유지해야 하는 클래스를 결정하는 데 사용할 파일입니다. multidex 속성이 legacy로 설정된 경우에만 허용됩니다.
manifest

Label; required

Android 매니페스트 파일의 이름(일반적으로 AndroidManifest.xml) resource_files 또는 애셋이 정의된 경우 정의해야 합니다.
manifest_values

Dictionary: String -> String; optional

매니페스트에서 재정의할 값 사전입니다. 매니페스트의 모든 ${name} 인스턴스가 이 사전의 이름에 해당하는 값으로 대체됩니다. applicationId, versionCode, versionName, minSdkVersion, targetSdkVersion 및 maxSdkVersion은 매니페스트의 해당 속성 및 uses-sdk 태그도 재정의합니다. packageName은 무시되고 applicationId에서 지정되거나 매니페스트에 패키지가 설정됩니다. manifest_merger를 기존 버전으로 설정하면 applicationId, versionCode, versionName만 적용됩니다.
multidex

String; optional; default is "native"

코드를 여러 dex 파일로 분할할지 여부입니다.
가능한 값은 다음과 같습니다.
  • native: dex 64K 색인 한도를 초과하면 코드를 여러 dex 파일로 분할합니다. 런타임 시 멀티덱스 클래스 로드를 위한 네이티브 플랫폼 지원을 가정합니다. Android L 이상에서만 작동합니다.
  • legacy: dex 64K 색인 한도를 초과하면 코드를 여러 dex 파일로 분할합니다. 멀티덱스 클래스가 애플리케이션 코드를 통해 로드된다고 가정합니다 (즉, 네이티브 플랫폼 지원 없음).
  • manual_main_dex: dex 64K 색인 한도를 초과하면 코드를 여러 dex 파일로 분할합니다. 기본 dex 파일의 콘텐츠는 main_dex_list 속성을 사용하여 텍스트 파일의 클래스 목록을 제공하여 지정해야 합니다.
  • off: 색인 제한을 초과하더라도 모든 코드를 단일 dex 파일로 컴파일합니다.
nocompress_extensions

List of strings; optional

APK에 압축되지 않은 상태로 두는 파일 확장자 목록입니다.
package_id

Integer; optional; default is 0

이 바이너리의 리소스에 할당할 패키지 ID입니다.

자세한 내용은 AAPT2의 --package-id 인수를 참고하세요. 이렇게 하면 일반적으로 설정하지 않은 상태로 둘 수 있으며 이에 따라 기본값 127(0x7F)이 생성됩니다.

plugins

List of labels; optional

컴파일 시간에 실행할 자바 컴파일러 플러그인입니다. 이 속성을 빌드할 때마다 플러그인 속성에 지정된 모든 java_plugin가 실행됩니다. 플러그인에서 생성된 리소스는 대상의 결과 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

APK의 리소스를 'en' 구성의 리소스로만 제한하는 'en' 등의 리소스 구성 필터 목록입니다. 의사 현지화를 사용 설정하려면 en_XA 또는 ar_XB 의사 언어를 포함합니다.
resource_files

List of labels; optional

패키징할 리소스의 목록입니다. 일반적으로 res 디렉터리에 있는 모든 파일의 glob입니다.
genrule에서 생성된 파일도 여기에서 Label로 참조할 수 있습니다. 유일한 제한사항은 생성된 출력이 포함된 다른 리소스 파일과 동일한 'res' 디렉터리에 있어야 한다는 것입니다.
shrink_resources

Integer; optional; default is -1

리소스 축소를 수행할지 여부입니다. 바이너리에서 사용하지 않는 리소스는 APK에서 삭제됩니다. 이는 로컬 리소스 (manifestresource_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_libraryandroid_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

이 타겟에 종속된 Android 타겟에 제공할 .aar 파일입니다.
exports

List of labels; optional

이 규칙을 사용하는 규칙으로 내보낼 대상입니다. java_library.exports
srcjar

Label; optional

AAR에서 컴파일된 JAR 파일의 소스 코드를 포함하는 JAR 파일입니다.

Android 라이브러리

규칙 소스 보기
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: 자바 보관 파일입니다.
  • libname-src.jar: 소스가 포함된 보관 파일('소스 jar')
  • name.aar: 이 타겟의 자바 보관 파일 및 리소스가 포함된 Android 'aar' 번들입니다. 임시 휴업은 포함되어 있지 않습니다.

Android 규칙의 예는 Bazel 소스 트리의 examples/android 디렉터리에서 찾을 수 있습니다.

다음 예는 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가 Android 타겟 플랫폼의 .so 네이티브 라이브러리를 래핑하거나 생성하는 것입니다.
srcs

List of labels; optional

대상을 만들기 위해 처리되는 .java 또는 .srcjar 파일의 목록입니다.

.java 유형의 srcs 파일이 컴파일됩니다. 가독성을 위해 생성된 .java 소스 파일의 이름을 srcs에 넣는 것은 좋지 않습니다. 대신 아래에 설명된 대로 종속 규칙 이름을 srcs에 넣습니다.

.srcjar 유형의 srcs 파일이 압축 해제되고 컴파일됩니다. genrule 또는 build 확장자를 사용하여 .java 파일 세트를 생성해야 하는 경우 유용합니다.

srcs이 생략된 경우 deps에 지정된 모든 종속 항목을 이 규칙에서 내보냅니다. 종속 항목 내보내기에 관한 자세한 내용은 java_library 내보내기를 참고하세요. 그러나 이 동작은 곧 지원 중단될 예정이므로 사용하지 마세요.

assets

List of labels; optional

패키징할 애셋 목록입니다. 일반적으로 assets 디렉터리에 있는 모든 파일의 glob입니다. 또한 모든 파일이 해당하는 패키지의 assets_dir 디렉터리 아래에 있는 경우 다른 패키지 (파일을 생성하는 규칙) 또는 내보낸 파일을 참조할 수도 있습니다.
assets_dir

String; optional

assets의 파일 경로를 제공하는 문자열입니다. assetsassets_dir 쌍은 패키징된 애셋을 설명하며, 두 속성을 모두 제공하거나 모두 제공하지 않아야 합니다.
custom_package

String; optional

자바 소스가 생성될 자바 패키지입니다. 기본적으로 이 패키지는 규칙이 포함된 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

이 라이브러리에 포함된 idl 소스가 포함된 자바 패키지 트리의 루트에 대한 패키지 상대 경로입니다.

이 경로는 이 라이브러리에 종속된 유휴 소스를 처리할 때 가져오기 루트로 사용됩니다.

idl_import_root가 지정되면 idl_parcelablesidl_srcs는 모두 idl_import_root에서 나타내는 객체의 자바 패키지로 지정된 경로에 있어야 합니다. idl_import_root가 지정되지 않은 경우 idl_parcelablesidl_srcs는 모두 자바 루트의 패키지에서 지정한 경로에 있어야 합니다.

를 참고하세요.

idl_parcelables

List of labels; optional

가져오기로 제공할 Android IDL 정의 목록입니다. 이러한 파일은 이 라이브러리에 종속되거나 직접 과도한 클로저를 통해 android_library 타겟의 가져오기로 제공되지만 자바로 변환되거나 컴파일되지 않습니다.

이 라이브러리의 .java 소스에 직접 상응하는 .aidl 파일만 포함해야 합니다 (예: Parcelable의 맞춤 구현). 그렇지 않으면 idl_srcs를 사용해야 합니다.

이러한 파일은 AIDL 컴파일러가 이러한 파일을 찾을 수 있도록 적절하게 배치되어야 합니다. 자세한 내용은 idl_import_root 설명을 참조하세요.

idl_preprocessed

List of labels; optional

가져오기로 제공할 사전 처리된 Android IDL 정의 목록입니다. 이러한 파일은 이 라이브러리에 종속되거나 직접 과도한 클로저를 통해 android_library 타겟의 가져오기로 제공되지만 자바로 변환되거나 컴파일되지 않습니다.

이 라이브러리의 .java 소스에 직접 대응하는 전처리된 .aidl 파일만 포함해야 합니다 (예: Parcelable의 맞춤 구현). 그렇지 않으면 자바 인터페이스로 변환해야 하는 Android IDL 정의에 idl_srcs를 사용하고 사전 처리되지 않은 AIDL 파일에 idl_parcelable를 사용합니다.

idl_srcs

List of labels; optional

자바 인터페이스로 변환할 Android IDL 정의 목록입니다. 자바 인터페이스가 생성된 후 srcs의 콘텐츠와 함께 컴파일됩니다.

이러한 파일은 이 라이브러리에 종속된 모든 android_library 타겟에 대한 가져오기로 또는 직접 전이 클로저를 통해 사용할 수 있습니다.

이러한 파일은 AIDL 컴파일러가 이러한 파일을 찾을 수 있도록 적절하게 배치되어야 합니다. 자세한 내용은 idl_import_root 설명을 참조하세요.

javacopts

List of strings; optional

이 타겟의 추가 컴파일러 옵션입니다. '변수 만들기' 대체 및 본 셸 토큰화가 적용됩니다.

이러한 컴파일러 옵션은 전역 컴파일러 옵션 이후에 javac에 전달됩니다.

manifest

Label; optional

Android 매니페스트 파일의 이름(일반적으로 AndroidManifest.xml) resource_files 또는 애셋이 정의된 경우 정의해야 합니다.

Boolean; optional; default is False

이 라이브러리는 컴파일에만 사용하고 런타임에는 사용하지 않습니다. neverlink으로 표시된 규칙의 출력은 .apk 생성에 사용되지 않습니다. 실행 중에 런타임 환경에서 라이브러리를 제공하는 경우에 유용합니다.
plugins

List of labels; optional

컴파일 시간에 실행할 자바 컴파일러 플러그인입니다. 이 속성을 빌드할 때마다 플러그인 속성에 지정된 모든 java_plugin가 실행됩니다. 플러그인에서 생성된 리소스는 대상의 결과 jar에 포함됩니다.
proguard_specs

List of labels; optional

Proguard 사양으로 사용할 파일 여기에는 Proguard에서 사용할 사양 모음이 설명되어 있습니다. 지정하면 이 라이브러리에 따라 모든 android_binary 대상에 추가됩니다. 여기에 포함된 파일에는 멱등성 규칙, 즉 -dontnote, -dontwarn, 가정용 효과, -keep으로 시작하는 규칙만 포함되어야 합니다. 비자동 병합을 보장하기 위해 다른 옵션은 android_binary의 proguard_specs에만 표시될 수 있습니다.
resource_files

List of labels; optional

패키징할 리소스의 목록입니다. 일반적으로 res 디렉터리에 있는 모든 파일의 glob입니다.
genrule에서 생성된 파일도 여기에서 Label로 참조할 수 있습니다. 유일한 제한사항은 생성된 출력이 포함된 다른 리소스 파일과 동일한 'res' 디렉터리에 있어야 한다는 것입니다.

Android_계측_테스트

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

android_instrumentation_test 규칙은 Android 계측 테스트를 실행합니다. 에뮬레이터를 시작하고 테스트 중인 애플리케이션, 테스트 애플리케이션, 기타 필요한 애플리케이션을 설치하고 테스트 패키지에 정의된 테스트를 실행합니다.

test_app 속성은 테스트가 포함된 android_binary를 지정합니다. 이 android_binary계측 속성을 통해 테스트 중인 android_binary 애플리케이션을 지정합니다.

# 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: 테스트의 자바 보관 파일입니다.
  • name-src.jar: 소스가 포함된 보관 파일('소스 jar')
  • name_deploy.jar: 배포에 적합한 자바 배포 보관 파일입니다 (명시적으로 요청된 경우에만 빌드됨).

android_local_test와 함께 Robolectric을 사용하려면 Robolectric 저장소WORKSPACE 파일에 추가합니다.

http_archive(
    name = "robolectric",
    urls = ["https://github.com/robolectric/robolectric-bazel/archive/<COMMIT>.tar.gz"],
    strip_prefix = "robolectric-bazel-<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:android-all",
    ],
)

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

인수

속성
name

Name; required

이 타겟의 고유한 이름입니다.

deps

List of labels; optional

테스트할 라이브러리 목록과 타겟에 연결할 추가 라이브러리 이 속성의 전이적 닫힘 상태에서 Android 규칙에 선언된 모든 리소스, 애셋 및 매니페스트 파일을 테스트에 사용할 수 있습니다.

deps에 허용되는 규칙 목록은 android_library, aar_import, java_import, java_library, java_lite_proto_library입니다.

srcs

List of labels; optional

타겟을 만들기 위해 처리되는 소스 파일의 목록입니다. 아래에 설명된 특별한 경우를 제외하고는 필수 항목입니다.

.java 유형의 srcs 파일이 컴파일됩니다. 가독성을 위해 생성된 .java 소스 파일의 이름을 srcs에 넣는 것은 좋지 않습니다. 대신 아래에 설명된 대로 종속 규칙 이름을 srcs에 넣습니다.

.srcjar 유형의 srcs 파일이 압축 해제되고 컴파일됩니다. genrule 또는 build 확장자를 사용하여 .java 파일 세트를 생성해야 하는 경우 유용합니다.

위에 설명된 파일 형식의 파일이 1개 이상 있으면 다른 모든 파일은 무시됩니다. 그렇지 않으면 오류가 발생합니다.

srcs 속성은 필수이며 runtime_deps가 지정되지 않는 한 비워둘 수 없습니다.

custom_package

String; optional

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

이 라이브러리의 추가 컴파일러 옵션입니다. '변수 만들기' 대체 및 본 셸 토큰화가 적용됩니다.

이러한 컴파일러 옵션은 전역 컴파일러 옵션 이후에 javac에 전달됩니다.

jvm_flags

List of strings; optional

이 바이너리를 실행하기 위해 생성된 래퍼 스크립트에 삽입할 플래그 목록입니다. $(location)'변수 만들기' 대체 항목, 본 셸 토큰화가 적용됩니다.

자바 바이너리의 래퍼 스크립트에는 모든 종속 jar을 찾기 위한 CLASSPATH 정의가 포함되어 있으며 올바른 자바 인터프리터를 호출합니다. 래퍼 스크립트에 의해 생성된 명령줄에는 기본 클래스의 이름 뒤에 "$@"가 포함되어 있으므로 클래스 이름 뒤에 다른 인수를 전달할 수 있습니다. 그러나 JVM이 파싱하려는 인수는 명령줄에서 클래스 이름 앞에 지정해야 합니다. 클래스 이름이 나열되기 전에 jvm_flags의 콘텐츠가 래퍼 스크립트에 추가됩니다.

이 속성은 *_deploy.jar 출력에 영향을 미치지 않습니다.

manifest

Label; optional

Android 매니페스트 파일의 이름(일반적으로 AndroidManifest.xml) resource_files 또는 애셋이 정의되었거나 테스트 중인 라이브러리의 매니페스트에 minSdkVersion 태그가 있는 경우 정의해야 합니다.
manifest_values

Dictionary: String -> String; optional

매니페스트에서 재정의할 값 사전입니다. 매니페스트의 모든 ${name} 인스턴스가 이 사전의 이름에 해당하는 값으로 대체됩니다. applicationId, versionCode, versionName, minSdkVersion, targetSdkVersionmaxSdkVersion도 매니페스트 및 uses-sdk 태그의 해당 속성을 재정의합니다. packageName는 무시되며 applicationId(지정된 경우) 또는 패키지의 패키지에서 설정됩니다. manifest_values를 사용하기 위해 규칙에 매니페스트를 포함할 필요는 없습니다.
nocompress_extensions

List of strings; optional

리소스 APK에 압축되지 않은 상태로 두는 파일 확장자 목록입니다.
plugins

List of labels; optional

컴파일 시간에 실행할 자바 컴파일러 플러그인입니다. 이 속성에 지정된 모든 java_plugin는 규칙이 빌드될 때마다 실행됩니다. 라이브러리는 exported_plugins를 사용하는 종속 항목에서 플러그인을 상속할 수도 있습니다. 플러그인에서 생성된 리소스는 이 규칙의 결과 jar에 포함됩니다.
resource_configuration_filters

List of strings; optional

APK의 리소스를 'en' 구성의 리소스로만 제한하는 'en' 등의 리소스 구성 필터 목록입니다.
resource_jars

List of labels; optional

지원 중단됨: 대신 java_import 및 deps 또는runtime_deps를 사용하세요.
resource_strip_prefix

String; optional

자바 리소스에서 제거할 경로 프리픽스입니다.

지정된 경우 이 경로 접두사는 resources 속성의 모든 파일에서 제거됩니다. 리소스 파일이 이 디렉터리에 위치하지 않으면 오류가 발생합니다. 지정하지 않으면 (기본값) 리소스 파일의 경로가 소스 파일의 자바 패키지와 동일한 로직에 따라 결정됩니다. 예를 들어 stuff/java/foo/bar/a.txt의 소스 파일은 foo/bar/a.txt에 있습니다.

runtime_deps

List of labels; optional

최종 바이너리에 제공하거나 런타임에만 테스트하는 라이브러리입니다. 일반 deps와 마찬가지로 이러한 클래스는 런타임 클래스 경로에 나타나지만 컴파일 시간 클래스 경로에는 나타나지 않습니다. 런타임 시에만 필요한 종속 항목을 여기에 나열해야 합니다. 종속 항목 분석 도구는 runtime_depsdeps에 모두 나타나는 타겟을 무시해야 합니다.
stamp

Integer; optional; default is 0

빌드 정보를 바이너리로 인코딩할지 여부입니다. 가능한 값은 다음과 같습니다.
  • stamp = 1: --nostamp 빌드에서도 항상 빌드 정보를 바이너리에 스탬프합니다. 이 설정을 사용해서는 안 됩니다. 바이너리 및 바이너리 종속 항목에 종속되는 모든 다운스트림 작업이 종료될 수 있기 때문입니다.
  • stamp = 0: 항상 빌드 정보를 상수 값으로 바꿉니다. 이렇게 하면 빌드 결과 캐싱이 개선됩니다.
  • stamp = -1: 빌드 정보 삽입은 --[no]stamp 플래그로 제어됩니다.

스탬프 처리된 바이너리는 종속 항목이 변경되지 않는 한 다시 빌드되지 않습니다.

test_class

String; optional

테스트 실행기에서 로드할 자바 클래스입니다.

이 속성은 이 테스트에서 실행할 자바 클래스의 이름을 지정합니다. 이 값을 설정해야 하는 경우는 거의 없습니다. 이 인수를 생략하면 이름이 이 android_local_test 규칙의 name에 해당하는 자바 클래스가 사용됩니다. 테스트 클래스에는 org.junit.runner.RunWith로 주석을 달아야 합니다.

use_launcher

Boolean; optional; default is True

바이너리가 맞춤 런처를 사용해야 하는지 여부입니다.

이 속성을 false로 설정하면 이 타겟의 런처 속성과 관련 --java_launcher 플래그가 무시됩니다.

Android_기기

규칙 소스 보기
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 실행 명령어를 통해 또는 생성된 스크립트를 직접 실행하여 시작할 수 있습니다. 직접 정의하지 말고 기존 android_device 규칙을 활용하는 것이 좋습니다.

이 규칙은 bazel 테스트 및 실행 실행을 위한 --run_under 플래그에 적합한 대상입니다. 에뮬레이터를 시작하고 테스트/실행 중인 타겟을 에뮬레이터에 복사하고 테스트하거나 적절하게 실행합니다.

android_device는 기본 system_image가 X86 기반이고 최대 I686 CPU 아키텍처에 최적화된 경우 KVM 이미지 생성을 지원합니다. 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 연결을 실행하는 포트입니다.
  • --webmasters_port: 에뮬레이터의 텔넷 관리 콘솔을 노출할 포트입니다.
  • --enable_display: true인 경우 에뮬레이터를 표시합니다 (기본값은 false).
  • --action: 시작 또는 종료합니다.
  • --apks_to_install: 에뮬레이터에 설치할 APK 목록입니다.

인수

속성
name

Name; required

이 타겟의 고유한 이름입니다.

cache

Integer; required

에뮬레이터 캐시 파티션의 크기(MB)입니다. 최솟값은 16MB입니다.
default_properties

Label; optional

에뮬레이터의 /default.prop에 배치될 단일 속성 파일입니다. 이를 통해 규칙 작성자는 에뮬레이터를 실제 기기처럼 보이게 구성할 수 있습니다 (특히 사용자 에이전트 문자열과 애플리케이션 또는 서버가 특정 기기와 다르게 동작할 수 있는 기타 동작을 제어함). 이 파일의 속성은 ro.product.model과 같이 에뮬레이터에서 일반적으로 설정하는 읽기 전용 속성을 재정의합니다.
horizontal_resolution

Integer; required

에뮬레이션할 가로 화면 해상도(픽셀)입니다. 최솟값은 240입니다.
platform_apks

List of labels; optional

부팅 시 기기에 설치할 APK 목록입니다.
ram

Integer; required

기기를 에뮬레이션할 메가바이트 단위의 RAM 크기입니다. 기기에 설치된 특정 앱뿐만 아니라 전체 기기에 적용됩니다. 최솟값은 64MB입니다.
screen_density

Integer; required

에뮬레이션된 화면의 밀도(인치당 픽셀)입니다. 최솟값은 30ppi입니다.
system_image

Label; required

다음 파일이 포함된 파일 그룹:
  • system.img: 시스템 파티션
  • kernel-qemu: 에뮬레이터에서 로드할 Linux 커널입니다.
  • ramdisk.img: 부팅 시 사용할 initrd 이미지입니다.
  • userdata.img: 초기 사용자 데이터 파티션
  • source.properties: 이미지에 대한 정보가 포함된 속성 파일
이러한 파일은 Android SDK의 일부이거나 타사에서 제공합니다 (예: Intel은 x86 이미지를 제공함).
vertical_resolution

Integer; required

에뮬레이션할 세로 화면 해상도(픽셀)입니다. 최솟값은 240입니다.
vm_heap

Integer; required

Android가 각 프로세스에 사용할 가상 머신 힙의 크기(MB)입니다. 최솟값은 16MB입니다.

android_ndk_repository

규칙 소스 보기
android_ndk_repository(name, api_level, path, repo_mapping)

네이티브 코드로 Android 타겟 빌드를 지원하도록 Android NDK를 사용하도록 Bazel을 구성합니다.

android_ndk_repository 구현은 Starlark의 구현으로 대체됩니다. 버전 25 이상을 포함한 NDK의 향후 버전에 관한 지원은 Starlark 버전 android_ndk_repository에서 구현됩니다. Starlark 버전은 rules_android_ndk를 참고하세요.

Android용으로 빌드하려면 WORKSPACE 파일에 android_sdk_repository 규칙도 필요합니다.

자세한 내용은 Bazel을 사용한 Android NDK 사용에 관한 전체 문서를 참고하세요.

android_ndk_repository(
    name = "androidndk",
)

위의 예에서는 $ANDROID_NDK_HOME에서 Android NDK를 찾아 지원하는 가장 높은 API 수준을 감지합니다.

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

위의 예에서는 ./android-ndk-r20의 작업공간 내에 있는 Android NDK를 사용합니다. JNI 코드를 컴파일할 때 API 수준 24 라이브러리를 사용합니다.

CPU 기능

Android NDK에는 런타임에 기기의 CPU를 감지하는 데 사용할 수 있는 cpufeatures 라이브러리가 포함되어 있습니다. 다음 예시에서는 Bazel과 함께 cpufeatures를 사용하는 방법을 보여줍니다.

# 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)

로컬 Android SDK를 사용하여 Android 타겟 빌드를 지원하도록 Bazel을 구성합니다.

Bazel용 Android SDK를 설정하기 위한 최솟값은 'androidsdk'라는 android_sdk_repository 규칙을 WORKSPACE 파일에 넣고 $ANDROID_HOME 환경 변수를 Android SDK의 경로로 설정하는 것입니다. Bazel은 기본적으로 Android SDK에 설치된 가장 높은 Android API 수준과 빌드 도구 버전을 사용합니다.
android_sdk_repository(
    name = "androidsdk",
)

재현 가능한 빌드를 보장하기 위해 path, api_levelbuild_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 지원 저장소'로 제공됩니다. 로컬 Maven 저장소로 패키징된 지원 및 AppCompat 라이브러리와 같이 버전이 지정된 일반 Android 라이브러리 집합입니다. android_sdk_repositoryandroid_binaryandroid_library 타겟의 종속 항목에 사용할 수 있는 이러한 각 라이브러리의 Bazel 타겟을 생성합니다.

생성된 타겟의 이름은 @androidsdk//${group}:${artifact}-${version} 형식의 Android 지원 저장소에 있는 라이브러리의 Maven 좌표에서 파생됩니다. 다음 예는 android_library가 v7 appcompat 라이브러리의 버전 25.0.0에 종속되는 방식을 보여줍니다.

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은 이 속성이 지정되었는지 여부와 관계없이 이름이 @androidsdk//:sdk-${level}인 SDK에 설치된 각 API 수준에 android_sdk 타겟을 만듭니다. 예를 들어 기본이 아닌 API 수준을 대상으로 빌드하려면 bazel build --android_sdk=@androidsdk//:sdk-19 //java/com/example:app를 사용합니다.

android_sdk_repository 에서 생성된 모든 android_sdk 대상을 보려면 bazel query "kind(android_sdk, @androidsdk//...)"를 실행하면 됩니다.

build_tools_version

String; optional; nonconfigurable

Android SDK 내에서 사용할 Android 빌드 도구의 버전입니다. 지정하지 않으면 설치된 최신 빌드 도구 버전이 사용됩니다.

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") 내에서 실제로 이 종속 항목을 해결해야 한다고 선언합니다.