添加服务流程

一. hardware部分

1.1 编写.hal

hardware/interfaces目录新建het文件夹,het下新建1.0文件夹。

新建 types.hal (非必要,用于定义结构体,复杂变量可在此定义)

//types.hal
package android.hardware.het@1.0;struct DeviceType{int32_t type;string state;
};struct DeviceEvent{int32_t what;string msg;
};

新建 IHet.hal (主接口)

package android.hardware.het@1.0;import IDeviceCallback;interface IHet {setState(DeviceType type) generates (string result);getState(int32_t type) generates (string result);//变量类型string 不是StringsetCallback(IDeviceCallback callback) generates (bool res);//变量类型bool 不是booleanrelease();
};

1.2 使用hidl-gen生成变量

source ./build/envsetup.sh
lunch aosp_car_x86_64-eng
make -j4
make hidl-gen -j4

设置临时变量

PACKAGE=android.hardware.het@1.0
LOC=hardware/interfaces/het/1.0/default

使用hidl-gen生成default目录 里的C++文件

hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE

使用hidl-gen生成default目录 里的Android.bp文件

hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE

使用update-makefiles.sh生成1.0目录下的Android.bp

./hardware/interfaces/update-makefiles.sh

此时的目录结构为

+-- 1.0
¦   +-- Android.bp
¦   +-- Android.mk
¦   +-- default
¦   ¦   +-- Android.bp
¦   ¦   +-- android.hardware.het@1.0-service.rc
¦   ¦   +-- Het.cpp
¦   ¦   +-- Het.h
¦   ¦   +-- service.cpp
¦   +-- IDeviceCallback.hal
¦   +-- IHet.hal
¦   +-- types.hal
+-- Android.bp

DeviceCallback.cpp和 DeviceCallback.h没用删掉,并修改default里的Android.bp 删掉DeviceCallback.cpp

1.3 实现.cpp

实现由hidl-gen生成的het.cpp

添加启动service

新建android.hardware.het@1.0-service.rc 启动脚本

service het-hal-1-0 /vendor/bin/hw/android.hardware.het@1.0-serviceclass haluser systemgroup system

新建service.cpp 这里使用绑定式 直通式为注释部分

#define LOG_TAG "android.hardware.het@1.0-service"
#include <android-base/logging.h>
#include <hidl/HidlTransportSupport.h>
#include <android/hardware/het/1.0/IHet.h>#include <hidl/LegacySupport.h>
#include "Het.h"
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using android::hardware::het::V1_0::IHet;
using android::hardware::het::V1_0::implementation::Het;
//using android::hardware::defaultPassthroughServiceImplementation;
//passthrough modeusing android::sp;
int main() {
#if 0return defaultPassthroughServiceImplementation<IHet>();//passthrough mode
#elseconfigureRpcThreadpool(4, true);sp<IHet> het = new Het();auto status = het->registerAsService();CHECK_EQ(status, android::OK) << "Failed to register het HAL implementation";joinRpcThreadpool();return 0;  // joinRpcThreadpool shouldn't exit
#endif
}

修改Android.bp

cc_library_shared {name: "android.hardware.het@1.0-impl",defaults: ["hidl_defaults"],srcs: ["Het.cpp",],shared_libs: ["libbase",      "liblog","libdl","libutils","libhardware","libhidlbase","libhidltransport","android.hardware.het@1.0",],
}cc_binary {vendor: true,relative_install_path: "hw",defaults: ["hidl_defaults"],name: "android.hardware.het@1.0-service",init_rc: ["android.hardware.het@1.0-service.rc"],srcs: ["Het.cpp","service.cpp",],shared_libs: ["libbase",      "liblog","libdl","libutils","libhardware","libhidlbase","libhidltransport","android.hardware.het@1.0",], }

调用 update-makefiles.sh更新一下。

编译

mmm ./hardware/interfaces/test/1.0

编译输出

vendor/lib/hw/android.hardware.het@1.0-impl.so
vendor/bin/hw/android.hardware.het@1.0-service
vendor/etc/init/android.hardware.het@1.0-service.rc
system/lib/android.hardware.het@1.0.so

二. device部分

在aosp\device\rockchip\common\manifest.xml文件中添加het服务

 <hal format="hidl"><name>android.hardware.het</name><transport>hwbinder</transport><version>1.0</version><interface><name>IHet</name><instance>default</instance></interface></hal>

