当前位置: 首页 > news >正文

android 12 的 aidl for HAL 开发示例

说明:aidl for HAL 这种机制,可以自动生成java代码,app调用可以获取中间过程的jar包,结合反射调用 ServiceManager.getService 方法,直接获取 HAL 服务,不再需要费力在framework层添加代码,方便快捷。

1. 定义aidl接口

hardware/interfaces/test/aidl/android/hardware/test/ITest.aidl

package android.hardware.test;@VintfStability
interface ITest {String getMsg();void setMsg(in String msg);
}

2. 创建Android.bp
hardware/interfaces/test/aidl/Android.bp

aidl_interface {name: "android.hardware.test",vendor: true,srcs: ["android/hardware/test/*.aidl"],stability: "vintf",owner: "test",backend: {cpp: {enabled: true,},java: {platform_apis: true,},ndk: {enabled: true,}},
}

3. 编译
mmm hardware/interfaces/test/

4. 编译报错,根据提示重新编译生成 aidl api

m android.hardware.test-update-api

5. 生成成功后重新编译

mmm hardware/interfaces/test/

编译成功

6. 实现HAL接口

hardware/interfaces/test/aidl/default/Test.h

#pragma once#include <aidl/android/hardware/test/BnTest.h>namespace aidl {
namespace android {
namespace hardware {
namespace test{class Test: public BnTest {public://String getMsg();ndk::ScopedAStatus getMsg(std::string* _aidl_return);//void setMsg(in String msg);ndk::ScopedAStatus setMsg(const std::string& msg);private:std::string message = "";
};}  // namespace test
}  // namespace hardware
}  // namespace android
}  // namespace aidl

hardware/interfaces/test/aidl/default/Test.cpp

#define LOG_TAG "Test"#include <utils/Log.h>
#include <iostream>
#include "Test.h"namespace aidl {
namespace android {
namespace hardware {
namespace test{ndk::ScopedAStatus Test::getMsg(std::string* _aidl_ret) {*_aidl_ret = message;return ndk::ScopedAStatus::ok();
}ndk::ScopedAStatus Test::setMsg(const std::string& msg) {message = msg;return ndk::ScopedAStatus::ok();
}}  // namespace test
}  // namespace hardware
}  // namespace android
}  // namespace aidl

7. 添加服务

hardware/interfaces/test/aidl/default/main.cpp

#define LOG_TAG "Test"#include <android-base/logging.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
#include "Test.h"using aidl::android::hardware::test::Test;int main() {ABinderProcess_setThreadPoolMaxThreadCount(0); ABinderProcess_startThreadPool();std::shared_ptr<Test> test = ndk::SharedRefBase::make<Test>();const std::string desc = std::string() + Test::descriptor + "/default";if (test != nullptr) {if(AServiceManager_addService(test->asBinder().get(), desc.c_str()) != STATUS_OK) {return -1;}} else {return -1;}ABinderProcess_joinThreadPool();return EXIT_FAILURE;
}

8. init rc

hardware/interfaces/test/aidl/default/android.hardware.test-service.rc

service android.hardware.test-service /vendor/bin/hw/android.hardware.test-serviceinterface aidl android.hardware.test.ITest/defaultclass haluser systemgroup system

9. manifest

hardware/interfaces/test/aidl/default/android.hardware.test-service.xml

<manifest version="1.0" type="device"><hal format="aidl"><name>android.hardware.test</name><version>1</version>  <interface>  <name>ITest</name>  <instance>default</instance>  </interface>  </hal>
</manifest>

10. 编译脚本

hardware/interfaces/test/aidl/default/Android.bp

cc_binary {name: "android.hardware.test-service",vendor: true,relative_install_path: "hw",init_rc: ["android.hardware.test-service.rc"],vintf_fragments: ["android.hardware.test-service.xml"],srcs: ["Test.cpp","main.cpp",],shared_libs: ["liblog",  "libbase","libbinder_ndk", "android.hardware.test-V1-ndk_platform",  ],
}

10. 参与编译
device\xxx\xxx\project.mk

PRODUCT_PACKAGES += \android.hardware.test \android.hardware.test-service

11. 模块添加到兼容性矩阵中

hardware/interfaces/compatibility_matrices/compatibility_matrix.x.xml

