Zalo Inbox

[00] Cấu trúc của một device trong Android 15


  • author-image

    devlinux

  • blog-tag aosp, aaos
  • blog-comment 0 Bình luận
  • blog-comment 58 Views
  • created-date 16 Feb, 2025
blog-image


Cấu trúc thư mục của một device trong mã nguồn Android (Android Open Source Project - AOSP) chứa các tập tin và thư mục cần thiết để cấu hình và hỗ trợ thiết bị phần cứng cụ thể. Đây là nơi chứa các thiết lập dành riêng cho thiết bị, từ kernel, driver đến các service và chính sách bảo mật.

Dưới đây là giải thích về các thư mục và file quan trọng trong cấu trúc thư mục android/device/brcm/rpi4:

1. File Cấu Hình (.mk, .bp)

Tên File Mô Tả
Android.bp Cấu hình build system sử dụng Bazel/Blueprint để định nghĩa cách build các module.
AndroidProducts.mk Liệt kê các file .mk chứa thông tin cấu hình cho các product/device.
aosp_rpi4_car.mk Cấu hình chi tiết cho AOSP Raspberry Pi 4 Car.
aosp_rpi4.mk Cấu hình chi tiết cho AOSP Raspberry Pi 4 mặc định.
aosp_rpi4_tv.mk Cấu hình chi tiết cho AOSP Raspberry Pi 4 TV.
BoardConfig.mk Cấu hình thông số phần cứng cho board (phân vùng, kernel, bootloader, v.v.).
device.mk Cấu hình tổng thể cho device, bao gồm module, overlay và các tham chiếu liên quan.
manifest.xml File XML định nghĩa các thư viện, tài nguyên cần thiết cho thiết bị.
framework_compatibility_matrix.xml Định nghĩa các yêu cầu compatibility cho framework của thiết bị.
compatibility_matrix.xml Xác định các yêu cầu về compatibility (phần cứng, phần mềm) cho thiết bị.

1.1. Cấu hình chính của thiết bị

1.1.1. AndroidProducts.mk

PRODUCT_MAKEFILES := \
    $(LOCAL_DIR)/aosp_rpi4.mk \
    $(LOCAL_DIR)/aosp_rpi4_car.mk \
    $(LOCAL_DIR)/aosp_rpi4_tv.mk

COMMON_LUNCH_CHOICES := \
    aosp_rpi4-trunk_staging-userdebug \
    aosp_rpi4_car-trunk_staging-userdebug \
    aosp_rpi4_tv-trunk_staging-userdebug

a. PRODUCT_MAKEFILES** Đây là danh sách các tệp .mk định nghĩa cấu hình chi tiết của các sản phẩm Android mà thiết bị hỗ trợ. Các tệp này nằm trong thư mục device/ và chứa thông tin như tên sản phẩm, overlay, thư viện, driver, và các tính năng cụ thể.

Trong đoạn mã:

PRODUCT_MAKEFILES := \
    $(LOCAL_DIR)/aosp_rpi4.mk \
    $(LOCAL_DIR)/aosp_rpi4_car.mk \
    $(LOCAL_DIR)/aosp_rpi4_tv.mk
  • $(LOCAL_DIR): Tham chiếu đến đường dẫn hiện tại của thư mục chứa file AndroidProducts.mk.
  • aosp_rpi4.mk: Cấu hình cơ bản cho Raspberry Pi 4.
  • aosp_rpi4_car.mk: Cấu hình cho Raspberry Pi 4 bản Android Automotive.
  • aosp_rpi4_tv.mk: Cấu hình cho Raspberry Pi 4 phiên bản Android TV.

b. COMMON_LUNCH_CHOICES** Đây là danh sách các cấu hình được hiển thị khi sử dụng lệnh lunch để chọn mục tiêu build trong môi trường phát triển Android.

Trong đoạn mã:

COMMON_LUNCH_CHOICES := \
    aosp_rpi4-trunk_staging-userdebug \
    aosp_rpi4_car-trunk_staging-userdebug \
    aosp_rpi4_tv-trunk_staging-userdebug
  • aosp_rpi4_car: Tên sản phẩm, tương ứng với file aosp_rpi4_car.mk.
  • trunk_staging: Nhánh phát triển hiện tại hoặc phiên bản mà cấu hình này áp dụng.
  • userdebug: Loại build. Có các tùy chọn sau:
    • user: Build tối ưu hóa và bảo mật cao, không bao gồm công cụ debug (dành cho sản phẩm cuối cùng).
    • userdebug: Giống user, nhưng có thêm công cụ debug dành cho nhà phát triển.
    • eng: Build đầy đủ quyền truy cập và tính năng debug, chủ yếu dành cho việc phát triển.

1.1.2. aosp_rpi4_car.mk

File aosp_rpi4_car.mk định nghĩa các cấu hình cụ thể cho việc build Android Automotive trên Raspberry Pi 4. File aosp_rpi4_car.mk còn được gọi là product makefile trong AOSP, tập trung vào các tính năng và thành phần cần thiết cho hệ thống Android Automotive.

File aosp_rpi4_car.mk thực hiện các cấu hình:

  • Các thành phần dành riêng cho Android Automotive, như Car Audio, Bluetooth, mạng CAN, EVS, và Vehicle Service.
  • Quyền và các file cấu hình để hỗ trợ các tính năng trong Automotive.
  • Tối ưu hóa cho phần cứng Raspberry Pi 4.

1.2. Cấu hình phần cứng

1.2.1. BoardConfig.mk

File BoardConfig.mk được sử dụng trong AOSP để định nghĩa các cấu hình phần cứng và hệ thống liên quan đến thiết bị (ở đây là Raspberry Pi 4 - RPi4).

DEVICE_PATH := device/brcm/rpi4

