返回顶部
首页 > 资讯 > 移动开发 >[Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(三)——JAVA客户端
  • 309
分享到

[Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(三)——JAVA客户端

halJAVAnative通信systemAndroid 2022-06-06 13:06:04 309人浏览 泡泡鱼
摘要

前言 在上一篇中已经完成了服务端的集成,手机软件此时已经可以自动启动服务端,且运行无异常。 接下来我们就要实现我们的终极目标了: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,主要讲解部分看似“玄学”的操作;

文笔有限,若有谬误,还请指出;

感谢!


作者:Ryan ZHENG


--结束END--

本文标题: [Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(三)——JAVA客户端

本文链接: https://lsjlt.com/news/28851.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作