Android 규칙

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

규칙

Android 바이너리

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 제약 조건이 있는 android_library, java_library 및 Android 타겟 플랫폼용 .so 네이티브 라이브러리를 래핑하거나 생성하는 cc_library입니다.
srcs

List of labels; optional

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

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

.srcjar 유형의 srcs 파일이 압축 해제되고 컴파일됩니다. 이 기능은 genrule 또는 빌드 확장자를 사용하여 .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를 1개 이상 생성합니다. 따라서 출시 바이너리의 경우 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

기본 dex에 보관해야 하는 클래스를 결정하는 데 Proguard 사양으로 사용할 파일입니다. 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가 legacy으로 설정되면 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_XA 또는 ar_XB 의사 로케일을 포함하세요.
resource_files

List of labels; optional

패키징할 리소스 목록입니다. 일반적으로 res 디렉터리 아래에 있는 모든 파일의 glob입니다.
여기에서 genrules의 생성된 파일을 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_가져오기

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 번들입니다. 전환 폐쇄는 포함되어 있지 않습니다.

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 제약 조건이 있는 android_library, java_library 및 Android 타겟 플랫폼용 .so 네이티브 라이브러리를 래핑하거나 생성하는 cc_library입니다.
srcs

List of labels; optional

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

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

.srcjar 유형의 srcs 파일이 압축 해제되고 컴파일됩니다. 이 기능은 genrule 또는 빌드 확장자를 사용하여 .java 파일 집합을 생성해야 하는 경우에 유용합니다.

srcs을 생략하면 deps에 지정된 모든 종속 항목이 이 규칙에서 내보내집니다 (종속 항목 내보내기에 대한 자세한 내용은 java_library's 내보내기 참고). 그러나 이 동작은 곧 지원 중단될 예정이므로 이 동작에 의존하지 마세요.

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은 속한 규칙의 직접 Dep가 아닙니다.

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입니다.
여기에서 genrules의 생성된 파일을 Label로 참조할 수도 있습니다. 유일한 제한은 생성된 출력이 포함된 다른 리소스 파일과 동일한 '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_binary instruments 속성을 통해 테스트 중인 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 로컬 테스트

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/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

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

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

.srcjar 유형의 srcs 파일이 압축 해제되고 컴파일됩니다. 이 기능은 genrule 또는 빌드 확장자를 사용하여 .java 파일 집합을 생성해야 하는 경우에 유용합니다.

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

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' #구성의 리소스로만 제한하는 리소스 구성 필터의 목록.
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로 설정하면 이 타겟에서 launcher 속성 및 관련 --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 Emulator를 만듭니다. 이 에뮬레이터는 bazel 실행 명령어를 통해 또는 생성된 스크립트를 직접 실행하여 시작할 수 있습니다. 직접 정의하는 대신 기존 android_device 규칙을 사용하는 것이 좋습니다.

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

기본 system_image가 X86 기반이고 최대 I686 CPU 아키텍처에 최적화된 경우 android_device가 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 Connect를 실행할 포트입니다.
  • -- Emulator_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

기기에 에뮬레이션할 램 크기(MB)입니다. 기기에 설치된 특정 앱뿐만 아니라 전체 기기에 적용됩니다. 최솟값은 64MB입니다.
screen_density

Integer; required

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

Label; required

다음 파일을 포함하는 파일 그룹:
  • system.img: 시스템 파티션
  • kernel-qemu: 에뮬레이터가 로드할 Linux 커널
  • ramdisk.img: 부팅 시 사용할 초기 이미지
  • userdata.img: 초기 userdata 파티션
  • 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 NDK를 사용하여 네이티브 코드로 Android 타겟을 빌드하도록 Bazel을 구성합니다.

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과 함께 CPU 기능을 사용하는 방법을 보여줍니다.

# 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를 설정하려면 최소한 WORKSPACE 파일에 "androidsdk" android_sdk_repository 규칙을 입력하고 $ANDROID_HOME 환경 변수를 Android SDK의 경로로 설정해야 합니다. Bazel은 기본적으로 가장 높은 Android API 수준과 빌드 도구 버전을 Android SDK에 설치합니다.
android_sdk_repository(
    name = "androidsdk",
)

재현 가능한 빌드를 보장하기 위해 path, api_level, build_tools_version 속성을 특정 값으로 설정할 수 있습니다. Android SDK에 지정된 API 수준이나 빌드 도구 버전이 설치되어 있지 않으면 빌드가 실패합니다.

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

위의 예시는 Android SDK에 대한 작업공간 기준 경로를 사용하는 방법도 보여줍니다. 이 방법은 Android SDK가 Bazel 작업공간에 속한 경우에 유용합니다 (예: 버전 제어에 체크인된 경우).

지원 라이브러리

지원 라이브러리는 Android SDK Manager에서 'Android 지원 저장소'로 사용할 수 있습니다. Support 및 AppCompat 라이브러리와 같이 로컬 Maven 저장소로 패키징된 버전 지정된 일반 Android 라이브러리 집합입니다. android_sdk_repository는 이러한 각 라이브러리의 android_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

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