# Platform
TARGET_NO_BOOTLOADER := true
TARGET_NO_RECOVERY := true

TARGET_BOARD_PLATFORM := rpi

TARGET_ARCH := arm64
TARGET_ARCH_VARIANT := armv8-a
TARGET_CPU_ABI := arm64-v8a
TARGET_CPU_ABI2 :=
TARGET_CPU_VARIANT := generic

TARGET_2ND_ARCH := arm
TARGET_2ND_ARCH_VARIANT := armv7-a-neon
TARGET_2ND_CPU_ABI := armeabi-v7a
TARGET_2ND_CPU_ABI2 := armeabi
TARGET_2ND_CPU_VARIANT := generic

# Bluetooth
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := $(DEVICE_PATH)/bluetooth
BOARD_HAVE_BLUETOOTH := true

# Camera
BOARD_LIBCAMERA_IPAS := rpi/vc4
BOARD_LIBCAMERA_PIPELINES := rpi/vc4
BOARD_LIBCAMERA_USES_MESON_BUILD := true

# Display
TARGET_SCREEN_DENSITY := 240

# Graphics
BOARD_MESA3D_BUILD_LIBGBM := true
BOARD_MESA3D_USES_MESON_BUILD := true
BOARD_MESA3D_GALLIUM_DRIVERS := vc4 v3d
BOARD_MESA3D_VULKAN_DRIVERS := broadcom

# Kernel
BOARD_CUSTOM_BOOTIMG := true
BOARD_CUSTOM_BOOTIMG_MK := $(DEVICE_PATH)/mkbootimg.mk
BOARD_KERNEL_CMDLINE := console=ttyS0,115200 no_console_suspend root=/dev/ram0 rootwait androidboot.hardware=rpi4

# Manifest
DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE := $(DEVICE_PATH)/framework_compatibility_matrix.xml
DEVICE_MANIFEST_FILE := $(DEVICE_PATH)/manifest.xml
DEVICE_MATRIX_FILE := $(DEVICE_PATH)/compatibility_matrix.xml

# Partition sizes
BOARD_FLASH_BLOCK_SIZE := 4096
BOARD_BOOTIMAGE_PARTITION_SIZE := 134217728 # 128M
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 2147483648 # 2048M
BOARD_USERDATAIMAGE_PARTITION_SIZE := 134217728 # 128M
BOARD_VENDORIMAGE_PARTITION_SIZE := 268435456 # 256M
BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true
TARGET_USERIMAGES_USE_EXT4 := true

# Properties
TARGET_VENDOR_PROP += $(DEVICE_PATH)/vendor.prop

# SELinux
BOARD_SEPOLICY_DIRS += device/brcm/rpi4/sepolicy
BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive

# Treble
BOARD_PROPERTY_OVERRIDES_SPLIT_ENABLED := true
BOARD_VNDK_VERSION := current
PRODUCT_FULL_TREBLE_OVERRIDE := true
TARGET_COPY_OUT_VENDOR := vendor

# Wifi
BOARD_WLAN_DEVICE := bcmdhd
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
WIFI_HIDL_UNIFIED_SUPPLICANT_SERVICE_RC_ENTRY := true
WPA_SUPPLICANT_VERSION := VER_0_8_X

2. Thư Mục Con

Mã nguồn cho các thành phần phần cứng cụ thể:

Tên Thư Mục Mô Tả
audio/ Chứa các file liên quan đến driver âm thanh (HAL, cấu hình đầu ra âm thanh).
bluetooth/ Cấu hình và mã nguồn liên quan đến Bluetooth (HAL, driver).
camera/ Chứa cấu hình camera (HAL, YAML, profiles).
cec/ Hỗ trợ HDMI-CEC (Consumer Electronics Control) để điều khiển thiết bị qua HDMI.
health/ Chứa cấu hình và mã nguồn liên quan đến health HAL (giám sát pin, nhiệt độ).
keylayout/ Chứa các file định nghĩa layout của bàn phím hoặc thiết bị nhập liệu.
light/ Mã nguồn và cấu hình cho light HAL (điều khiển đèn LED trên thiết bị).
media/ Cấu hình codec video/audio và profile phương tiện truyền thông.
ramdisk/ Cấu hình và script khởi động ban đầu (init files, fstab).
usb/ Cấu hình cho USB HAL (hỗ trợ giao tiếp USB, gadget).

3. Overlay

Tùy chỉnh cấu hình, giao diện hoặc Service:

Tên Thư Mục Mô Tả
overlay/ Chứa các file overlay để tùy chỉnh giao diện, cấu hình cho các dịch vụ và app.
AndroidRpiOverlay/ Cấu hình overlay cho Raspberry Pi.
AndroidTvRpiOverlay/ Cấu hình overlay cho Android TV trên Raspberry Pi.
CarServiceRpiOverlay/ Cấu hình overlay cho dịch vụ Car trên Raspberry Pi.
SettingsProviderRpiOverlay/ Cấu hình overlay cho Settings Provider trên Raspberry Pi.
SystemUIRpiOverlay/ Cấu hình overlay cho System UI trên Raspberry Pi.
WifiRpiOverlay/ Cấu hình overlay cho Wi-Fi trên Raspberry Pi.

4. Policy và Security

Tên Thư Mục Mô Tả
seccomp_policy/ Chứa chính sách seccomp để giới hạn các syscall (tăng bảo mật).
sepolicy/ Chứa file SELinux policy, quy tắc bảo mật cho device.
suspend_blocker/ Hỗ trợ quản lý trạng thái suspend (ngủ) của thiết bị.
BoardConfig.mk Cấu hình các file liên quan đến bảo mật và phân quyền khi build.
author_photo
devlinux

0 Bình luận