创建AIDL文件
创建存放aidl文件的目录,示例中为
hardware/interfaces/learnHA/aidl/android/hardware/learnHA
在上述目录新建aidl文件
package android.hardware.learnHA;
interface ILearnHA {
void justTest();
}
- 其中package名字要与实际路径名字一样,并且大小写敏感
在aidl文件夹下, 新建一个Android.bp, 实现接口定义模块
aidl_interface {
name: \”android.hardware.learnHA\”,
vendor_available: true,
srcs: [
\”android/hardware/learnHA/*.aidl\”,
],
unstable: true,
}
-
aidl_interface 是 Soong 里专门用来定义 AIDL 接口 的模块类型。它的作用是:
- 收集 .aidl 文件
- 校验 AIDL 接口定义
- 生成对应语言的代码
- Java
- CPP
- NDK
- Rust(视版本而定)
- 管理稳定/版本化 AIDL API
-
name是这个 aidl_interface 模块的名字, 它是整个接口模块的主标识,后续很多自动生成的模块名都会基于它派生,比如常见会生成:
android.hardware.learnHA-java android.hardware.learnHA-cpp android.hardware.learnHA-ndk
注意 这个名字通常和 AIDL package 对应,例如你的 .aidl 里如果写: package android.hardware.learnHA; 那 name 通常也写成: \”android.hardware.learnHA\” 这样最规范。
-
vendor_available表示这个模块 可以被 vendor 分区的模块使用
- vendor_available: true : 别的 vendor 模块可以依赖我
- vendor_available: false : 别的 vendor 模块不可以依赖我
-
srcs : 表示这个接口模块的源文件列表,也就是要编译/处理的 .aidl 文件。
-
unstable : 表示这个 AIDL 接口是 不稳定接口也就是:
- 它不走稳定 AIDL 的版本冻结机制
- 不要求 versions: [\”1\”]
- 不要求维护 aidl_api/…
- 可以在开发过程中随便改接口
在aidl文件夹下,执行 mm ,便可编译出针对aidl文件的java和cpp文件.路径在
out/soong/.intermediates/hardware/interfaces/learnHA/aidl/android.hardware.learnHA-java-source/gen/android/hardware/learnHA/ILearnHA.java
out/soong/.intermediates/hardware/interfaces/learnHA/aidl/android.hardware.learnHA-cpp-source/gen/android/hardware/learnHA/ILearnHA.cpp
out/soong/.intermediates/hardware/interfaces/learnHA/aidl/android.hardware.learnHA-ndk_platform-source/gen/android/hardware/learnHA
Android 15之后,会有rust的目录
目前文件夹以及各个文件的层级关系:
aidl/ ├── android/ │ └── hardware/ │ └── learnHA/ │ └── ILearnHA.aidl └── Android.bp
实现并注册服务
新建以下文件夹和文件,形成以下层级:
aidl/ ├── android/ │ └── hardware/ │ └── learnHA/ │ └── ILearnHA.aidl ├── default/ │ ├── Android.bp │ ├── learnHA-default.rc │ ├── learnHA-default.xml │ ├── LearnHA.cpp │ ├── LearnHA.h │ └── service.cpp └── Android.bp
填写learnHA-default.rc, 描述如何启动一个 HAL 服务进程,以及它以什么身份、属于什么 class
service vendor.learnHA–default /vendor/bin/hw/android.hardware.learnHA–service
class hal
user nobody
group nobody
shutdown critical
-
定义一个名为 vendor.learnHA-default 的服务,执行文件路径是/vendor/bin/hw/android.hardware.learnHA-service
-
class hal : 表示这个 service 属于 hal 这个 init class Android init 会把服务分组管理,不同服务可以属于不同 class,例如:
- core
- main
- late_start
- hal 系统在合适的阶段会启动这些 class 下的服务。
-
user nobody : 表示这个进程启动后,以 Linux 用户 nobody 身份运行。也就是这个服务进程的 uid 是 nobody。这是一种权限比较低的运行身份,常用于限制服务权限,减少安全风险。
Android 服务进程一般不会都用 root 跑,而是根据服务职责用不同用户,例如:
- system
- root
- bluetooth
- cameraserver
- nobody
这样做是为了最小权限原则。
-
group nobody
表示这个进程所属的主组/附加组为 nobody。
Linux 里进程除了 user,还会有 group。group 会影响文件访问权限、设备节点访问权限等。
-
shutdown critical :表示这个服务是 关机关键服务,在系统 shutdown 过程中被视为关键,不会被过早杀掉.这通常用于那些在关机阶段仍然必须工作的重要服务,比如:
- 某些电源相关 HAL
- 某些存储同步相关服务
- 和安全关机流程强相关的服务
填写learnHA-default.xml,
<manifest version=




