참고: Android 앱을 빌드하는 데 Bazel을 사용하는 것에는 알려진 제한 사항이 있습니다. GitHub 팀-Android 핫리스트를 방문하여 알려진 문제 목록을 확인하세요. Bazel팀과 오픈소스 소프트웨어 (OSS) 참여자들이 알려진 문제를 해결하기 위해 적극적으로 노력하고 있지만, 사용자는 Android 스튜디오가 Bazel 프로젝트를 공식적으로 지원하지 않는다는 점을 알고 있어야 합니다.
이 튜토리얼에서는 Bazel을 사용하여 간단한 Android 앱을 빌드하는 방법을 다룹니다.
Bazel은 다음을 사용하여 Android 앱 빌드를 지원합니다. Android 규칙.
이 튜토리얼은 Windows, macOS 및 Linux 사용자를 대상으로 하며 Bazel 또는 Android 앱 개발 경험이 있어야 합니다. 당신이 이 튜토리얼에서 모든 Android 코드를 작성할 수 있습니다.
학습할 내용
이 튜토리얼에서는 다음 방법을 알아봅니다.
- Bazel 및 Android 스튜디오를 설치하여 환경을 설정합니다. 샘플 프로젝트 다운로드
- 소스 코드가 포함된 Bazel 작업공간 설정
앱의 최상위 수준을 식별하는
WORKSPACE
파일 작업공간 디렉터리에 표시됩니다 - 필요한
WORKSPACE
외부 종속 항목(예: Android SDK) BUILD
파일을 만듭니다.- Bazel을 사용하여 앱을 빌드합니다.
- Android Emulator 또는 실제 기기에 앱을 배포하고 실행합니다.
시작하기 전에
Bazel 설치
가이드를 시작하기 전에 다음 소프트웨어를 설치하세요.
- Bazel 연결입니다 설치하려면 설치 안내를 따르세요.
- Android 스튜디오 설치하려면 Android 다운로드 단계를 따르세요. Studio에 오신 것을 환영합니다. 설정 마법사를 실행하여 SDK를 다운로드하고 환경을 구성합니다.
- (선택사항) Git.
git
를 사용하여 Android 앱 프로젝트를 다운로드합니다.
샘플 프로젝트 가져오기
샘플 프로젝트의 경우 Bazel의 예시 저장소
이 앱에는 클릭 시 인사말을 출력하는 단일 버튼이 있습니다.
그림 1. Android 앱 버튼 인사말
git
로 저장소를 클론합니다 (또는 ZIP 파일 다운로드).
직접):
git clone https://github.com/bazelbuild/examples
이 가이드의 샘플 프로젝트는 examples/android/tutorial
에 있습니다. 대상
이 디렉터리의 명령어를 실행하게 됩니다.
소스 파일 검토
앱의 소스 파일을 살펴보세요.
.
├── README.md
└── src
└── main
├── AndroidManifest.xml
└── java
└── com
└── example
└── bazel
├── AndroidManifest.xml
├── Greeter.java
├── MainActivity.java
└── res
├── layout
│ └── activity_main.xml
└── values
├── colors.xml
└── strings.xml
주요 파일과 디렉터리는 다음과 같습니다.
이름 | 위치 |
---|---|
Android 매니페스트 파일 | src/main/AndroidManifest.xml 및 src/main/java/com/example/bazel/AndroidManifest.xml |
Android 소스 파일 | src/main/java/com/example/bazel/MainActivity.java 및 Greeter.java |
리소스 파일 디렉터리 | src/main/java/com/example/bazel/res/ |
Bazel을 사용하여 빌드
작업공간 설정
작업공간은
하나 이상의 소프트웨어 프로젝트에 대한 소스 파일이며, 다음 위치에 WORKSPACE
파일이 있습니다.
기억하시죠.
WORKSPACE
파일이 비어 있거나 외부에 대한 참조가 포함되어 있을 수 있습니다.
필요한 모든 종속 항목을 제공합니다.
먼저 다음 명령어를 실행하여 빈 WORKSPACE
파일을 만듭니다.
OS | 명령어 |
---|---|
Linux, macOS | touch WORKSPACE |
Windows (명령 프롬프트) | type nul > WORKSPACE |
Windows(PowerShell) | New-Item WORKSPACE -ItemType file |
실행 중인 Bazel
이제 다음 명령어를 사용하여 Bazel이 올바르게 실행되는지 확인할 수 있습니다.
bazel info workspace
Bazel이 현재 디렉터리의 경로를 출력하면 계속 진행해도 됩니다. 만약
WORKSPACE
파일이 없으면 다음과 같은 오류 메시지가 표시될 수 있습니다.
ERROR: The 'info' command is only supported from within a workspace.
Android SDK와 통합
Bazel은 Android SDK를 실행해야 함
빌드 도구
앱을 빌드할 수 있습니다. 즉, 결제 계정에 몇 가지 정보를 추가해야
WORKSPACE
파일을 업로드하여 Bazel이 파일을 찾을 위치를 알 수 있도록 합니다.
WORKSPACE
파일에 다음 줄을 추가합니다.
android_sdk_repository(name = "androidsdk")
이렇게 하면 ANDROID_HOME
에서 참조하는 경로에서 Android SDK가 사용됩니다.
환경 변수를 선언하고 가장 높은 API 레벨과
해당 위치에 설치된 최신 버전의 빌드 도구를 사용할 수 있습니다.
ANDROID_HOME
변수를 Android SDK의 위치로 설정할 수 있습니다. Find(찾기)
Android 스튜디오의 SDK를 사용하여 설치된 SDK의 경로
관리자를 선택합니다.
SDK가 기본 위치에 설치되어 있다고 가정하면 다음을 사용할 수 있습니다.
ANDROID_HOME
변수를 설정하는 방법은 다음과 같습니다.
OS | 명령어 |
---|---|
Linux | export ANDROID_HOME=$HOME/Android/Sdk/ |
macOS | export ANDROID_HOME=$HOME/Library/Android/sdk |
Windows (명령 프롬프트) | set ANDROID_HOME=%LOCALAPPDATA%\Android\Sdk |
Windows(PowerShell) | $env:ANDROID_HOME="$env:LOCALAPPDATA\Android\Sdk" |
위의 명령어는 현재 셸 세션에 대해서만 변수를 설정합니다. 만들기 영구적인 경우 다음 명령어를 실행합니다.
OS | 명령어 |
---|---|
Linux | echo "export ANDROID_HOME=$HOME/Android/Sdk/" >> ~/.bashrc |
macOS | echo "export ANDROID_HOME=$HOME/Library/Android/Sdk/" >> ~/.bashrc |
Windows (명령 프롬프트) | setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk" |
Windows(PowerShell) | [System.Environment]::SetEnvironmentVariable('ANDROID_HOME', "$env:LOCALAPPDATA\Android\Sdk", [System.EnvironmentVariableTarget]::User) |
Android SDK의 절대 경로를 명시적으로 지정할 수도 있습니다.
path
api_level
및 build_tools_version
속성 api_level
및
build_tools_version
를 지정하지 않으면 android_sdk_repository
규칙이
각 최신 버전을 사용해야 합니다. 원하는
이러한 속성을 조합하여 사용할 수 있습니다.
예:
android_sdk_repository(
name = "androidsdk",
path = "/path/to/Android/sdk",
api_level = 25,
build_tools_version = "30.0.3"
)
Windows의 경우 path
속성이 혼합 스타일 경로를 사용해야 합니다.
슬래시가 있는 Windows 경로입니다.
android_sdk_repository(
name = "androidsdk",
path = "c:/path/to/Android/sdk",
)
선택사항: 네이티브 코드를 Android 앱에 컴파일하려면 다음을 수행합니다.
Android용 Android 버전
NDK
WORKSPACE
파일에 다음 줄을 추가하여 Bazel에 파일을 찾을 위치를 알려줍니다.
android_ndk_repository(name = "androidndk")
android_sdk_repository
와 유사하게 Android NDK 경로가 추론됨
기본적으로 ANDROID_NDK_HOME
환경 변수에서 삭제합니다. 경로는 또한
android_ndk_repository
에서 path
속성을 사용하여 명시적으로 지정되어야 합니다.
자세한 내용은 Android Native Development Kit 사용 Bazel
api_level
은 SDK 및 NDK가 사용하는 Android API 버전입니다.
target - 예를 들어 Android 6.0의 경우 23, Android 7.1의 경우 25입니다. 그렇지 않은 경우
명시적으로 설정된 경우 api_level
는 기본적으로
android_sdk_repository
및 android_ndk_repository
.
SDK 및 NDK에 대해 API 수준을 동일한 값으로 설정할 필요는 없습니다. 이 페이지 에는 Android 릴리스에서 NDK 지원 API 레벨까지의 맵이 포함됩니다.
BUILD 파일 만들기
BUILD
파일은 관계를 설명합니다.
빌드 출력 집합(예: aapt
의 컴파일된 Android 리소스 또는
클래스 파일과 javac
의 종속 항목을 다운로드합니다. 이러한 종속 항목은
작업공간 또는 기타 빌드 출력의 소스 파일 (Java, C++)입니다. 파일 BUILD
개
Starlark라는 언어로 작성되어 있습니다.
BUILD
파일은 Bazel에서 패키지 계층 구조라고 하는 개념의 일부입니다.
패키지 계층 구조는 디렉터리를 오버레이하는 논리적 구조
살펴보겠습니다 각 패키지는
관련 소스 파일 세트가 포함된 디렉터리 및 하위 디렉터리
및 BUILD
파일 또한 패키지에는 다음을 제외한 모든 하위 디렉터리가 포함됩니다.
자체 BUILD
파일이 포함된 파일을 반환합니다. 패키지 이름은
WORKSPACE
를 기준으로 한 BUILD
파일입니다.
Bazel의 패키지 계층 구조는 Java 패키지 계층 구조와 개념적으로
BUILD
파일이 있는 Android App 디렉터리의 패키지 계층 구조
와 같은 시스템 폴더이며, 디렉터리는 동일하게 구성될 수도 있습니다.
이 튜토리얼에 나오는 간단한 Android 앱의 경우 src/main/
에 있는 소스 파일
단일 Bazel 패키지로 구성됩니다. 더 복잡한 프로젝트에는 많은 중첩이 있을 수 있습니다.
패키지입니다
android_library 규칙 추가
BUILD
파일에는 Bazel에 관한 여러 유형의 선언이 포함되어 있습니다. 이
가장 중요한 유형은
빌드 규칙을 사용하여
Bazel을 통해 소스 세트에서 중간 또는 최종 소프트웨어 출력을 빌드하는 방법
다른 종속 항목이 포함됩니다 Bazel은 두 가지 빌드 규칙을 제공합니다.
android_library
및
android_binary
를 사용하여
Android 앱을 빌드할 수 있습니다.
이 가이드에서는 먼저
Bazel에 Android 라이브러리를 빌드하도록 지시하는 android_library
규칙
모듈
앱 소스 코드 및 리소스 파일에서 추출하는 데 사용됩니다. 그런 다음
android_binary
규칙을 사용하여 Bazel에 Android 애플리케이션 패키지 빌드 방법을 알립니다.
src/main/java/com/example/bazel
디렉터리에 새 BUILD
파일을 만듭니다.
새 android_library
타겟을 선언합니다.
src/main/java/com/example/bazel/BUILD
:
package(
default_visibility = ["//src:__subpackages__"],
)
android_library(
name = "greeter_activity",
srcs = [
"Greeter.java",
"MainActivity.java",
],
manifest = "AndroidManifest.xml",
resource_files = glob(["res/**"]),
)
android_library
빌드 규칙에는
Bazel이 소스 파일에서 라이브러리 모듈을 빌드하는 데 필요한 정보를 제공합니다.
또한 규칙의 이름은 greeter_activity
입니다. 이 실습에서
android_binary
규칙에서 이 이름을 종속 항목으로 사용하는 규칙을 생성합니다.
android_binary 규칙 추가
android_binary
규칙 빌드
앱의 Android 애플리케이션 패키지 (.apk
파일)입니다.
src/main/
디렉터리에 새 BUILD
파일을 만듭니다.
새 android_binary
타겟을 선언합니다.
src/main/BUILD
:
android_binary(
name = "app",
manifest = "AndroidManifest.xml",
deps = ["//src/main/java/com/example/bazel:greeter_activity"],
)
여기서 deps
속성은 greeter_activity
규칙의 출력을 참조합니다.
위의 BUILD
파일에 추가합니다. 즉, Bazel이
먼저 이 규칙의 출력이 해당 패턴의 출력이
라이브러리 규칙 greeter_activity
개가 빌드되었으며 최신 버전입니다. 그렇지 않은 경우 Bazel
빌드한 다음 해당 출력을 사용하여 애플리케이션 패키지 파일을 빌드합니다.
이제 파일을 저장하고 닫습니다.
앱 빌드
앱을 만들어 보세요. 다음 명령어를 실행하여
목표 android_binary
개:
bazel build //src/main:app
build
하위 명령어는 Bazel에게
지정할 수 있습니다. 대상은 내부에 있는 빌드 규칙의 이름으로 지정됩니다.
작업공간을 기준으로 한 패키지 경로와 함께 BUILD
파일
디렉터리 이 예시에서 타겟은 app
이고 패키지 경로는
//src/main/
입니다.
대상에 따라 패키지 경로나 대상 이름을 생략할 수도 현재 작업 디렉터리와 타겟 이름을 찾을 수 있습니다. 대상 라벨 및 경로에 대한 자세한 내용은 라벨을 참조하세요.
Bazel이 샘플 앱 빌드를 시작합니다. 빌드 프로세스 중에 출력은 다음과 유사하게 표시됩니다.
INFO: Analysed target //src/main:app (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //src/main:app up-to-date:
bazel-bin/src/main/app_deploy.jar
bazel-bin/src/main/app_unsigned.apk
bazel-bin/src/main/app.apk
빌드 출력 찾기
Bazel은 중간 빌드 작업과 최종 빌드 작업의 출력을 하나의 세트에 배치합니다.
출력 디렉터리에 저장됩니다. 이러한 디렉터리는 심볼릭 링크로
프로젝트 디렉터리의 최상위에 있는 다음 위치에서
WORKSPACE
는 다음과 같습니다.
bazel-bin
는 바이너리 실행 파일 및 기타 실행 가능한 빌드 출력을 저장합니다.bazel-genfiles
는 Bazel 규칙bazel-out
는 다른 유형의 빌드 출력을 저장함
Bazel은 android_binary
규칙으로 생성된 Android .apk
파일을 저장합니다.
bazel-bin/src/main
디렉터리에 있음. 여기서 하위 디렉터리 이름 src/main
는
Bazel 패키지의 이름에서 파생됩니다.
명령 프롬프트에서 이 디렉터리의 콘텐츠를 나열하고 app.apk
를 찾습니다.
파일:
OS | 명령어 |
---|---|
Linux, macOS | ls bazel-bin/src/main |
Windows (명령 프롬프트) | dir bazel-bin\src\main |
Windows(PowerShell) | ls bazel-bin\src\main |
앱 실행
이제 다음을 통해 연결된 Android 기기나 에뮬레이터에 앱을 배포할 수 있습니다.
명령줄에서 bazel
mobile-install
명령어를 사용합니다. 이 명령어는
Android 디버그 브리지 (adb
)를 통해 기기와 통신합니다. 다음을 설정해야 합니다.
기기에서 Android 디버그의 안내에 따라 adb
를 사용하도록 설정합니다.
브리지를 사용해 배포하세요. 나
또한 Android에 포함된 Android Emulator에 앱을 설치하도록 선택할 수 있으며
있습니다. 아래 명령어를 실행하기 전에 에뮬레이터가 실행 중인지 확인하세요.
다음을 입력합니다.
bazel mobile-install //src/main:app
그런 다음 'Bazel 튜토리얼 앱'을 찾아 실행합니다.
그림 2. Bazel 튜토리얼 앱
축하합니다. Bazel에서 빌드한 첫 번째 Android 앱을 설치했습니다.
mobile-install
하위 명령어는
--incremental
플래그:
마지막 배포 이후 변경된 앱 부분만 배포합니다.
또한 --start_app
플래그를 지원하여 앱이 실행되는 즉시 앱을 시작합니다.
설치할 수 있습니다.
추가 자료
자세한 내용은 다음 페이지를 참고하세요.
- GitHub에서 미해결 문제
- mobile-install에 대해 자세히 알아보기
- Maven의 AppCompat, Guava, JUnit과 같은 외부 종속 항목 통합 rules_jvm_external을 사용하는 저장소
- robolectric-bazel을 사용하여 Robolectric 테스트 실행 통합할 수 있습니다
- Android 계측 테스트로 앱 테스트
- NDK를 사용하여 C 및 C++ 코드를 Android 앱에 통합
- 다음 Bazel 프로젝트 예시 더보기:
즐겁게 빌드하세요!