Hướng dẫn dành cho Bazel: Tạo ứng dụng Android

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Báo cáo vấn đề Xem nguồn

Hướng dẫn này trình bày cách tạo ứng dụng Android đơn giản bằng Bazel.

Bazel hỗ trợ xây dựng ứng dụng Android bằng quy tắc Android.

Hướng dẫn này dành cho người dùng Windows, macOS và Linux và không yêu cầu kinh nghiệm phát triển ứng dụng Bazel hoặc Android. Bạn không cần phải 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, rồi 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 thư mục không gian làm việc.
  • Cập nhật tệp WORKSPACE để chứa tệp tham chiếu đến các phần phụ thuộc bên ngoài bắt buộc, như SDK Android.
  • Tạo tệp BUILD.
  • Tạo ứng dụng bằng 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 tế.

Trước khi bắt đầu

Cài đặt Bazel

Trước khi bạn 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 Studio xuống. 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.

Tải dự án mẫu

Đối với dự án mẫu, hãy sử dụng dự án ứng dụng Android cơ bản trong Kho lưu trữ mẫu của Brazil.

Ứng dụng này có một nút duy nhất in ra lời chào khi được nhấp vào:

Lời chào nút

Hình 1. Lời chào nút ứng dụng Android.

Hãy sao chép kho lưu trữ bằng git (hoặc tải tệp ZIP trực tiếp xuống):

git clone https://github.com/bazelbuild/examples

Dự án mẫu cho hướng dẫn này nằm trong examples/android/tutorial. Trong 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 chính là:

Tên Vị trí
Tệp kê khai Android src/main/AndroidManifest.xmlsrc/main/java/com/example/bazel/AndroidManifest.xml
Tệp nguồn Android src/main/java/com/example/bazel/MainActivity.javaGreeter.java
Thư mục tệp tài nguyên src/main/java/com/example/bazel/res/

Xây dựng bằ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 các tệp nguồn của một hoặc nhiều dự án phần mềm và có một tệp WORKSPACE ở gốc.

Tệp WORKSPACE có thể trống hoặc có thể chứa các tệp tham chiếu đến các phần phụ thuộc bên ngoài cần thiết để tạo 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 (Lời nhắc lệnh) type nul > WORKSPACE
Windows (PowerShell) New-Item WORKSPACE -ItemType file

Chạy Bazel

Giờ đây, bạn có thể kiểm tra xem Bazel có đang chạy đúng cách hay không bằng lệnh sau đây:

bazel info workspace