在aosp\device\rockchip\rk3288\device.mk中添加het service

PRODUCT_PACKAGES += \android.hardware.het@1.0-impl \android.hardware.het@1.0-service

三. SELinux部分----hal service

对应sepolicy, Google 也设定了不同的存放目录, 以便进行分离, 以Google 默认的sepolicy 为例. /system/sepolicy

public: android 和 vendor 共享的sepolicy 定义, 通常情况下, 意味着vendor 开发者可能为此新增一些权限. 一般system/vendor 共用的一些类型和属性的定义, neverallow 限制等会存放于此.

private: 通常意义上的仅限于system image 内部的使用, 不对vendor 开放. 这个只会编译到system image 中.

vendor: 它仅仅能引用public 目录下的相关定义, 这个只会编译到vendor image 中. 但它依旧可以对system image 里面的module 设定sepolicy(对应module 需要在public 下进行声明); 在很大程度上绕过了Google GTS 约束测试.

mapping: 为兼容老版本的sepolicy 而导入, 只有在system image version > vendor version 的时候, 才可能被用到. 即包括两方面, 新版本增加的type , 新版本移除的type, 以及老版本public, 新版本private 等变化的设定, 以兼容老版本.

本例修改目录为aosp\system\sepolicy,该目录下有vendor public private(注意public 下的修改同样也要修改到prebuilts\api\26.0 下的对应文件,否则编译会报错)

3.1 vendor目录

file_contexts 添加

/(vendor|system/vendor)/bin/hw/android\.hardware\.het@1\.0-service              u:object_r:hal_het_default_exec:s0
/(vendor|system/vendor)/lib(64)?/hw/android\.hardware\.het@1\.0-impl\.so       u:object_r:same_process_hal_file:s0
#file_contexts文件保存系统中所有文件的安全上下文定义,每行前半部分是文件的路径,后面是它的安全上下文的定义(hal_test_default_exec)

新建hal_het_default.te

#定义一个 名字为 hal_het_default 的type
#TYPE是定义主体和客体所属的类型,对于进程而言,它的类型也称为domian。
#通常主体的type具有domian属性,因此,我们也把主体的type称为domain,将domain设置为hal_het_default的属性,表明zygote是用来描述进程的安全上下文的。
type hal_het_default, domain;
hal_server_domain(hal_het_default, hal_het);type hal_het_default_exec, exec_type, file_type, vendor_file_type;init_daemon_domain(hal_het_default)allow hal_het_default hwservicemanager_prop:file r_file_perms;
allow hal_het_default hal_het_hwservice:hwservice_manager { add find };
allow hal_het_default ttyS_device:chr_file rw_file_perms;
allow hal_het_default input_device:chr_file rw_file_perms;
allow hal_het_default input_device:dir { search };
allow hal_het_default hidl_base_hwservice:hwservice_manager add;

3.2 public目录

attributes 添加

attribute hal_het;
expandattribute hal_het true;
attribute hal_het_client;
expandattribute hal_het_client true;
attribute hal_het_server;
expandattribute hal_het_server false;
#hal_attribute(het);

hwservice.te 添加

type hal_het_hwservice, hwservice_manager_type;

新建 hal_het.te

# HwBinder IPC from client to server, and callbacks
binder_call(hal_het_client, hal_het_server)
binder_call(hal_het_server, hal_het_client)add_hwservice(hal_het_server, hal_het_hwservice)
allow hal_het_client hal_het_hwservice:hwservice_manager find;

将以上修改同步到aosp\system\sepolicy\prebuilts\api\26.0\public

3.3 private目录

hwservice_contexts 添加

android.hardware.het::IHet       u:object_r:hal_het_hwservice:s0

private/compat/26.0/26.0.ignore.cil 添加

hal_het_hwservice

将以上修改同步到aosp\system\sepolicy\prebuilts\api\26.0\private

四. 客户端实现

4.1 system_service实现

4.1.1 HetManager端

在目录aosp\frameworks\base\core\java\android\os里 新建het目录

创建IHetService.aidl 对应hal层 四个功能

package android.os.het;import android.os.het.IDeviceEventListener;
// Declare any non-default types here with import statementsinterface IHetService {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/String setState(int type, String state);String getState(int type);boolean setDeviceEventListener(IDeviceEventListener listener);void release();
}

创建IDeviceEventListener.aidl, IHetService.aidl 里传递的自定类

