Khi triển khai các dự án Android dựa trên nền tảng SDK của SoC nhà sản xuất, đặc biệt là trong mô hình GRF (Google Requirements Freeze), việc quản lý cấu hình build đóng vai trò quan trọng. Cơ chế này yêu cầu SoC sau khi được khóa tính năng ở một phiên bản Android nhất định thì sẽ duy trì ổn định qua ít nhất 4 thế hệ nâng cấp tiếp theo, giảm thiểu tác động lên vendor.
Cấu trúc nguồn và quy trình hợp nhất
Đối với các chip hỗ trợ GRF, quy trình xây dựng firmware bao gồm hai bước chính:
- Bán kính thấp (BSP/Vendor): Sử dụng SDK GRF để compile các thành phần liên quan đến phần cứng.
- Bán kính cao (Frameworks/App): Compile các thành phần ứng dụng và framework hệ thống.
Sau đó, hai phần này sẽ được merge lại để tạo ra bản build hoàn chỉnh phục vụ cho mục đích thử nghiệm hoặc thương mại hóa.
Danh sách hỗ trợ
Đối với dòng chip Rockchip phổ biến, khả năng tương thích với chuẩn GRF Android 15+ như sau:
| Chip Set | Phiên bản GRF | Android 15+ | Android 16+ | Android 17+ |
|---|---|---|---|---|
| RK3326 | 14 | Hỗ trợ | Hỗ trợ | Hỗ trợ |
| RK356x | 14 | Hỗ trợ | Hỗ trợ | Hỗ trợ |
| RK3588 | 14 | Hỗ trợ | Hỗ trợ | Hỗ trợ |
| RK3399 | 14 | Hỗ trợ | Hỗ trợ | Hỗ trợ |
Từ Android 15 trở đi, cấu trúc thư mục nguồn thường được phân chia thành hai kho lưu trữ riêng biệt: tầng dưới (urelease) và tầng trên (vrelease). Do đó, việc thêm một tùy chọn lunch mới cần đồng thời cập nhật cả hai nơi.
1. Thực hiện thêm tùy chọn Lunch
1.1. Tại thư mục Urelease
Bạn cần chỉnh sửa file định nghĩa làm việc chính tại đường dẫn thiết bị. File AndroidProducts.mk là điểm khởi đầu quan trọng để khai báo các tập tin sản phẩm và danh sách lựa chọn.
# Đường dẫn root là .\urelease\device\rockchip\rk3588\
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/rk3588_s/rk3588_s.mk \
$(LOCAL_DIR)/rk3588_t/rk3588_t.mk \
$(LOCAL_DIR)/rk3588_u/rk3588_u.mk \
# Thêm dòng mới sau đây
$(LOCAL_DIR)/my_variant/custom_variant.mk \
COMMON_LUNCH_CHOICES := \
rk3588_s-userdebug \
rk3588_s-user \
rk3588_t-userdebug \
rk3588_t-user \
rk3588_u-userdebug \
rk3588_u-user \
# Thêm dòng mới vào đây
my_variant-userdebug \
my_variant-user
Tiếp theo, sao chép toàn bộ thư mục của một cấu hình đã có sẵn (ví dụ: rk3588_u) và đặt tên mới (ví dụ: custom_variant). Sau đó, sửa đổi file .mk chính bên trong thư mục đó:
# File: custom_variant.mk PRODUCT_SHIPPING_API_LEVEL := 35 PRODUCT_DTBO_TEMPLATE := $(LOCAL_PATH)/dt-overlay.in include device/rockchip/common/build/rockchip/DynamicPartitions.mk # Thay đổi đường dẫn include BoardConfig include device/rockchip/rk3588/custom_variant/BoardConfig.mk include device/rockchip/common/BoardConfig.mk DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/../overlay # Cấu hình đặc điểm thiết bị PRODUCT_CHARACTERISTICS := tablet PRODUCT_NAME := custom_variant PRODUCT_DEVICE := custom_variant PRODUCT_MODEL := rk3588_sample # Các thuộc tính mặc định khác PRODUCT_PROPERTY_OVERRIDES += ro.sf.lcd_density=320 PRODUCT_PROPERTY_OVERRIDES += persist.wifi.sleep.delay.ms=0 $(call inherit-product, vendor/partner_modules/build/mainline_modules.mk)
Lưu ý: Tham số PRODUCT_DEVICE phải khớp với tên mà bạn sử dụng trong lệnh lunch. Nếu không khớp, quá trình biên dịch sẽ thất bại.
1.2. Tại thư mục Vrelease
Tương tự như tầng dưới, tại thư mục vrelease, bạn cũng cần bổ sung mục cấu hình mới vào file AndroidProducts.mk. Sự khác biệt nằm ở cách tham chiếu các biến, ví dụ như sự tồn tại của biến ap4a trong một số trường hợp cụ thể, hãy đảm bảo cú pháp tuân thủ đúng chuẩn định dạng của dự án.
Để kiểm tra kết quả, chạy lệnh lunch trên terminal. Bạn sẽ thấy tùy chọn mới xuất hiện trong danh sách:
Các cấu hình có sẵn: 1. custom_variant-user 2. custom_variant-userdebug ...
Với các nền tảng không phải Rockchip, nguyên tắc vẫn giữ nguyên: tìm đến vị trí tương ứng trong cây thư mục nguồn và điều chỉnh file cấu hình tương ứng.
2. Tùy chỉnh chuỗi Fingerprint
Fingerprint (chữ ký nhận dạng) là chuỗi định danh duy nhất dùng cho máy chủ OTA và xác minh phiên bản build. Logic sinh ra chuỗi này nằm trong file core/sysprop.mk:
ifeq (,$(strip $(BUILD_FINGERPRINT))) BUILD_FINGERPRINT := $(PRODUCT_BRAND)/$(TARGET_PRODUCT)/$(TARGET_DEVICE):$(PLATFORM_VERSION)/$(BUILD_ID)/$(BUILD_NUMBER_FROM_FILE):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS) endif
Chuỗi kết quả được xây dựng dựa trên sự kết hợp của các biến sau:
- PRODUCT_BRAND: Thương hiệu thiết bị (thường được đặt trong file .mk).
- TARGET_PRODUCT: Tên sản phẩm mục tiêu (được chọn khi chạy menu lunch).
- TARGET_DEVICE: Mã thiết bị mục tiêu (cần cập nhật lại khi tạo lunch mới).
- PLATFORM_VERSION: Số version nền tảng Android (ví dụ: 14, 15).
- BUILD_ID: Ký hiệu định danh xây dựng cụ thể.
- BUILD_NUMBER_FROM_FILE: Số đếm chi tiết xác định phiên bản.
- TARGET_BUILD_VARIANT: Loại bản build (eng, userdebug, user).
- BUILD_VERSION_TAGS: Thẻ bảo mật (dev-keys, release-keys).