Nếu Bazel in đường dẫn của thư mục hiện tại thì 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 Android SDK công cụ xây dựng để tạo ứng dụng. Tức là bạn cần thêm một số thông tin vào tệp WORKSPACE để Bazel biết vị trí tìm các ứng dụng đó.

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 tham chiếu bởi biến môi trường ANDROID_HOME 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 tại 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 cách sử dụng Trình quản lý SDK của Android Studio. Giả sử SDK được cài đặt theo vị trí mặc định, bạn có thể sử dụng các lệnh 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 (Lời 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. Để thiết lập vĩnh viễn các lệnh này, 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 (Lời 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õ đường dẫn tuyệt đối của SDK Android, cấp độ API và phiên bản của các công cụ xây dựng cần sử dụng bằng cách đưa vào các thuộc tính path, api_levelbuild_tools_version. Nếu bạn không chỉ định api_levelbuild_tools_version, thì quy tắc android_sdk_repository sẽ sử dụng phiên bản mới nhất tương ứng có sẵn trong SDK. Ví dụ: bạn có thể chỉ định bất kỳ kiểu kết hợp nào của các thuộc tính này, miễn là các thuộc tính đó có trong SDK:

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 hỗn hợp, tức là đườ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ũng cần tải Android Android NDK xuống và cho Bazel biết vị trí của mã bằng cách thêm dòng sau vào tệp WORKSPACE:

android_ndk_repository(name = "androidndk")

Tương tự như android_sdk_repository, theo mặc định, đường dẫn đến Android NDK được suy ra từ biến môi trường ANDROID_NDK_HOME. Bạn cũng có thể chỉ định đường dẫn một cách 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 gốc của Android với Bazel.

api_level là phiên bản API Android mà SDK và NDK nhắm đến – ví dụ: 23 đối với Android 6.0 và 25 đối với Android 7.1. Nếu bạn không đặt chính sách này, api_level sẽ mặc định được đặt ở cấp độ API cao nhất cho android_sdk_repositoryandroid_ndk_repository.

Bạn không cần phải đặt các cấp độ API thành 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 tới 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 đầu ra của bản dựng, chẳng hạn như các tài nguyên Android được biên dịch từ aapt hoặc các tệp lớp từ javac và các phần phụ thuộc của những tệp đó. Những phần phụ thuộc này có thể là tệp nguồn (Java, C++) trong không gian làm việc của bạn hoặc các kết quả của bản dựng khác. Tệp BUILD được viết bằng một ngôn ngữ có tên Starlark.

Tệp BUILD là một phần của một khái niệm trong Bazel, được gọi là hệ phân cấp gói. Hệ thống phân cấp gói là cấu trúc logic phủ lên cấu trúc 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 thư mục con chứa tệp BUILD riêng. Tên gói là đường dẫn đến tệp BUILD tương ứng với WORKSPACE.

Xin lưu ý rằng về mặt khái niệm, hệ phân cấp gói của Bazel khác với hệ phân cấp gói Java của thư mục Ứng dụng Android, nơi đặt tệp BUILD, mặc dù các thư mục đó có thể được sắp xếp giống hệt 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 duy nhất. Một dự án phức tạp hơn có thể có nhiều gói lồng ghép.

Thêm quy tắc android_library

Tệp BUILD chứa nhiều loại khai báo khác nhau cho Bazel. Loại quan trọng nhất là quy tắc xây dựng cho Bazel biết 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 các tệp nguồn hoặc các phần phụ thuộc khác. Bazel cung cấp 2 quy tắc tạo bản dựng, android_libraryandroid_binary mà bạn có thể sử 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 xây dựng mô-đun thư viện Android từ mã nguồn ứng dụng và tệp tài nguyên. Sau đó, bạn sẽ sử dụng quy tắc android_binary để cho Bazel biết cách xây dựng gói ứng dụng Android.

Tạo 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 thông tin mà Bazel cần để tạo mô-đun thư viện từ tệp nguồn. Ngoài ra, hãy lưu ý rằng tên của quy tắc là greeter_activity. Bạn sẽ tham chiếu đến quy tắc bằng cách 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 xây dựng gói ứng dụng Android (tệp .apk) cho ứng dụng của bạn.

Tạo 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 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, trước tiên, công cụ này sẽ kiểm tra xem kết quả của quy tắc thư viện greeter_activity đã được xây dựng hay chưa và đã được cập nhật hay chưa. Nếu không, Bazel sẽ tạo tệp đó rồi sử dụng kết quả đó để tạo tệp gói ứng dụng.

Bây giờ, hãy lưu và đóng tệp.

Tạo ứng dụng

Hãy thử xây dựng ứng dụng! Chạy lệnh sau để tạo mục tiêu android_binary:

bazel build //src/main:app

Lệnh con build hướng dẫn Bazel xây dựng mục tiêu sau. Mục tiêu được chỉ định làm tên của quy tắc xây dựng bên trong tệp BUILD, cùng với đường dẫn gói liên quan đến thư mục không gian làm việc của bạn. Trong ví dụ này, mục tiêu là app và đường dẫn gói là //src/main/.

Xin 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, tùy thuộc vào thư mục hoạt động hiện tại của bạn ở dòng lệnh và tên của mục tiêu. Để biết thêm thông tin chi tiết về nhãn mục và đường dẫn, 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ả của ứng dụng sẽ xuất hiện tương tự 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

Tìm kết quả của bản dựng

Bazel đặt kết quả của cả thao tác bản dựng trung gian và bản dựng cuối cùng vào một tập hợp thư mục đầu ra cho mỗi người dùng, trên mỗi không gian làm việc. Các thư mục này được liên kết với nhau 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à các đầu ra của bản dựng có thể chạy khác
  • bazel-genfiles lưu trữ các tệp nguồn trung gian được tạo bởi các quy tắc Brazil
  • bazel-out lưu trữ các loại dữ liệu đầu ra của bản dựng khác

Bazel lưu trữ tệp Android .apk được tạo bằng quy tắc android_binary trong thư mục bazel-bin/src/main, trong đó tên thư mục con src/main được lấy từ tên của gói Bazel.

Khi có lời nhắc lệnh, hãy liệt kê nội dung của thư mục này và tìm tệp app.apk:

Hệ điều hành Lệnh
Linux, macOS ls bazel-bin/src/main
Windows (Lời nhắc lệnh) dir bazel-bin\src\main
Windows (PowerShell) ls bazel-bin\src\main

Chạy ứng dụng

Bạn hiện có thể triển khai ứng dụng cho một thiết bị Android hoặc trình mô phỏng được 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ị để sử dụng adb theo hướng dẫn trong Cầu gỡ lỗi Android 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 đưa vào Android Studio. Đả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ẫnBazel":

Ứng dụng hướng dẫn Bazel

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.

Lưu ý rằng lệnh con mobile-install cũng hỗ trợ cờ --incremental chỉ có thể được dùng để triển khai các phần của ứ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 sau khi cài đặt.

Đọc thêm

Để biết thêm thông tin chi tiết, hãy xem các trang sau:

Chúc bạn xây dựng vui vẻ!