package android.os.het;
import android.os.het.DeviceListenerEvent;
// Declare any non-default types here with import statementsinterface IDeviceEventListener {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void onEvent (inout DeviceListenerEvent event);
}

创建DeviceListenerEvent.aidl, IDeviceEventListener.aidl 里传递的 event 类型变量

package android.os.het;
// Declare any non-default types here with import statements
parcelable DeviceListenerEvent;

创建DeviceListerEvent.java

package android.os.het;import android.os.Parcel;
import android.os.Parcelable;/*** android.os.het.DeviceListenerEvent*/
public class DeviceListenerEvent implements Parcelable {private int what;private String msg;public DeviceListenerEvent(int what, String msg) {this.what = what;this.msg = msg;}public DeviceListenerEvent(Parcel in) {what = in.readInt();msg = in.readString();}public void setWhat(int what) {this.what = what;}public void setMsg(String msg) {this.msg = msg;}public int getWhat() {return what;}public String getMsg() {return msg;}public static final Creator<DeviceListenerEvent> CREATOR = new Creator<DeviceListenerEvent>() {@Overridepublic DeviceListenerEvent createFromParcel(Parcel in) {return new DeviceListenerEvent(in);}@Overridepublic DeviceListenerEvent[] newArray(int size) {return new DeviceListenerEvent[size];}};@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeInt(what);dest.writeString(msg);}/*** <p>从parcel中读取,从parcel中读取,顺序与write一致</p>* 如果要支持为 out 或者 inout 的定向 tag 的话,需要实现 readFromParcel() 方法* @param dest*/public void readFromParcel(Parcel dest) {what = dest.readInt();msg = dest.readString();}}

创建HetManager.java 供上层APP调用

package android.os.het;/*** ---------------------------------------------------------------- <br>* Copyright (C) 2014-2020, by het, Shenzhen, All rights reserved.  <br>* ---------------------------------------------------------------- <br>* <p>* 描述: HetManager <br>* 作者: lei <br>* 日期: 2020/6/29 <br>*/
import android.os.RemoteException;
import android.util.Log;
import android.os.het.IHetService;
import android.content.Context;public class HetManager {private final Context mContext;private IHetService mService;public static final String TAG = "HetManager";public HetManager(IHetService server) {Log.d(TAG, "HetManager: ");mContext = null;mService = server;}public HetManager(Context context, IHetService server) {Log.d(TAG, "HetManager: ");mContext = context;mService = server;}public String setState(int type, String state) {Log.d(TAG, "setState: " + type + " " + state);try {if (mService != null) {return mService.setState(type, state);}} catch (RemoteException e) {e.printStackTrace();}return "";}public String getState(int type) {Log.d(TAG, "getState: " + type);try {if (mService == null) {return null;}return mService.getState(type);} catch (RemoteException e) {e.printStackTrace();}return "service connect failed";}public boolean setDeviceListener(DeviceEventListener listener) {Log.d(TAG, "setDeviceListener: ");try {if (mService == null) {return false;}return mService.setDeviceEventListener(listener);} catch (RemoteException e) {e.printStackTrace();return false;}}public void release() {Log.d(TAG, "release: ");try {if (mService != null) {mService.release();}} catch (RemoteException e) {e.printStackTrace();}}
}

在aosp\frameworks\base\Android.mk里添加

 core/java/android/os/het/IDeviceEventListener.aidl \core/java/android/os/het/IHetService.aidl \
4.1.2 HetService端

在目录 aosp\frameworks\base\services\core\Android.mk添加het独有类的引用

LOCAL_JAVA_LIBRARIES := \...android.hardware.het-V1.0-java \...

在目录 aosp\frameworks\base\services\Android.mk添加het独有类的静态引用(经测试必须要加静态类,不然会报错)

LOCAL_STATIC_JAVA_LIBRARIES := \...android.hardware.het-V1.0-java-static \...

在目录 aosp\frameworks\base\services\core\java\com\android\server\het

新建HetService.java

