이 튜토리얼에서는 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 프로젝트 예시 더보기: <ph type="x-smartling-placeholder">
즐겁게 빌드하세요!