[Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(三)——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();
        }
...

需要注意一点,在[email protected]中我们定义该服务的类别为HAL(class hal),这会导致它的启动可能比system_server中的核心服务(AMS/PowerMS等)晚,所以实际使用中需要做容错判断;

至此,一切似乎都处理好了,编译也通过了,是不是可以看到Hello World了呢?

02-26 12:33:21.407   449   449 W hwservicemanager: getTransport: Cannot find entry [email protected]::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/<$vendor>/<$product>/manifest.xml或等效的位置添加:

<manifest version="1.0" type="device">
    ...
    <hal format="hidl">
        <name>vendor.zsui.hardware.example</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>IExample</name>
            <instance>default</instance>
        </interface>
    </hal>
    ...
</manifest> 

刷机,开机,一切正常:

02-26 12:46:22.879  1476  1562 D ZSUI    : example HELLO WORLD result = Hello World, ZSUI

至此,连续三章的虚拟HAL创建步骤已经完成。

这三篇主要是步骤解读,相信按照这个一步一步来,实际使用是没有问题的。

但是这三篇并没有对原理方面做过多解释,因此之后会更新一篇Q&A,主要讲解部分看似“玄学”的操作;

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

感谢!

发布了17 篇原创文章 · 获赞 17 · 访问量 9658

猜你喜欢

转载自blog.csdn.net/u014175785/article/details/104513675
今日推荐