赞
踩
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 不是String
- setCallback(IDeviceCallback callback) generates (bool res);
- //变量类型bool 不是boolean
- release();
- };
- 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
实现由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-service
- class hal
- user system
- group 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 mode using android::sp; int main() { #if 0 return defaultPassthroughServiceImplementation<IHet>(); //passthrough mode #else configureRpcThreadpool(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
在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-serv
对应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 下的对应文件,否则编译会报错)
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;
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
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
在目录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 statements
-
- interface 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 statements
-
- interface 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>() {
- @Override
- public DeviceListenerEvent createFromParcel(Parcel in) {
- return new DeviceListenerEvent(in);
- }
-
- @Override
- public DeviceListenerEvent[] newArray(int size) {
- return new DeviceListenerEvent[size];
- }
- };
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public 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 \
在目录 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();
- }
- }
-
- @Override
- public String setState(int type, String state) throws RemoteException {
- DeviceType deviceType = new DeviceType();
- deviceType.type = type;
- deviceType.state = state;
- return halService.setState(deviceType);
- }
-
- @Override
- public String getState(int type) throws RemoteException {
- return halService.getState(type);
- }
-
- @Override
- public boolean setDeviceEventListener(IDeviceEventListener listener) throws RemoteException {
- Log.d(TAG, "setDeviceEventListener: ");
- DeviceCallback callback = new DeviceCallback(listener);
- return halService.setCallback(callback);
- }
-
- @Override
- public void release() throws RemoteException {
- Log.d(TAG, "release: ");
- halService.release();
- }
-
- class DeviceCallback extends IDeviceCallback.Stub{
- IDeviceEventListener mIDeviceEventListener;
- DeviceCallback (IDeviceEventListener listener){
- mIDeviceEventListener = listener;
- }
- @Override
- public 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>() {
- @Override
- public 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 support
- het = new HetService(context);
- ServiceManager.addService(Context.HET_SERVICE, het);
- } catch (Throwable e) {
- Slog.e(TAG, "Failure starting HetService", e);
- }
- traceEnd();
- }
- ...
- }

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
略
添加SELinuxc策略
在aosp\device\rockchip\common\sepolicy\untrusted_app.te添加
allow untrusted_app het_service:service_manager { find };
在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;
在aosp\system\sepolicy\public\device.te添加
type ttyS_device, dev_type, mlstrustedobject;
同步到aosp\system\sepolicy\prebuild\api\26.0\public中
在aosp\device\rockchip\rk3288\init.rk3288.rc添加
- chmod 0666 /dev/lock_p
- chown system system /dev/lock_p
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。