前言 在上一篇中已经完成了服务端的集成,手机软件此时已经可以自动启动服务端,且运行无异常。 接下来我们就要实现我们的终极目标了:system_server(JAVA端)与服务端
在上一篇中已经完成了服务端的集成,手机软件此时已经可以自动启动服务端,且运行无异常。
接下来我们就要实现我们的终极目标了:system_server(JAVA端)与服务端相互通信;
预处理首先先解释下一个“玄学”的情况:在前两章的操作完成后,我们不需要添加任何JAVA类,即可直接使用;
究其原因,是因为在我们之前使用hidl-gen的时候,生成的Android.bp中包含这个字段:
hidl_interface {
...
gen_java: true,
}
字段定义与实现可在这里查到:/system/tools/hidl/build/hidl_interface.Go,在此先不讲解,后续有时间再补上:
JAVA代码添加Android.bp依赖:
static_libs: [
"vendor.zsui.hardware.example-V1.0-java",
]
核心代码:
import vendor.zsui.hardware.example.V1_0.IExample;
...
try {
IExample example = IExample.getService();
Slog.d("ZSUI", "example HELLO WORLD result = " + example.helloWorld("ZSUI"));
} catch (Exception e) {
e.printStackTrace();
}
...
需要注意一点,在vendor.zsui.hardware.example@1.0-service.rc中我们定义该服务的类别为HAL(class hal),这会导致它的启动可能比system_server中的核心服务(AMS/PowerMS等)晚,所以实际使用中需要做容错判断;
至此,一切似乎都处理好了,编译也通过了,是不是可以看到Hello World了呢?
02-26 12:33:21.407 449 449 W hwservicemanager: getTransport: Cannot find entry vendor.zsui.hardware.example@1.0::IExample/default in either framework or device manifest.
02-26 12:33:21.407 1467 1574 W System.err: java.util.NoSuchElementException
02-26 12:33:21.408 1467 1574 W System.err: at android.os.HwBinder.getService(Native Method)
02-26 12:33:21.408 1467 1574 W System.err: at android.os.HwBinder.getService(HwBinder.java:91)
02-26 12:33:21.408 1467 1574 W System.err: at vendor.zsui.hardware.example.V1_0.IExample.getService(IExample.java:48)
02-26 12:33:21.408 1467 1574 W System.err: at vendor.zsui.hardware.example.V1_0.IExample.getService(IExample.java:52)
02-26 12:33:21.408 1467 1574 W System.err: at com.android.server.am.ActivityManagerService.bootAnimationComplete(ActivityManagerService.java:8246)
02-26 12:33:21.408 1467 1574 W System.err: at com.android.server.wm.WindowManagerService.perfORMEnableScreen(WindowManagerService.java:3495)
02-26 12:33:21.408 1467 1574 W System.err: at com.android.server.wm.WindowManagerService.access$1100(WindowManagerService.java:272)
02-26 12:33:21.408 1467 1574 W System.err: at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:4975)
02-26 12:33:21.408 1467 1574 W System.err: at android.os.Handler.dispatchMessage(Handler.java:106)
02-26 12:33:21.408 1467 1574 W System.err: at android.os.Looper.loop(Looper.java:193)
02-26 12:33:21.408 1467 1574 W System.err: at android.os.HandlerThread.run(HandlerThread.java:65)
02-26 12:33:21.408 1467 1574 W System.err: at com.android.server.ServiceThread.run(ServiceThread.java:44)
这个是由于Vintf机制要求,需要在manifest.xml中声明这个HIDL,因此将如下内容添加到对应文件中即可:
在device///manifest.xml或等效的位置添加:
...
vendor.zsui.hardware.example
hwbinder
1.0
IExample
default
...
刷机,开机,一切正常:
02-26 12:46:22.879 1476 1562 D ZSUI : example HELLO WORLD result = Hello World, ZSUI
至此,连续三章的虚拟HAL创建步骤已经完成。
这三篇主要是步骤解读,相信按照这个一步一步来,实际使用是没有问题的。
但是这三篇并没有对原理方面做过多解释,因此之后会更新一篇Q&A,主要讲解部分看似“玄学”的操作;
文笔有限,若有谬误,还请指出;
感谢!
--结束END--
本文标题: [Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(三)——JAVA客户端
本文链接: https://lsjlt.com/news/28851.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-21
2023-10-28
2023-10-28
2023-10-27
2023-10-27
2023-10-27
2023-10-27
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0