Android 규칙

문제 신고 소스 보기 Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

규칙

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: 이 타겟의 전이 폐쇄가 포함된 Java 보관 파일입니다.

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

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

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

인수

속성
name

이름: 필수사항

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

deps

라벨 목록입니다. 기본값은 []입니다.

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

라벨 목록입니다. 기본값은 []입니다.

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

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

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

assets

라벨 목록입니다. 기본값은 []입니다.

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

문자열, 기본값은 ""입니다.

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

불리언. 기본값은 True입니다.

PNG 크런칭 여부 이는 항상 실행되는 9패치 처리와는 무관합니다. 이는 aapt2에서 수정된 aapt 버그에 관한 지원 중단된 해결 방법입니다.
custom_package

문자열, 기본값은 ""입니다.

Java 소스가 생성될 Java 패키지입니다. 기본적으로 패키지는 규칙이 포함된 BUILD 파일이 있는 디렉터리에서 추론됩니다. 다른 패키지를 지정할 수도 있지만 런타임에만 감지되는 다른 라이브러리와의 클래스 경로 충돌이 발생할 수 있으므로 권장하지 않습니다.
debug_key

라벨: 기본값은 "@bazel_tools//tools/android:debug_keystore"입니다.

디버그 APK에 서명하는 데 사용할 디버그 키 저장소가 포함된 파일입니다. 일반적으로 기본 키 이외의 키를 사용하지 않으므로 이 속성은 생략해야 합니다.

경고: 프로덕션 키를 사용하지 마세요. 프로덕션 키는 엄격하게 보호되어야 하며 소스 트리에 보관해서는 안 됩니다.

debug_signing_keys

라벨 목록입니다. 기본값은 []입니다.

디버그 APK에 서명하는 데 사용할 파일, 디버그 키 저장소 목록입니다. 일반적으로 기본 키 이외의 키를 사용하지 않으므로 이 속성은 생략해야 합니다.

경고: 프로덕션 키를 사용하지 마세요. 프로덕션 키는 엄격하게 보호되어야 하며 소스 트리에 보관해서는 안 됩니다.

debug_signing_lineage_file

라벨: 기본값은 None입니다.

debug_signing_keys의 서명 계보가 포함된 파일입니다. 일반적으로 기본 키 이외의 키를 사용하지 않으므로 이 속성은 생략해야 합니다.

경고: 프로덕션 키를 사용하지 마세요. 프로덕션 키는 엄격하게 보호되어야 하며 소스 트리에 보관해서는 안 됩니다.

densities

문자열 목록입니다. 기본값은 []입니다.

APK를 빌드할 때 필터링할 밀도입니다. 이렇게 하면 지정된 화면 밀도의 기기에서 로드되지 않는 래스터 드로어블 리소스가 제거되어 APK 크기가 줄어듭니다. 매니페스트에 아직 상위 집합 목록이 포함되어 있지 않은 경우 상응하는 호환되는 화면 섹션도 매니페스트에 추가됩니다.
dex_shards

정수, 기본값은 1

색인을 생성할 샤드 수입니다. 이렇게 하면 앱 설치 및 시작 시간이 느려지지만 훨씬 더 빠르게 디렉스할 수 있습니다. 바이너리가 클수록 더 많은 샤드를 사용해야 합니다. 실험을 시작할 때는 25가 적합한 값입니다.

각 샤드로 인해 최종 앱에 하나 이상의 dex가 생성됩니다. 따라서 출시 바이너리에는 이 값을 1보다 크게 설정하지 않는 것이 좋습니다.

dexopts

문자열 목록입니다. 기본값은 []입니다.

classes.dex를 생성할 때 dx 도구에 추가되는 명령줄 플래그입니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.
enable_data_binding

불리언. 기본값은 False입니다.

이 속성이 true이면 이 규칙은 resource_files 속성을 통해 포함된 레이아웃 리소스의 데이터 결합 표현식을 처리합니다. 이 설정이 없으면 데이터 결합 표현식이 빌드 실패를 일으킵니다.

