你写好了:
hardware/rockchip/led/
├── include/led.h ← 接口定义
├── led.c ← 实现(HAL_MODULE_INFO_SYM 在这里)
├── led_test.c ← 测试程序
└── Android.bp ← Soong 编译规则,定义 led.default 模块
│
│ 第1步:mm / mmm 编译
▼
source build/envsetup.sh
lunch rk3576_xxx-userdebug
mmm hardware/rockchip/led/
│
│ Soong 解析 Android.bp
▼
Soong 看到:
cc_library_shared { name: "led.default" }
↓ 编译 led.c
↓ 链接 libcutils + liblog
↓ 生成 led.default.so
↓ 安装到 vendor/lib64/hw/led.default.so
cc_binary { name: "led_test" }
↓ 编译 led_test.c
↓ 链接 libhardware + libcutils
↓ 生成 led_test 可执行文件
↓ 安装到 vendor/bin/led_test
│
│ 第2步:加入 PRODUCT_PACKAGES,编入系统镜像
▼
device/rockchip/common/modules/led.mk
→ PRODUCT_PACKAGES += led.default
device/rockchip/common/device.mk
→ $(call inherit-product, device/rockchip/common/modules/led.mk)
│
▼
make -j16
→ led.default.so 被打包进 vendor 镜像
→ led_test 被打包进 vendor 镜像
│
│ 第3步:烧录到设备
▼
fastboot flash vendor vendor.img
adb reboot
│
│ 第4步:上层调用
▼
Java 层(SystemServer / App)
↓ 调用 JNI
Native 层(libhardware)
↓ hw_get_module("led", &module)
↓ dlopen("led.default.so")
↓ dlsym(handle, "HMI") ← 找到 HAL_MODULE_INFO_SYM
↓ module->methods->open(module, "led_main", &device)
↓ dev->set_onoff(dev, 1)