package com.android.server.het;import android.content.Context;
import android.hardware.het.V1_0.IHet;
import android.hardware.het.V1_0.DeviceType;
import android.hardware.het.V1_0.IDeviceCallback;
import android.hardware.het.V1_0.DeviceEvent;
import android.os.RemoteException;
import android.os.het.DeviceListenerEvent;
import android.os.het.IDeviceEventListener;
import android.os.het.IHetService;
import android.util.Log;/*** ---------------------------------------------------------------- <br>* Copyright (C) 2014-2020, by het, Shenzhen, All rights reserved.  <br>* ---------------------------------------------------------------- <br>* <p>* 描述: HetService <br>* 作者: lei <br>* 日期: 2020/6/29 <br>*/
public class HetService extends IHetService.Stub {private String TAG = "HetService";private final Context mContext;private IHet halService ;public HetService(Context context){mContext = context;try {halService = IHet.getService();//获取service} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic String setState(int type, String state) throws RemoteException {DeviceType deviceType = new DeviceType();deviceType.type = type;deviceType.state = state;return halService.setState(deviceType);}@Overridepublic String getState(int type) throws RemoteException {return halService.getState(type);}@Overridepublic boolean setDeviceEventListener(IDeviceEventListener listener) throws RemoteException {Log.d(TAG, "setDeviceEventListener: ");DeviceCallback callback = new DeviceCallback(listener);return halService.setCallback(callback);}@Overridepublic void release() throws RemoteException {Log.d(TAG, "release: ");halService.release();}class DeviceCallback extends IDeviceCallback.Stub{IDeviceEventListener mIDeviceEventListener;DeviceCallback (IDeviceEventListener listener){mIDeviceEventListener = listener;}@Overridepublic void onDeviceEvent(DeviceEvent event) throws RemoteException {Log.d(TAG, "onDeviceEvent: ");DeviceListenerEvent deviceListenerEvent = new DeviceListenerEvent(event.what,event.msg);mIDeviceEventListener.onEvent(deviceListenerEvent);}}}

在目录aosp\frameworks\base\core\java\android\content\Context.java里添加

public static final String HET_SERVICE = "het";

在目录aosp\frameworks\base\core\java\android\app

SystemServiceRegistry.java 里添加

import android.os.het.HetManager;
import android.os.het.IHetService;
...
registerService(Context.HET_SERVICE, HetManager.class,new CachedServiceFetcher<HetManager>() {@Overridepublic HetManager createService(ContextImpl ctx) throws ServiceNotFoundException {IBinder b = ServiceManager.getServiceOrThrow(Context.HET_SERVICE);return new HetManager(ctx, IHetService.Stub.asInterface(b));}});
...

在目录aosp\frameworks\base\services\java\com\android\server

SystemServer.java 添加

import com.android.server.het.HetService;
private void startOtherServices() {...HetService het = null;boolean disableHet = SystemProperties.getBoolean("config.disable_het", false);...if (!disableHet) {traceBeginAndSlog("StartHetService");try {Slog.i(TAG, "het Service");// het supporthet = new HetService(context);ServiceManager.addService(Context.HET_SERVICE, het);} catch (Throwable e) {Slog.e(TAG, "Failure starting HetService", e);}traceEnd();}...
}
4.1.3 添加SELinux策略

public目录

service.te添加

type het_service, system_api_service, system_server_service, service_manager_type;
type hal_het_service, system_api_service, system_server_service, service_manager_type;

将以上修改同步到aosp\system\sepolicy\prebuilts\api\26.0\public

private 目录

service_contexts 添加 和Context 保持一致 HET_SERVICE = “het”;

het      u:object_r:het_service:s0

system_server.te 添加

hal_client_domain(system_server, hal_het)

private/compat/26.0/26.0.ignore.cil 添加

het_service

将以上修改同步到aosp\system\sepolicy\prebuilts\api\26.0\private

4.2 APP调用

4.3 三方APP调用

添加SELinuxc策略

在aosp\device\rockchip\common\sepolicy\untrusted_app.te添加

allow untrusted_app het_service:service_manager { find };

五. 设备节点添加SELinux策略

1. common目录

在aosp\device\rockchip\common\sepolicy\file_contexts添加

/dev/lock_p      u:object_r:ttyS_device:s0

在aosp\device\rockchip\common\sepolicy\system_server.te添加

allow system_server ttyS_device:chr_file rw_file_perms;

2. public目录

在aosp\system\sepolicy\public\device.te添加

type ttyS_device, dev_type, mlstrustedobject;

同步到aosp\system\sepolicy\prebuild\api\26.0\public中

3. init.rc

在aosp\device\rockchip\rk3288\init.rk3288.rc添加

 chmod 0666 /dev/lock_pchown system system /dev/lock_p

Rk3326 Android8.0HAL服务添加相关推荐

  1. [图]为C# Windows服务添加安装程序

    最近一直在搞Windows服务,也有了不少经验,感觉权限方面确定比一般程序要受限很多,但方便性也很多.像后台运行不阻塞系统,不用用户登录之类.哈哈,扯远了,今天讲一下那个怎么给Windows服务做个安 ...

  2. Android的***.sh的开机服务添加

    Android的***.sh的开机服务添加 Android的***.sh的开机服务添加 1.写好wifi_scan_android.sh 2.直接将wifi_scan_android放到./devic ...

  3. 为C# Windows服务添加安装程序

    首先,当然是创建一个Windows服务的项目.这个大家应该都知道怎么做(这都不明白的留言问我),然后要给服务"添加安装程序",如图1所示:(这一步和自己用InstallUtil注册 ...

  4. 给Windows 服务添加命令行参数

    1. 首先,给服务的Main方法添加参数,判断如果参数为"-s"则运行服务. static void Main(string[] args) {     // 运行服务     i ...

  5. 苹果为CloudKit云服务添加服务器端API

    北京时间2月6日凌晨消息,苹果公司已经悄无声息地为CloudKit云端数据存储服务添加了一个服务器端API(应用程序接口),此前该公司在开发者新闻博客上宣布了这个消息.这将使得开发者能为以CloudK ...

  6. Http服务添加认证

    yum -y install httpdmkdir /var/www/html/test #创建测试目录 vi /etc/httpd/conf/http.conf #在配置文件中找到<Direc ...

  7. 如何为windows服务添加安装程序(转)

    1.将写好的windows服务切换到设计视图,右键-添加安装程序  2.切换到新生成的ProjectInstaller.cs设计视图,找到serviceProcessInstaller1对Accoun ...

  8. ubuntu 12.04 配置vsftpd 服务,添加虚拟用户,ssl加密

    1.对于12.04的vsftpd 有一些bug,推荐安装版本vsftpd_2.3.5-1ubuntu2ppa1_amd64.deb apt-get install python-software-pr ...

  9. 商品微服务添加api接口

    编写跳转controller 在learn-goods-web中编写controller,接收请求,并跳转到商品详情页: @Controller @RequestMapping("item& ...

最新文章

  1. Python+selenium 自动化-通过窗口名切换窗口,如何获取当前窗口的title窗口名
  2. java线程的简单例子(Thread and runnable)
  3. 黑苹果2k屏_一加手机屏幕新特性:120Hz、2K+ OLED、10bit
  4. JAXB实现java对象与xml之间转换
  5. asp.net 页面缓存、数据缓存
  6. 保障4-0618任务打卡
  7. 【工作提效】PLSQL使用技巧
  8. PC端微信打不开小程序解决
  9. c++中arccos()的用法(提醒自己)
  10. 10-调用门(有参)实验
  11. svnadmin load 遇到E125005 的错误
  12. python xlsx转xls_Python 批量将xls文件转换为xlsx
  13. 考考你的基础知识:C++ 文件操作ofstream、ifstream使用
  14. 趣店再次收到不合规通知函:市值不足2亿美元 面临退市危机
  15. 数据结构与算法python语言实现-第四章答案
  16. 微信小程序App的使用
  17. 通过acquire方法看懂RateLimiter限流机制
  18. 1109:开关灯(C C++)
  19. Mac母带制作软件:Steinberg WaveLab 11 Pro
  20. 凌恩客户文章|《Microbiome》:宏基因组构建反刍动物全消化道超1万个MAGs新进展

热门文章

  1. 验证银行卡卡号是否符合规则
  2. 网页版 连连看 html5实现
  3. oracle导出辅助账明细,AO2011导入国库集中支付系统3.0的辅助账资料.doc
  4. 物联网信息安全复习笔记
  5. 阿里云视频点播(VOD)控制台上传慢解决方案
  6. Unraid使用记录:系统安装与基础设置
  7. 学计算机有哪些推荐书籍?
  8. 网络安全进阶篇之免杀(十四章-9)MSF加密壳免杀过360
  9. 解决docker-compose up -d 出现Client.Timeout exceeded while awaiting headers的问题(配置docker国内镜像源)
  10. mysql navicate查询_Mysql Navicate 基础操作与SQL语句 版本5.7.29