Hidl 学习总结 1

目录

1、生成hidl-gen

2、添加hidl文件,自动生成相关代码

2.1、在工程中vendor中添加目录test/1.0

2.2、添加接口hal文件

2.3、执行update-makefiles.sh,自动生成相关代码

3、编译

4、代码编写

5、编译出来为vendor.hardware.test@1.0-impl.so

6、工程中添加开机启动init.rc 和 manifest.xml


1、生成hidl-gen

source build/envsetup.sh
lunch sys_mssi_t_64_cn-userdebug
make hidl-gen 或者在system/tools/hidl中mmm

2、添加hidl文件,自动生成相关代码

2.1、在工程中vendor中添加目录test/1.0

2.2、添加接口hal文件

ITest.hal文件如下

package vendor.hardware.test@1.0;
import ITestCmdCallback;

interface ITest {
     registCallback(ITestCmdCallback callback) generates (int32_t result);
};

ITestCmdCallback.hal文件如下
package vendor.hardware.test@1.0;

interface ITestCmdCallback {
    oneway callback(string rsp);
};

update-makefiles.sh文件如下
#!/bin/bash
# Script to update Android make-files for HAL and VTS modules.

#add code patch
LOC=vendor/test/1.0/default

#current.txt path
CURRENT_FILE=vendor/test

#package name
PACKAGE=vendor.hardware.test@1.0

#package name + path
SS=vendor.hardware.test:vendor/test
TT=android.hidl:system/libhidl/transport

echo ">>>begin create bp file" 
out/host/linux-x86/bin/hidl-gen -o . -Landroidbp -r$SS -r$TT $PACKAGE 
echo "<<<end create bp file" 

echo ">>> begin create hash file" 
out/host/linux-x86/bin/hidl-gen -L hash -r$SS -r$TT $PACKAGE >> $CURRENT_FILE/current.txt 
echo "<<< end create hash file" 

echo ">>> begin create cpp file" 
out/host/linux-x86/bin/hidl-gen -o $LOC -Lc++-impl -r$SS -r$TT $PACKAGE 
echo "<<< end create cpp file" 

echo ">>> begin create impl file" 
out/host/linux-x86/bin/hidl-gen -o $LOC -Landroidbp-impl -r$SS -r$TT $PACKAGE 
echo "<<< end create impl file" 

echo ">>> begin create androidbp-service file" 
#out/host/linux-x86/bin/hidl-gen -v -Landroidbp-service -r $SS -o $LOC $PACKAGE 
#out/host/linux-x86/bin/hidl-gen -v -Lc++-service -r $SS -o $LOC $PACKAGE 
echo ">>> end create androidbp-service file"
 

2.3、执行update-makefiles.sh,自动生成相关代码

3、编译

source build/envsetup.sh
lunch sys_mssi_t_64_cn-userdebug

进入vendor/test目录,执行mm 报错

在vendor/test目录中添加Android.bp

Android.bp内容如下

subdirs = [
    "*"
]

hidl_package_root {
    name: "vendor.hardware.test",
    path: "vendor/test",
    use_current: true,
}

再次执行mm,编译成功

4、代码编写

default目录中添加service.cpp

service.cpp 代码如下

#include <android/log.h>

#include <hidl/HidlSupport.h>
#include <hidl/HidlTransportSupport.h>
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;

#include "Test.h"
using vendor::hardware::test::implementation::Test;

int main() {
    Test* mTest = new Test();

    ALOGE("Test hidl start");
    configureRpcThreadpool(10, true /*callerWillJoin*/);

    if (mTest != nullptr) {
        if (::android::OK != mTest->registerAsService()) {
            return 1;
        }
    } else {
        ALOGE("Can't create instance of ITest, nullptr");
    }

    ALOGE("Test start  success!");
    joinRpcThreadpool();
    return 0; // should never get here
}

修改Android.bp

5、编译出来为vendor.hardware.test@1.0-impl.so

        继续修改Android.bp,vendor.hardware.test@1.0-impl修改为vendor.hardware.test@1.0-service如下

push到手机上测试, xxx为工程目录

adb root
adb remount
adb push Z:\code\xxx\out_sys\target\product\mssi_t_64_cn\vendor\bin\hw\vendor.hardware.test@1.0-service /vendor/bin/hw/
adb push Z:\code\xxx\out_sys\target\product\mssi_t_64_cn\vendor\lib64\vendor.hardware.test@1.0.so /vendor/lib64/

adb reboot


手动运行

发现启动后报错

在/vendor/etc/vintf/manifest添加相关vendor.hardware.test@1.0.xml

vendor.hardware.test@1.0.xml内容如下
<manifest version="1.0" type="device">
    <hal format="hidl">
        <name>vendor.hardware.test</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>ITest</name>
            <instance>default</instance>
        </interface>
    </hal>
</manifest>


继续push验证
adb push Z:\code\xxx\vendor\test\1.0\default\vendor.hardware.test@1.0.xml /vendor/etc/vintf/manifest/

hidl服务正常启动了

6、工程中添加开机启动init.rc 和 manifest.xml

vendor.hardware.test@1.0-service.rc文件内容如下

service test /vendor/bin/hw/vendor.hardware.test@1.0-service
    # "class hal" causes a race condition on some devices due to files created
    # in /data. As a workaround, postpone startup until later in boot once
    # /data is mounted.
    class late_start
    user system
    group system
    writepid /dev/cpuset/system-background/tasks

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值