欢迎光临
我们一直在努力

构建一个简单的aidl for hal

创建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=

  • 赞(0)
    未经允许不得转载:171主机测评 » 构建一个简单的aidl for hal
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址