데이터 결합으로 Android 앱을 빌드하려면 다음 작업도 실행해야 합니다.

  1. 이 규칙에 전이적으로 종속되는 모든 Android 규칙에 이 속성을 설정합니다. 이는 종속 항목이 리소스 병합을 통해 규칙의 데이터 결합 표현식을 상속하기 때문입니다. 따라서 이러한 표현식을 파싱하려면 데이터 결합으로 빌드해야 합니다.
  2. 이 속성을 설정하는 모든 타겟에 데이터 결합 런타임 라이브러리의 deps = 항목을 추가합니다. 이 라이브러리의 위치는 저장소 설정에 따라 다릅니다.
incremental_dexing

정수, 구성 불가, 기본값은 -1입니다.

기본값 및 --incremental_dexing 플래그를 재정의하여 증분 디렉싱 유무와 관계없이 타겟이 빌드되도록 강제합니다.
instruments

라벨: 기본값은 None입니다.

계측할 android_binary 타겟입니다.

이 속성이 설정되면 이 android_binary는 계측 테스트의 테스트 애플리케이션으로 취급됩니다. 그러면 android_instrumentation_test 타겟은 test_app 속성에서 이 타겟을 지정할 수 있습니다.

javacopts

문자열 목록입니다. 기본값은 []입니다.

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

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

key_rotation_min_sdk

문자열, 기본값은 ""입니다.

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

라벨: 기본값은 None입니다.

텍스트 파일에는 클래스 파일 이름 목록이 포함됩니다. 이러한 클래스 파일로 정의된 클래스는 기본 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

문자열 목록입니다. 기본값은 []입니다.

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

라벨 목록입니다. 기본값은 []입니다.

기본 DEX에 보관해야 하는 클래스를 결정하기 위한 Proguard 사양으로 사용되는 파일입니다. multidex 속성이 legacy로 설정된 경우에만 허용됩니다.
manifest

라벨: 필수사항

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

사전: 문자열 -> 문자열, 기본값은 {}입니다.

매니페스트에서 재정의할 값의 사전입니다.

매니페스트의 모든 ${name} 인스턴스는 이 사전의 이름에 해당하는 값으로 대체됩니다.

applicationId, versionCode, versionName, minSdkVersion, targetSdkVersion, maxSdkVersion는 매니페스트 및 uses-sdk 태그의 해당 속성도 재정의합니다.

packageName는 무시되며 지정된 경우 applicationId 또는 매니페스트의 패키지에서 설정됩니다.

manifest_mergerlegacy로 설정되면 applicationId, versionCode, versionName만 영향을 미칩니다.

multidex

문자열, 기본값은 "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

문자열 목록입니다. 기본값은 []입니다.

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

정수, 기본값은 0

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

자세한 내용은 AAPT2의 --package-id 인수를 참고하세요. 일반적으로 이 값은 설정하지 않아도 되며 설정하지 않으면 기본값 127(0x7F)이 됩니다.

plugins

라벨 목록입니다. 기본값은 []입니다.

컴파일 시 실행되는 Java 컴파일러 플러그인 plugins 속성에 지정된 모든 java_plugin는 이 타겟이 빌드될 때마다 실행됩니다. 플러그인에서 생성된 리소스는 타겟의 결과 jar에 포함됩니다.
proguard_apply_dictionary

라벨: 기본값은 None입니다.

Proguard의 매핑으로 사용되는 파일입니다. 난독화 중에 클래스 및 멤버의 이름을 바꿀 때 가져올 '단어'의 줄로 구분된 파일입니다.
proguard_apply_mapping

라벨: 기본값은 None입니다.

Proguard의 매핑으로 사용되는 파일입니다. 새 빌드에 동일한 매핑을 적용하는 데 재사용하기 위해 proguard_generate_mapping에서 생성된 매핑 파일입니다.
proguard_generate_mapping

