【Android】使用hwbinder创建一个service

service相关文件的创建

1、例如:在vendor目录下创建文件夹,如vendor\xxx\xxx\hardware\interfaces:

a、添加配置文件Android.bp:

subdirs = [

"event"

]

b、Android.mk :

include $(call all-subdir-makefiles)

c、update-makefiles.sh :

#!/bin/bash

source system/tools/hidl/update-makefiles-helper.sh

do_makefiles_update \

"vendor.xxx.hardware:vendor/xxx/xxx/hardware/interfaces" \

"android.hardware:hardware/interfaces" \

"android.hidl:system/libhidl/transport"

2、创建文件夹event\1.0

a\在event目录下同样添加Android.bp、Android.mk文件

b\在1.0目录下添加types.hal(可选)、ITvEvent.hal、IEventInfoHw .hal、IEventListenerHw.hal

package xxx.xxx.hardware.event@1.0;

import IEventListenerHw;

import IEventInfoHw;

 

interface ITvEvent {

oneway RegisterEventListener(uint8_t event,IEventListenerHw listener);

oneway UnregisterEventListener(uint8_t event,IEventListenerHw listener);

oneway SendEvent(IEventInfoHw info,string listener);

oneway SendBroadcast(IEventInfoHw info);

oneway DisableSystemTimeEvent(uint8_t event);

oneway EnableSystemTimeEvent(IEventInfoHw info,uint32_t time_usec);

};

package xxx.xxx.hardware.event@1.0;

//这两个接口会在client传给service,他的实现我在后面default的c++文件中,并且打包成libXXX的动态库,生成到system\lib\libXXX.so;给jni的c++文件使用

interface IEventInfoHw {

getListenerName() generates (string name);

setListenerName(string name);

getString() generates (string name);

getU32Number() generates (uint32_t result);

getInfoType() generates (EN_EVENT_INFO_TYPE result);

getEventType() generates (uint8_t result);

setMsgType(bool type);

getMsgType() generates (bool result);

};

package xxx.xxx.hardware.event@1.0;

import IEventInfoHw;

interface IEventListenerHw {

getListenerName() generates (string name);

OnEvent(IEventInfoHw info);

};

=============================================================================

添加完hal文件之后,需要在1.0的目录生成对应的Android.bp、Android.mk

可以执行android\o-base $:source vendor\xxx\xxx\hardware\interfaces\update-makefiles.sh

如果hal有语法错误,该脚本是执行fail的,需要检查hal的语法;

到vendor\xxx\xxx\hardware\interfaces 或者直接到1.0的目录,执行局部编译mm/mm -B,就会在out\target\common\gen\JAVA_LIBRARIES 下生成Android.bp中要out的文件

3、创建文件夹event\1.0\default

在Ubuntu分别执行以下命令,

croot

PKG_ROOT=vendor/xxx/xxx/hardware/interfaces

PACKAGE=xxx.xxx.hardware.event@1.0

HIDL_GEN_OUT=$PKG_ROOT/event/1.0/default/

//可以生成C,java的文件,下面是我用到C++实现

hidl-gen -o $HIDL_GEN_OUT -Lc++-impl -rvendor.xxx.hardware:$PKG_ROOT -randroid.hidl:system/libhidl/transport $PACKAGE

此时可以在default目录自动生成:

TvEvent.h\TvEvent.cpp\EventInfoHw.h\EventInfoHw.cpp\EventListenerHw.h\EventListenerHw.cpp

4、default目录下添加service.cpp

#define LOG_TAG "xxx.xxx.hardware.event@1.0-service"

 

#include <hidl/HidlTransportSupport.h>

#include "TvEvent.h"

#include <hidl/LegacySupport.h>

#include <xxx/xxx/hardware/event/1.0/ITvEvent.h>

 

using android::hardware::configureRpcThreadpool;

using android::hardware::joinRpcThreadpool;

using android::sp;

using android::status_t;

using android::OK;

using android::hardware::defaultPassthroughServiceImplementation;

 

using xxx::xxx::hardware::event::V1_0::ITvEvent;

using Oceanus::TvEvent;

 

