Lưu ý: Có một số giới hạn đã biết khi sử dụng Bazel để tạo ứng dụng Android. Truy cập danh sách khẩn cấp nhóm-Android trên GitHub để xem danh sách các sự cố đã biết. Mặc dù nhóm Bazel và những người đóng góp cho Phần mềm nguồn mở (OSS) nỗ lực tích cực để giải quyết các vấn đề đã biết, nhưng người dùng cần lưu ý rằng Android Studio không chính thức hỗ trợ các dự án Bazel.
Hướng dẫn này trình bày cách tạo một ứng dụng Android đơn giản bằng Bazel.
Bazel hỗ trợ xây dựng ứng dụng Android bằng cách sử dụng Quy tắc của Android.
Hướng dẫn này dành cho người dùng Windows, macOS và Linux và không dành cho người dùng cần có kinh nghiệm về Bazel hoặc phát triển ứng dụng Android. Bạn không cần hãy viết bất kỳ mã Android nào trong hướng dẫn này.
Kiến thức bạn sẽ học được
Trong hướng dẫn này, bạn sẽ tìm hiểu cách:
- Thiết lập môi trường bằng cách cài đặt Bazel và Android Studio, và tải dự án mẫu xuống.
- Thiết lập một không gian làm việc Bazel có chứa mã nguồn
cho ứng dụng và một tệp
WORKSPACE
xác định cấp cao nhất của không gian làm việc. - Cập nhật tệp
WORKSPACE
để chứa tham chiếu đến tham chiếu đến các phần phụ thuộc bên ngoài, chẳng hạn như SDK Android. - Tạo một tệp
BUILD
. - Tạo ứng dụng với Bazel.
- Triển khai và chạy ứng dụng trên trình mô phỏng Android hoặc thiết bị thực.
Trước khi bắt đầu
Cài đặt Bazel
Trước khi bắt đầu hướng dẫn, hãy cài đặt phần mềm sau:
- Bazel. Để cài đặt, hãy làm theo hướng dẫn cài đặt.
- Android Studio. Để cài đặt, hãy làm theo các bước để tải Android xuống Studio. Thực thi trình hướng dẫn thiết lập để tải SDK xuống và định cấu hình môi trường của bạn.
- (Không bắt buộc) Git. Sử dụng
git
để tải dự án ứng dụng Android xuống.
Nhận dự án mẫu
Đối với dự án mẫu, hãy sử dụng một dự án ứng dụng Android cơ bản trong Kho lưu trữ các ví dụ về Bazel.
Ứng dụng này có một nút duy nhất để in lời chào khi được nhấp vào:
Hình 1. Lời chào của nút ứng dụng Android.
Sao chép kho lưu trữ bằng git
(hoặc tải tệp ZIP xuống
trực tiếp):
git clone https://github.com/bazelbuild/examples
Dự án mẫu cho hướng dẫn này nằm trong examples/android/tutorial
. Để
phần còn lại của hướng dẫn, bạn sẽ thực thi các lệnh trong thư mục này.
Xem lại các tệp nguồn
Xem các tệp nguồn cho ứng dụng.
.
├── 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
Các tệp và thư mục quan trọng là:
Tên | Vị trí |
---|---|
Tệp kê khai Android | src/main/AndroidManifest.xml và src/main/java/com/example/bazel/AndroidManifest.xml |
Tệp nguồn Android | src/main/java/com/example/bazel/MainActivity.java và Greeter.java |
Thư mục tệp tài nguyên | src/main/java/com/example/bazel/res/ |
Xây dựng cùng Bazel
Thiết lập không gian làm việc
Không gian làm việc là một thư mục chứa
tệp nguồn cho một hoặc nhiều dự án phần mềm và có một tệp WORKSPACE
ở
thư mục gốc.
Tệp WORKSPACE
có thể trống hoặc có thể chứa thông tin tham chiếu đến bên ngoài
các phần phụ thuộc cần thiết để xây dựng dự án.
Trước tiên, hãy chạy lệnh sau để tạo một tệp WORKSPACE
trống:
Hệ điều hành | Lệnh |
---|---|
Linux, macOS | touch WORKSPACE |
Windows (Trình nhắc lệnh) | type nul > WORKSPACE |
Windows (PowerShell) | New-Item WORKSPACE -ItemType file |
Chạy Bazel
Giờ đây, bạn có thể dùng lệnh để kiểm tra xem Bazel có đang chạy đúng cách hay không:
bazel info workspace
Nếu Bazel in đường dẫn của thư mục hiện tại, bạn đã sẵn sàng! Nếu
Tệp WORKSPACE
không tồn tại, bạn có thể thấy thông báo lỗi như:
ERROR: The 'info' command is only supported from within a workspace.
Tích hợp với SDK Android
Bazel cần chạy SDK Android
công cụ xây dựng
để tạo ứng dụng. Điều này có nghĩa là bạn cần thêm một số thông tin vào
WORKSPACE
để Bazel biết nơi tìm các tệp đó.
Thêm dòng sau vào tệp WORKSPACE
:
android_sdk_repository(name = "androidsdk")
Thao tác này sẽ sử dụng SDK Android tại đường dẫn được ANDROID_HOME
tham chiếu
biến môi trường và tự động phát hiện cấp độ API cao nhất cũng như
phiên bản mới nhất của các công cụ xây dựng được cài đặt trong vị trí đó.
Bạn có thể đặt biến ANDROID_HOME
thành vị trí của SDK Android. Tìm
đường dẫn đến SDK đã cài đặt bằng SDK của Android Studio
Người quản lý.
Giả sử SDK được cài đặt vào các vị trí mặc định, bạn có thể sử dụng các hàm sau
để đặt biến ANDROID_HOME
:
Hệ điều hành | Lệnh |
---|---|
Linux | export ANDROID_HOME=$HOME/Android/Sdk/ |
macOS | export ANDROID_HOME=$HOME/Library/Android/sdk |
Windows (Trình nhắc lệnh) | set ANDROID_HOME=%LOCALAPPDATA%\Android\Sdk |
Windows (PowerShell) | $env:ANDROID_HOME="$env:LOCALAPPDATA\Android\Sdk" |
Các lệnh ở trên chỉ đặt biến cho phiên shell hiện tại. Để thực hiện chúng vĩnh viễn, hãy chạy các lệnh sau:
Hệ điều hành | Lệnh |
---|---|
Linux | echo "export ANDROID_HOME=$HOME/Android/Sdk/" >> ~/.bashrc |
macOS | echo "export ANDROID_HOME=$HOME/Library/Android/Sdk/" >> ~/.bashrc |
Windows (Trình nhắc lệnh) | setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk" |
Windows (PowerShell) | [System.Environment]::SetEnvironmentVariable('ANDROID_HOME', "$env:LOCALAPPDATA\Android\Sdk", [System.EnvironmentVariableTarget]::User) |
Bạn cũng có thể chỉ định rõ ràng đường dẫn tuyệt đối của SDK Android,
cấp độ API và phiên bản của công cụ xây dựng có thể sử dụng bằng cách thêm path
,
Các thuộc tính api_level
và build_tools_version
. Nếu api_level
và
build_tools_version
chưa được chỉ định, quy tắc android_sdk_repository
sẽ
hãy sử dụng phiên bản mới nhất tương ứng
có trong SDK. Bạn có thể chỉ định bất kỳ
tổ hợp của các thuộc tính này, miễn là chúng xuất hiện trong SDK, cho
ví dụ:
android_sdk_repository(
name = "androidsdk",
path = "/path/to/Android/sdk",
api_level = 25,
build_tools_version = "30.0.3"
)
Trên Windows, hãy lưu ý rằng thuộc tính path
phải sử dụng đường dẫn kiểu kết hợp, tức là
là một đường dẫn Windows có dấu gạch chéo lên:
android_sdk_repository(
name = "androidsdk",
path = "c:/path/to/Android/sdk",
)
Không bắt buộc: Nếu muốn biên dịch mã gốc vào ứng dụng Android, bạn có thể
Bạn cũng cần tải ứng dụng Android
NDK
và cho Bazel biết nơi cần tìm tệp này bằng cách thêm dòng sau vào tệp WORKSPACE
của bạn:
android_ndk_repository(name = "androidndk")
Tương tự như android_sdk_repository
, đường dẫn đến Android NDK được suy ra
từ biến môi trường ANDROID_NDK_HOME
theo mặc định. Lộ trình này cũng có thể
được chỉ định rõ ràng bằng thuộc tính path
trên android_ndk_repository
.
Để biết thêm thông tin, hãy đọc bài viết Sử dụng Bộ phát triển mã gốc Android với Bazel.
api_level
là phiên bản API Android mà SDK và NDK
target - ví dụ: 23 đối với Android 6.0 và 25 đối với Android 7.1. Nếu không
được đặt rõ ràng, api_level
mặc định là cấp độ API cao nhất có sẵn cho
android_sdk_repository
và android_ndk_repository
.
Bạn không cần phải đặt các cấp độ API về cùng một giá trị cho SDK và NDK. Trang này chứa bản đồ từ các bản phát hành Android đến các cấp độ API được NDK hỗ trợ.
Tạo tệp BUILD
Tệp BUILD
mô tả mối quan hệ
giữa một tập hợp các kết quả của bản dựng, chẳng hạn như tài nguyên Android được biên dịch từ aapt
hoặc
tệp lớp từ javac
và các phần phụ thuộc của chúng. Những phần phụ thuộc này có thể
tệp nguồn (Java, C++) trong không gian làm việc hoặc dữ liệu đầu ra khác của bản dựng. BUILD
tệp
được viết bằng ngôn ngữ có tên là Starlark.
Tệp BUILD
là một phần của khái niệm trong Bazel được gọi là hệ thống phân cấp gói.
Hệ phân cấp gói là một cấu trúc logic phủ lên thư mục
trong không gian làm việc của bạn. Mỗi gói là một
thư mục (và các thư mục con của thư mục đó) chứa một tập hợp các tệp nguồn liên quan
và một tệp BUILD
. Gói này cũng bao gồm mọi thư mục con, ngoại trừ
những tệp có chứa tệp BUILD
riêng. package name (Tên gói) là đường dẫn đến
BUILD
so với WORKSPACE
.
Lưu ý rằng về mặt lý thuyết, hệ phân cấp gói của Bazel khác với Java
hệ thống phân cấp gói của thư mục Ứng dụng Android, trong đó có tệp BUILD
mặc dù các thư mục có thể được sắp xếp giống nhau.
Đối với ứng dụng Android đơn giản trong hướng dẫn này, các tệp nguồn trong src/main/
bao gồm một gói Bazel. Một dự án phức tạp hơn có thể có nhiều dự án lồng ghép
.
Thêm quy tắc android_library
Tệp BUILD
chứa một số loại nội dung khai báo cho Bazel. Chiến lược phát hành đĩa đơn
loại quan trọng nhất là
xây dựng quy tắc, cho biết
Bazel cách tạo đầu ra phần mềm trung gian hoặc cuối cùng từ một tập hợp nguồn
tệp hoặc các phần phụ thuộc khác. Bazel cung cấp hai quy tắc xây dựng,
android_library
và
android_binary
mà bạn có thể dùng để
tạo ứng dụng Android.
Đối với hướng dẫn này, trước tiên bạn sẽ sử dụng
Quy tắc android_library
để yêu cầu Bazel tạo một thư viện Android
mô-đun
từ mã nguồn và tệp tài nguyên của ứng dụng. Sau đó, bạn sẽ sử dụng
Quy tắc android_binary
để cho Bazel biết cách tạo gói ứng dụng Android.
Tạo một tệp BUILD
mới trong thư mục src/main/java/com/example/bazel
,
và khai báo mục tiêu android_library
mới:
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/**"]),
)
Quy tắc xây dựng android_library
chứa một tập hợp các thuộc tính chỉ định
mà Bazel cần để xây dựng mô-đun thư viện từ các tệp nguồn.
Ngoài ra, xin lưu ý tên quy tắc là greeter_activity
. Bạn sẽ tham khảo
quy tắc sử dụng tên này làm phần phụ thuộc trong quy tắc android_binary
.
Thêm quy tắc android_binary
Quy tắc android_binary
được tạo
gói ứng dụng Android (tệp .apk
) cho ứng dụng của bạn.
Tạo một tệp BUILD
mới trong thư mục src/main/
,
và khai báo mục tiêu android_binary
mới:
src/main/BUILD
:
android_binary(
name = "app",
manifest = "AndroidManifest.xml",
deps = ["//src/main/java/com/example/bazel:greeter_activity"],
)
Ở đây, thuộc tính deps
tham chiếu đến kết quả của quy tắc greeter_activity
mà bạn đã thêm vào tệp BUILD
ở trên. Điều này có nghĩa là khi Bazel tạo
đầu ra của quy tắc này, nó sẽ kiểm tra trước tiên để xem liệu đầu ra của
Quy tắc thư viện greeter_activity
đã được xây dựng và cập nhật. Nếu không, Bazel
tạo bản dựng rồi sử dụng đầu ra đó để tạo tệp gói ứng dụng.
Bây giờ, hãy lưu và đóng tệp.
Xây dựng ứng dụng
Hãy thử tạo ứng dụng! Chạy lệnh sau để tạo
android_binary
mục tiêu:
bazel build //src/main:app
Lệnh con build
hướng dẫn Bazel tạo
mục tiêu nào theo sau. Mục tiêu được chỉ định là tên của quy tắc bản dựng bên trong
một tệp BUILD
, cùng với đường dẫn gói tương ứng với không gian làm việc của bạn
thư mục. Trong ví dụ này, mục tiêu là app
và đường dẫn gói là
//src/main/
.
Lưu ý rằng đôi khi bạn có thể bỏ qua đường dẫn gói hoặc tên mục tiêu, tuỳ thuộc vào thư mục đang làm việc tại dòng lệnh và tên của mục tiêu. Để biết thêm thông tin chi tiết về các nhãn và đường dẫn mục tiêu, hãy xem Nhãn.
Bazel sẽ bắt đầu xây dựng ứng dụng mẫu. Trong quá trình xây dựng, kết quả đầu ra sẽ xuất hiện giống như sau:
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
Xác định vị trí kết quả của bản dựng
Bazel đặt kết quả của cả thao tác xây dựng trung gian và cuối cùng trong một tập hợp
số lượng thư mục đầu ra cho mỗi người dùng trong mỗi không gian làm việc. Các thư mục này có tính liên kết tượng trưng
từ các vị trí sau ở cấp cao nhất của thư mục dự án, trong đó
WORKSPACE
là:
bazel-bin
lưu trữ các tệp thực thi nhị phân và dữ liệu đầu ra của bản dựng có thể chạy khácbazel-genfiles
lưu trữ các tệp nguồn trung gian được tạo bởi Quy tắc Bazelbazel-out
lưu trữ các loại dữ liệu đầu ra khác của bản dựng
Bazel lưu trữ tệp .apk
của Android được tạo bằng quy tắc android_binary
trong thư mục bazel-bin/src/main
, trong đó có tên thư mục con src/main
là
bắt nguồn từ tên của gói Bazel.
Tại dấu nhắc lệnh, hãy liệt kê nội dung của thư mục này và tìm app.apk
tệp:
Hệ điều hành | Lệnh |
---|---|
Linux, macOS | ls bazel-bin/src/main |
Windows (Trình nhắc lệnh) | dir bazel-bin\src\main |
Windows (PowerShell) | ls bazel-bin\src\main |
Chạy ứng dụng
Giờ đây, bạn có thể triển khai ứng dụng cho một thiết bị Android hoặc trình mô phỏng đã kết nối từ
dòng lệnh bằng lệnh bazel
mobile-install
. Lệnh này sử dụng
Cầu gỡ lỗi Android (adb
) để giao tiếp với thiết bị. Bạn phải thiết lập
thiết bị của bạn để sử dụng adb
theo hướng dẫn trong bài viết Gỡ lỗi Android
Cầu nối trước khi triển khai. Bạn
cũng có thể chọn cài đặt ứng dụng đó trên trình mô phỏng Android có trong Android
Studio. Hãy đảm bảo trình mô phỏng đang chạy trước khi thực thi lệnh bên dưới.
Nhập thông tin sau:
bazel mobile-install //src/main:app
Tiếp theo, tìm và khởi chạy "Ứng dụng hướng dẫn Baazel":
Hình 2. Ứng dụng hướng dẫn Bazel.
Xin chúc mừng! Bạn vừa cài đặt ứng dụng Android đầu tiên do Bazel tạo.
Xin lưu ý rằng lệnh con mobile-install
cũng hỗ trợ
Cờ --incremental
có thể dùng để
chỉ triển khai những phần ứng dụng đã thay đổi kể từ lần triển khai gần đây nhất.
Mã này cũng hỗ trợ cờ --start_app
để khởi động ứng dụng ngay lập tức
cài đặt ứng dụng đó.
Tài liệu đọc thêm
Để biết thêm chi tiết, hãy xem các trang sau:
- Vấn đề mở trên GitHub
- Thông tin khác về cài đặt trên thiết bị di động
- Tích hợp các phần phụ thuộc bên ngoài như AppCompat, Guava và JUnit từ Maven kho lưu trữ bằng rules_jvm_external
- Chạy chương trình kiểm thử Robolectric bằng robolectric-bazel tích hợp.
- Kiểm thử ứng dụng bằng Kiểm thử đo lường Android
- Tích hợp mã C và C++ vào ứng dụng Android bằng NDK
- Xem thêm các dự án mẫu về Bazel của:
Chúc bạn tạo dựng thành công!