hardware/interfaces/compatibility_matrices/compatibility_matrix.current.xml

<hal format="aidl" optional="true"><name>android.hardware.test</name><version>1</version><interface><name>ITest</name><instance>default</instance></interface>
</hal>

12. 解决selinux的问题

参考:Android12 AIDL native层实现_android native aidl-CSDN博客

13. 编译,烧录

14. 测试:

开机后,先看看服务是否起来 adb shell "service list | grep test"

C++ 测试在这里忽略,参考:Android12 AIDL native层实现_android native aidl-CSDN博客

15. java 测试

取出 out\soong\.intermediates\hardware\interfaces\test\aidl\android.hardware.test-V1-java\android_common\javac下的jar包,放到android工程里边。

由于android.os.ServiceManager是个隐藏类,我们用反射

public static IBinder getService(String name) {try {Class<?> c = Class.forName("android.os.ServiceManager");Method getService = c.getMethod("getService", String.class);return (IBinder) getService.invoke(c, name);} catch (Exception e) {e.printStackTrace();return null;}
}

java 测试代码:

IBinder binder = getService("android.hardware.test.ITest/default");
ITest test =  ITest.Stub.asInterface(binder);
Log.d("TestHal", "binder: " + test);
try {test.setMsg("test message");String msg = test.getMsg();Log.d("TestHal", "HAL message: " + msg);
} catch (Exception e) {e.printStackTrace();
}

>> 为什么 getService 是 android.hardware.test.ITest/default 这个可以用 service list | grep test 获取。

这是在 aidl 服务实现时候 add service 时候传入的:

const std::string desc = std::string() + Test::descriptor + "/default";

>> 另外 selinux 的解决,可以参考:

SELinux 权限问题调试_audit(0.0:343): avc: denied { create }-CSDN博客

>> 在apk导入framework.jar的方式调用 ServiceManager

在 libs 同级目录下创建 libsconly 把 framework.jar 放入,build.gradle 添加:

compileOnly fileTree(dir: 'libsconly', include: ['*.jar'])

sync 之后就可以使用 android.os.ServiceManager 的静态方法了。

参考:RK3568 Android11 增加HAL层的AIDL_android hal aidl-CSDN博客

感谢参考文献的各位,算是在 Android 12 上跑通了。

http://www.lryc.cn/news/595794.html

相关文章:

  • Apache Ignite 中的 SQL 模式(Schema)管理机制
  • Matplotlib绘制各种图参考
  • #Linux内存管理#mmap函数创立私有匿名映射的工作原理
  • 在 Ubuntu 22.04 上安装并优化 Nginx nginx入门操作 稍难,需要有一定理论 多理解 多实践
  • Debug 与 Release 版本构建详解
  • 嵌入式学习-土堆目标检测(2)-day26
  • 【AI时代速通QT】第五节:Qt Creator如何引入第三方库,以OpenCV为例
  • [2025CVPR]ViKIENet:通过虚拟密钥实例增强网络实现高效的 3D 对象检测
  • STM32-SPI全双工同步通信
  • Kotlin 作用域函数 let 的实现原理
  • 替代Oracle?金仓数据库用「敢替力」重新定义国产数据库
  • 【Android】xml和Java两种方式实现发送邮件页面
  • Windows PE文件内未用空间学习
  • 17-VRRP
  • 基于 Vue,SPringBoot开发的新能源充电桩的系统
  • ospf技术
  • 【机器学习】第四章 回归算法
  • 高层功能架构详解 - openExo
  • Flutter基础(前端教程①⑧-Text文本-Icon图标-Image图片)
  • C语言符号可见性控制与工程实践——深入理解 __attribute__((visibility)) 和 -fvisibility=hidden
  • 跨服务调用中,直接使用 MDC的上下文无法自动传递
  • Oracle 12c 创建数据库初级教程
  • 从FDTD仿真到光学神经网络:机器学习在光子器件设计中的前沿应用工坊
  • 从RAG到Agentic RAG
  • 无人机吊舱与遥控器匹配技术解析
  • 一文读懂深度模型优化器,掌握炼丹工具
  • MySQL 学习二 MVCC
  • IBGP互联(ensp)
  • 【nginx】隐藏服务器指纹:Nginx隐藏版本号配置修改与重启全攻略
  • Unity中,Panel和 Canvas的区别