불리언. 구성 불가. 기본값은 False입니다.

Proguard 매핑 파일을 생성할지 여부입니다. 매핑 파일은 proguard_specs가 지정된 경우에만 생성됩니다. 이 파일에는 원래 클래스, 메서드, 필드 이름과 난독 처리된 클래스, 메서드, 필드 이름 간의 매핑이 나열됩니다.

경고: 이 속성을 사용하는 경우 Proguard 사양에 -dontobfuscate 또는 -printmapping가 포함되어서는 안 됩니다.

proguard_specs

라벨 목록입니다. 기본값은 []입니다.

Proguard 사양으로 사용되는 파일입니다. 이 파일은 Proguard에서 사용할 사양 집합을 설명합니다.
resource_configuration_filters

문자열 목록입니다. 기본값은 []입니다.

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

라벨 목록입니다. 기본값은 []입니다.

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

정수, 기본값은 -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

이름: 필수사항

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

aar

라벨: 필수사항

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

라벨 목록입니다. 기본값은 []입니다.

이 규칙에 종속된 규칙으로 내보낼 타겟입니다. java_library.exports를 참고하세요.
srcjar

라벨: 기본값은 None입니다.

AAR에 컴파일된 JAR 파일의 소스 코드가 포함된 JAR 파일입니다.

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: 이 타겟의 Java 보관 파일 및 리소스가 포함된 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

이름: 필수사항

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

deps

라벨 목록입니다. 기본값은 []입니다.

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

라벨 목록입니다. 기본값은 []입니다.

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

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

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

srcs를 생략하면 deps에 지정된 모든 종속 항목이 이 규칙에서 내보내집니다. 종속 항목 내보내기에 관한 자세한 내용은 java_library의 내보내기를 참고하세요. 그러나 이 동작은 곧 지원 중단될 예정이므로 사용하지 않는 것이 좋습니다.

assets

라벨 목록입니다. 기본값은 []입니다.

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

문자열, 기본값은 ""입니다.

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

문자열, 기본값은 ""입니다.

Java 소스가 생성될 Java 패키지입니다. 기본적으로 패키지는 규칙이 포함된 BUILD 파일이 있는 디렉터리에서 추론됩니다. 다른 패키지를 지정할 수도 있지만 런타임에만 감지되는 다른 라이브러리와의 클래스 경로 충돌이 발생할 수 있으므로 권장하지 않습니다.
enable_data_binding

불리언. 기본값은 False입니다.

이 속성이 true이면 이 규칙은 resource_files 속성을 통해 포함된 레이아웃 리소스의 데이터 결합 표현식을 처리합니다. 이 설정이 없으면 데이터 결합 표현식이 빌드 실패를 일으킵니다.

데이터 결합으로 Android 앱을 빌드하려면 다음 작업도 실행해야 합니다.

  1. 이 규칙에 전이적으로 종속되는 모든 Android 규칙에 이 속성을 설정합니다. 이는 종속 항목이 리소스 병합을 통해 규칙의 데이터 결합 표현식을 상속하기 때문입니다. 따라서 이러한 표현식을 파싱하려면 데이터 결합으로 빌드해야 합니다.
  2. 이 속성을 설정하는 모든 타겟에 데이터 결합 런타임 라이브러리의 deps = 항목을 추가합니다. 이 라이브러리의 위치는 저장소 설정에 따라 다릅니다.
exported_plugins

라벨 목록입니다. 기본값은 []입니다.

이 라이브러리에 직접 종속된 라이브러리로 내보낼 java_plugin (예: 주석 처리기) 목록입니다.

지정된 java_plugin 목록은 이 라이브러리에 직접 종속되는 모든 라이브러리에 적용됩니다. 마치 해당 라이브러리가 plugins에서 이러한 라벨을 명시적으로 선언한 것처럼 말입니다.

exports

라벨 목록입니다. 기본값은 []입니다.

