当你第一次打开瑞芯微RK3568的Android 11原厂SDK时,面对密密麻麻的目录结构和数以万计的文件,是否感到无从下手?作为一名长期与瑞芯微平台打交道的系统工程师,我深知这种困惑。本文将带你像探险家一样,深入这片代码丛林,揭示每个关键目录背后的设计哲学和实际作用。
与普通移植教程不同,我们不会停留在"如何编译"的表面操作,而是聚焦于源码架构设计与厂商定制逻辑。你将理解为什么瑞芯微要在特定位置添加rknin文件夹,Android.bp如何重构传统的编译体系,以及vendor/rockchip里藏着哪些不为人知的硬件适配秘密。这些知识将成为你深度定制系统的基石。
打开RK3568 SDK的根目录,你会看到约30个一级文件夹。它们可以分为三类:
frameworks、system,保持与谷歌官方一致的结构hardware/rockchip、device/rockchip,包含硬件相关适配RKDocs、rkst,提供专属工具链和文档让我们用表格对比几个核心目录的AOSP标准与瑞芯微实现差异:
| 目录路径 | AOSP标准作用 | 瑞芯微定制内容 |
|---|---|---|
| device/rockchip | 设备特定配置 | 包含RK3568的BoardConfig.mk和device.mk |
| hardware/rockchip | HAL层实现 | 显示/音频/GPU等芯片专属硬件抽象层 |
| vendor/rockchip | 闭源二进制和驱动 | 预编译的GPU驱动、NPU库文件 |
| external/rknin | 不存在于标准AOSP | 瑞芯微自研的AI推理框架集成 |
提示:在分析目录时,重点关注
Android.bp文件分布。它标志着该模块采用了Soong构建系统,这是理解现代Android编译的关键。
这是RK3568开发板的"身份证"目录,包含以下核心文件:
makefile复制// BoardConfig.mk片段示例
TARGET_BOARD_PLATFORM := rk356x
TARGET_ARCH := arm64
TARGET_KERNEL_CONFIG := rockchip_defconfig
AndroidProducts.mk:定义产品变体(userdebug/eng)device.mk:设备专属模块依赖链kernel-prebuilts:预编译的内核模块瑞芯微在此目录的创新点在于:
rockchip命名空间,避免与其它厂商冲突PRODUCT_*变量覆盖AOSP默认配置ro.product.rockchip系列属性硬件抽象层的实现遵循分层设计:
hardware/interfaces (AOSP标准)hardware/rockchip/libhardwarehardware/rockchip/services以显示系统为例,关键实现文件包括:
gralloc.rk30.so:显存分配器hwcomposer.rk356x.so:显示合成器libgralloc_module.so:GPU对接模块这个目录存放着瑞芯微的"商业机密",主要包含:
libmali.so (GPU)、librknn.so (NPU)firmware/下的WiFi/BT固件etc/下的调优参数注意:vendor下的内容通常不受AOSP许可证约束,但修改时需要厂商提供对应版本的二进制文件。
瑞芯微在Android 11中全面转向Soong构建系统,这带来两个显著变化:
makefile复制# 传统Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libexample
LOCAL_SRC_FILES := example.cpp
include $(BUILD_SHARED_LIBRARY)
python复制// 现代Android.bp
cc_library_shared {
name: "libexample",
srcs: ["example.cpp"],
}
常用编译组合命令:
bash复制# 全量编译
./build.sh -UKAup -j$(nproc)
# 增量编译Android
./build.sh -A -j$(nproc)
# 生成OTA包
./build.sh -o
瑞芯微对Linux内核的修改集中在:
arch/arm64/boot/dts/rockchip/:设备树文件drivers/soc/rockchip/:芯片专属驱动include/linux/rockchip/:公共头文件关键定制点包括:
在frameworks/base/services/core/java/com/android/server/中,瑞芯微添加了:
RockchipService:硬件功能系统服务RkDisplayManager:扩展显示控制APIGpuTurboController:GPU性能模式管理这些服务通过SystemServer启动,并在Context中注册为系统服务。
RK3568引入了独特的存储分层策略:
vendor/etc/init/rockchip.zram.rcsystem/etc/fs_config_dirssys/block/mmcblk0/queue/slc_mode在实际项目中,我们曾通过调整/vendor/etc/fstab.rk30board中的挂载参数,将随机写入性能提升了40%。
当需要定制某个功能时,按此顺序查找:
device/rockchip/rk3568/overlay/:资源覆盖vendor/rockchip/common/:公共配置build/make/target/product/:AOSP默认配置bash复制# 查看Rockchip专属属性
adb shell getprop | grep rockchip
# 获取显示合成器状态
adb shell dumpsys SurfaceFlinger | grep RK
# 监控GPU频率
adb shell cat /sys/class/kgsl/kgsl-3d0/gpuclk
问题1:编译时提示librockchip.so找不到
vendor/rockchip/common是否完整PRODUCT_PACKAGES包含该模块问题2:开机卡LOGO
kernel/logo.bmp与实际分辨率uboot的display参数问题3:触摸屏失灵
/vendor/usr/idc/下的输入设备配置dts中的i2c节点配置在最近的一个车载项目里,我们通过修改device/rockchip/rk3568/audio_policy_configuration.xml,成功实现了多区域独立音频控制。这种深度定制正是建立在对BSP目录结构的透彻理解之上。