int main() {

//configureRpcThreadpool(10, true);

//参考https://source.android.google.cn/devices/architecture/configstore/add-class-item

// sp<ITvEvent> myTvEvent = new Oceanus::TvEvent();

// status_t status = myTvEvent->registerAsService();

// LOG_ALWAYS_FATAL_IF(status != OK, "Could not register Foo as service");

 

// other interface registration comes here

// joinRpcThreadpool();

==》》实现是在xxx.xxx.hardware.event@1.0-service中,TvEvent需要把

ITvEvent* HIDL_FETCH_ITvEvent(const char* /* name */) {

return new Oceanus::TvEvent();

}

去掉。

return defaultPassthroughServiceImplementation<ITvEvent>();//直通的

//是打包在xxx.xxx.hardware.event@1.0-impl中;

系统起来后会调用HIDL_FETCH_ITvEvent的接口对TvEvent进行初始化

// Methods from ::android::hidl::base::V1_0::IBase follow.

}

5、default目录下添加xxx.xxx.hardware.event@1.0-service.rc

service event-hal-1-0 /vendor/bin/hw/xxx.xxx.hardware.event@1.0-service

class hal

user system

group system

6、default目录下添加Android.mk

LOCAL_PATH := $(call my-dir)

 

################################################################################

include $(CLEAR_VARS)

LOCAL_MODULE := xxx.xxx.hardware.event@1.0-impl

LOCAL_PROPRIETARY_MODULE := true

LOCAL_MODULE_RELATIVE_PATH := hw

LOCAL_SRC_FILES := \

EventInfoHw.cpp \

TvEvent.cpp \

EventListenerHw.cpp

LOCAL_SHARED_LIBRARIES := libThreadPool\

libbase \

liblog \

libhardware \

libhidlbase \

libhidltransport \

libutils \

xxx.xxx.hardware.event@1.0_vendor \

 

LOCAL_C_INCLUDES += EventInfoHw.h\

EventListenerHw.h\

LOCAL_STATIC_LIBRARIES += libmxml \

libevent_static \

include $(BUILD_SHARED_LIBRARY)

##################################################

include $(CLEAR_VARS)

include $(OCEANUS_ROOT)/Build/AndroidCommon.mk

MODULE_NAME := EventHw

 

LOCAL_SRC_FILES := \

EventInfoHw.cpp \

EventListenerHw.cpp

 

LOCAL_SHARED_LIBRARIES := libThreadPool\

libbase \

liblog \

libhardware \

libhidlbase \

libhidltransport \

libutils \

xxx.xxx.hardware.event@1.0_vendor \

 

LOCAL_C_INCLUDES += EventInfoHw.h\

EventListenerHw.h\

LOCAL_STATIC_LIBRARIES += libmxml \

libevent_static \

 

LOCAL_MODULE := libOClt_$(MODULE_NAME)Manager

 

include $(BUILD_SHARED_LIBRARY)

#################################################

include $(CLEAR_VARS)

LOCAL_MODULE := xxx.xxx.hardware.event@1.0-service

LOCAL_PROPRIETARY_MODULE := true

LOCAL_MODULE_CLASS := EXECUTABLES

LOCAL_MODULE_RELATIVE_PATH := hw

LOCAL_INIT_RC := xxx.xxx.hardware.event@1.0-service.rc

LOCAL_SRC_FILES:= \

service.cpp \

TvEvent.cpp

 

LOCAL_SHARED_LIBRARIES := libThreadPool\

xxx.xxx.hardware.event@1.0_vendor \

libhidlbase \

libhidltransport \

libbase \

liblog \

libutils \

libhardware \

 

LOCAL_C_INCLUDES += \

TvEvent.h\

LOCAL_STATIC_LIBRARIES += libmxml \

libevent_static \

include $(BUILD_EXECUTABLE)

 

此时去编译就可以在system\lib\hw、system\lib、system\bin\hw生成对应的so文件;注意:因为是自己开启的服务,在安卓8.0需要把对应的so文件生成到ventor目录下,否则vts认证会fail,或者so找不到情况。

我们还需要讨论该service的启动,另外发文章说明

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值