exports 속성을 통해 도달한 모든 규칙의 폐쇄는 exports를 사용하여 타겟에 직접 종속되는 규칙의 직접 종속 항목으로 간주됩니다.

exports는 속한 규칙의 직접적인 종속 항목이 아닙니다.

exports_manifest

정수, 기본값은 1

이 타겟에 종속된 android_binary 타겟으로 매니페스트 항목을 내보낼지 여부입니다. uses-permissions 속성은 내보내지 않습니다.
idl_import_root

문자열, 기본값은 ""입니다.

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

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

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

예시를 참고하세요.

idl_parcelables

라벨 목록입니다. 기본값은 []입니다.

가져오기로 제공할 Android IDL 정의 목록입니다. 이러한 파일은 이 라이브러리에 직접 또는 전이 폐쇄를 통해 종속되는 모든 android_library 타겟의 가져오기로 제공되지만 Java로 변환되거나 컴파일되지는 않습니다.

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

이러한 파일은 aidl 컴파일러가 찾을 수 있도록 적절하게 배치해야 합니다. 이 의미에 관한 자세한 내용은 idl_import_root 설명을 참고하세요.

idl_preprocessed

라벨 목록입니다. 기본값은 []입니다.

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

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

idl_srcs

라벨 목록입니다. 기본값은 []입니다.

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

이러한 파일은 이 라이브러리에 직접 또는 전이 폐쇄를 통해 종속되는 모든 android_library 타겟의 가져오기로 제공됩니다.

이러한 파일은 aidl 컴파일러가 찾을 수 있도록 적절하게 배치해야 합니다. 이 의미에 관한 자세한 내용은 idl_import_root 설명을 참고하세요.

javacopts

문자열 목록입니다. 기본값은 []입니다.

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

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

manifest

라벨: 기본값은 None입니다.

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

불리언. 기본값은 False입니다.

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

라벨 목록입니다. 기본값은 []입니다.

컴파일 시 실행되는 Java 컴파일러 플러그인 plugins 속성에 지정된 모든 java_plugin는 이 타겟이 빌드될 때마다 실행됩니다. 플러그인에서 생성된 리소스는 타겟의 결과 jar에 포함됩니다.
proguard_specs

라벨 목록입니다. 기본값은 []입니다.

Proguard 사양으로 사용되는 파일입니다. 여기에는 Proguard에서 사용할 사양 집합이 설명됩니다. 지정하면 이 라이브러리에 종속된 모든 android_binary 타겟에 추가됩니다. 여기에 포함된 파일에는 -dontnote, -dontwarn, assumenosideeffects, -keep으로 시작하는 규칙과 같은 일관된 규칙만 있어야 합니다. 다른 옵션은 중복 삭제되지 않는 병합을 보장하기 위해 android_binary의 proguard_specs에만 표시될 수 있습니다.
resource_files

라벨 목록입니다. 기본값은 []입니다.

패키징할 리소스 목록입니다. 일반적으로 res 디렉터리에 있는 모든 파일의 glob입니다.
생성된 파일 (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 계측 테스트를 실행합니다. 에뮬레이터를 시작하고 테스트 중인 애플리케이션, 테스트 애플리케이션, 기타 필요한 애플리케이션을 설치하고 테스트 패키지에 정의된 테스트를 실행합니다.

test_app 속성은 테스트가 포함된 android_binary를 지정합니다. 이 android_binaryinstruments 속성을 통해 테스트 중인 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

이름: 필수사항

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

support_apks

라벨 목록입니다. 기본값은 []입니다.

계측 테스트가 시작되기 전에 기기에 설치할 다른 APK입니다.
target_device

라벨: 필수사항

테스트가 실행되어야 하는 android_device입니다.

이미 실행 중인 에뮬레이터 또는 실제 기기에서 테스트를 실행하려면 다음 인수를 사용하세요. --test_output=streamed --test_arg=--device_broker_type=LOCAL_ADB_SERVER --test_arg=--device_serial_number=$device_identifier

test_app

라벨: 필수사항

테스트 클래스가 포함된 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 배포 보관 파일입니다 (명시적으로 요청된 경우에만 빌드됨).

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

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

이름: 필수사항

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

deps

라벨 목록입니다. 기본값은 []입니다.

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

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

srcs

라벨 목록입니다. 기본값은 []입니다.

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

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

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

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

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

custom_package

문자열, 기본값은 ""입니다.

R 클래스가 생성될 Java 패키지입니다. 기본적으로 패키지는 규칙이 포함된 BUILD 파일이 있는 디렉터리에서 추론됩니다. 이 속성을 사용하는 경우 test_class도 사용해야 할 수 있습니다.
densities

문자열 목록입니다. 기본값은 []입니다.

APK를 빌드할 때 필터링할 밀도입니다. 매니페스트에 아직 상위 집합 StarlarkListing이 포함되어 있지 않은 경우 상응하는 호환되는 화면 섹션도 매니페스트에 추가됩니다.
enable_data_binding

불리언. 기본값은 False입니다.

이 속성이 true이면 이 테스트에서 사용하는 데이터 결합 지원 종속 항목에 사용되는 데이터 결합 참조를 이 규칙이 처리합니다. 이 설정이 없으면 데이터 결합 종속 항목에 필요한 바이너리 수준 코드 생성이 없으며 빌드 실패가 발생할 수 있습니다.
javacopts

문자열 목록입니다. 기본값은 []입니다.

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

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

jvm_flags

문자열 목록입니다. 기본값은 []입니다.

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

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

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

manifest

라벨: 기본값은 None입니다.

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

사전: 문자열 -> 문자열, 기본값은 {}입니다.

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

문자열 목록입니다. 기본값은 []입니다.

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

라벨 목록입니다. 기본값은 []입니다.

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

문자열 목록입니다. 기본값은 []입니다.

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

라벨 목록입니다. 기본값은 []입니다.

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

문자열, 기본값은 ""입니다.

Java 리소스에서 제거할 경로 접두사입니다.

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

runtime_deps

라벨 목록입니다. 기본값은 []입니다.

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

정수, 기본값은 0

빌드 정보를 바이너리로 인코딩할지 여부입니다. 가능한 값은 다음과 같습니다.
  • stamp = 1: --nostamp 빌드에서도 항상 빌드 정보를 바이너리에 스탬프합니다. 바이너리 및 바이너리에 종속된 모든 다운스트림 작업의 원격 캐싱을 중지할 수 있으므로 이 설정은 피해야 합니다.
  • stamp = 0: 항상 빌드 정보를 상수 값으로 대체합니다. 이렇게 하면 빌드 결과 캐싱이 향상됩니다.
  • stamp = -1: 빌드 정보의 삽입은 --[no]stamp 플래그에 의해 제어됩니다.

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

test_class

문자열, 기본값은 ""입니다.

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

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

use_launcher

불리언. 기본값은 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 규칙을 사용하는 것이 좋습니다.

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

android_device는 기본 system_image가 X86 기반이고 최대 I686 CPU 아키텍처에 최적화된 경우 KVM 이미지 생성을 지원합니다. KVM을 사용하려면 android_device 규칙에 tags = ['requires-kvm'] 를 추가합니다.

암시적 출력 타겟

  • 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: 에뮬레이터의 텔넷 관리 콘솔을 노출할 포트입니다.
  • --enable_display: true인 경우 디스플레이로 에뮬레이터를 시작합니다 (기본값은 false).
  • --action: 시작 또는 종료 중 하나입니다.
  • --apks_to_install: 에뮬레이터에 설치할 APK 목록입니다.

인수

속성
name

이름: 필수사항

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

cache

정수, 필수사항

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

라벨: 기본값은 None입니다.

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

정수, 필수사항

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

라벨 목록입니다. 기본값은 []입니다.

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

정수, 필수사항

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

정수, 필수사항

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

라벨: 필수사항

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

정수, 필수사항

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

정수, 필수사항

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

android_ndk_repository

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

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

android_ndk_repository 구현은 Starlark의 구현으로 대체되고 있습니다. 버전 25 이상을 비롯한 향후 NDK 버전 지원은 android_ndk_repository의 Starlark 버전에서 구현됩니다. 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 라이브러리를 사용합니다.

cpufeatures

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

이름: 필수사항

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

api_level

정수, 구성 불가, 기본값은 0입니다.

빌드할 Android API 수준입니다. 지정하지 않으면 설치된 가장 높은 API 수준이 사용됩니다.
path

문자열, 구성 불가, 기본값은 ""입니다.

Android NDK의 절대 경로 또는 상대 경로입니다. 이 속성 또는 $ANDROID_NDK_HOME 환경 변수를 설정해야 합니다.

Android NDK는 Android 개발자 사이트 에서 다운로드할 수 있습니다.

repo_mapping

사전: 문자열 -> 문자열, 기본값은 {}입니다.

로컬 저장소 이름을 글로벌 저장소 이름으로 변환하는 사전입니다. 이를 통해 이 저장소의 종속 항목에 대한 워크스페이스 종속 항목 확인을 제어할 수 있습니다.

예를 들어 항목 "@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를 설정하는 최소한의 작업은 WORKSPACE 파일에 'androidsdk'라는 이름의 android_sdk_repository 규칙을 배치하고 $ANDROID_HOME 환경 변수를 Android SDK의 경로로 설정하는 것입니다. Bazel은 기본적으로 Android SDK에 설치된 가장 높은 Android API 수준 및 빌드 도구 버전을 사용합니다.
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 지원 저장소'로 사용할 수 있습니다. 지원 및 AppCompat 라이브러리와 같은 일반적인 Android 라이브러리의 버전 설정된 세트로, 로컬 Maven 저장소로 패키징됩니다. android_sdk_repositoryandroid_binaryandroid_library 타겟의 종속 항목에 사용할 수 있는 각 라이브러리의 Bazel 타겟을 생성합니다.

생성된 타겟의 이름은 Android 지원 저장소에 있는 라이브러리의 Maven 좌표에서 파생되며 형식은 @androidsdk//${group}:${artifact}-${version}입니다. 다음 예는 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

이름: 필수사항

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

api_level

정수, 구성 불가, 기본값은 0입니다.

기본적으로 빌드할 Android API 수준입니다. 지정하지 않으면 설치된 가장 높은 API 수준이 사용됩니다.

지정된 빌드에 사용되는 API 수준은 android_sdk 플래그로 재정의할 수 있습니다. android_sdk_repository는 이 속성이 지정되었는지 여부와 관계없이 SDK에 설치된 각 API 수준의 android_sdk 타겟을 이름이 @androidsdk//:sdk-${level}인 것으로 만듭니다. 예를 들어 기본이 아닌 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

문자열, 구성 불가, 기본값은 ""입니다.

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

Bazel을 사용하려면 빌드 도구 버전 30.0.0 이상이 필요합니다.

path

문자열, 구성 불가, 기본값은 ""입니다.

Android SDK의 절대 경로 또는 상대 경로입니다. 이 속성 또는 $ANDROID_HOME 환경 변수를 설정해야 합니다.

Android SDK는 Android 개발자 사이트에서 다운로드할 수 있습니다.

repo_mapping

사전: 문자열 -> 문자열, 기본값은 {}입니다.

로컬 저장소 이름을 글로벌 저장소 이름으로 변환하는 사전입니다. 이를 통해 이 저장소의 종속 항목에 대한 워크스페이스 종속 항목 확인을 제어할 수 있습니다.

예를 들어 항목 "@foo": "@bar"는 이 저장소가 "@foo"에 종속될 때마다 (예: "@foo//some:target"에 대한 종속 항목) 전역적으로 선언된 "@bar" ("@bar//some:target") 내에서 실제로 해당 종속 항목을 확인해야 한다고 선언합니다.