当前位置:   article > 正文

Android AOSP 添加自定义服务流程_aosp自定义包全局调用

aosp自定义包全局调用

一. hardware部分

1.1 编写.hal

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

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

  1. //types.hal
  2. package android.hardware.het@1.0;
  3. struct DeviceType{
  4. int32_t type;
  5. string state;
  6. };
  7. struct DeviceEvent{
  8. int32_t what;
  9. string msg;
  10. };

新建 IHet.hal (主接口)

  1. package android.hardware.het@1.0;
  2. import IDeviceCallback;
  3. interface IHet {
  4. setState(DeviceType type) generates (string result);
  5. getState(int32_t type) generates (string result);
  6. //变量类型string 不是String
  7. setCallback(IDeviceCallback callback) generates (bool res);
  8. //变量类型bool 不是boolean
  9. release();
  10. };
1.2 使用hidl-gen生成变量
  1. source ./build/envsetup.sh
  2. lunch aosp_car_x86_64-eng
  3. make -j4
  4. make hidl-gen -j4

设置临时变量

  1. PACKAGE=android.hardware.het@1.0
  2. 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. +-- 1.0
  2. ¦ +-- Android.bp
  3. ¦ +-- Android.mk
  4. ¦ +-- default
  5. ¦ ¦ +-- Android.bp
  6. ¦ ¦ +-- android.hardware.het@1.0-service.rc
  7. ¦ ¦ +-- Het.cpp
  8. ¦ ¦ +-- Het.h
  9. ¦ ¦ +-- service.cpp
  10. ¦ +-- IDeviceCallback.hal
  11. ¦ +-- IHet.hal
  12. ¦ +-- types.hal
  13. +-- 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 启动脚本

  1. service het-hal-1-0 /vendor/bin/hw/android.hardware.het@1.0-service
  2. class hal
  3. user system
  4. group system

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

  1. #define LOG_TAG "android.hardware.het@1.0-service"
  2. #include <android-base/logging.h>
  3. #include <hidl/HidlTransportSupport.h>
  4. #include <android/hardware/het/1.0/IHet.h>
  5. #include <hidl/LegacySupport.h>
  6. #include "Het.h"
  7. using android::hardware::configureRpcThreadpool;
  8. using android::hardware::joinRpcThreadpool;
  9. using android::hardware::het::V1_0::IHet;
  10. using android::hardware::het::V1_0::implementation::Het;
  11. //using android::hardware::defaultPassthroughServiceImplementation;
  12. //passthrough mode
  13. using android::sp;
  14. int main() {
  15. #if 0
  16. return defaultPassthroughServiceImplementation<IHet>();
  17. //passthrough mode
  18. #else
  19. configureRpcThreadpool(4, true);
  20. sp<IHet> het = new Het();
  21. auto status = het->registerAsService();
  22. CHECK_EQ(status, android::OK) << "Failed to register het HAL implementation";
  23. joinRpcThreadpool();
  24. return 0; // joinRpcThreadpool shouldn't exit
  25. #endif
  26. }

修改Android.bp

  1. cc_library_shared {
  2. name: "android.hardware.het@1.0-impl",
  3. defaults: ["hidl_defaults"],
  4. srcs: ["Het.cpp",],
  5. shared_libs: [
  6. "libbase",
  7. "liblog",
  8. "libdl",
  9. "libutils",
  10. "libhardware",
  11. "libhidlbase",
  12. "libhidltransport",
  13. "android.hardware.het@1.0",
  14. ],
  15. }
  16. cc_binary {
  17. vendor: true,
  18. relative_install_path: "hw",
  19. defaults: ["hidl_defaults"],
  20. name: "android.hardware.het@1.0-service",
  21. init_rc: ["android.hardware.het@1.0-service.rc"],
  22. srcs: ["Het.cpp",
  23. "service.cpp",],
  24. shared_libs: [
  25. "libbase",
  26. "liblog",
  27. "libdl",
  28. "libutils",
  29. "libhardware",
  30. "libhidlbase",
  31. "libhidltransport",
  32. "android.hardware.het@1.0",
  33. ],
  34. }

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

编译

mmm ./hardware/interfaces/test/1.0

编译输出

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

二. device部分

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

  1. <hal format="hidl">
  2. <name>android.hardware.het</name>
  3. <transport>hwbinder</transport>
  4. <version>1.0</version>
  5. <interface>
  6. <name>IHet</name>
  7. <instance>default</instance>
  8. </interface>
  9. </hal>

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

  1. PRODUCT_PACKAGES += \
  2. android.hardware.het@1.0-impl \
  3. android.hardware.het@1.0-serv

三. 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 添加

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

新建hal_het_default.te

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

attributes 添加

  1. attribute hal_het;
  2. expandattribute hal_het true;
  3. attribute hal_het_client;
  4. expandattribute hal_het_client true;
  5. attribute hal_het_server;
  6. expandattribute hal_het_server false;
  7. #hal_attribute(het);

hwservice.te 添加

type hal_het_hwservice, hwservice_manager_type;

新建 hal_het.te

  1. # HwBinder IPC from client to server, and callbacks
  2. binder_call(hal_het_client, hal_het_server)
  3. binder_call(hal_het_server, hal_het_client)
  4. add_hwservice(hal_het_server, hal_het_hwservice)
  5. 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层 四个功能

  1. package android.os.het;
  2. import android.os.het.IDeviceEventListener;
  3. // Declare any non-default types here with import statements
  4. interface IHetService {
  5. /**
  6. * Demonstrates some basic types that you can use as parameters
  7. * and return values in AIDL.
  8. */
  9. String setState(int type, String state);
  10. String getState(int type);
  11. boolean setDeviceEventListener(IDeviceEventListener listener);
  12. void release();
  13. }

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

  1. package android.os.het;
  2. import android.os.het.DeviceListenerEvent;
  3. // Declare any non-default types here with import statements
  4. interface IDeviceEventListener {
  5. /**
  6. * Demonstrates some basic types that you can use as parameters
  7. * and return values in AIDL.
  8. */
  9. void onEvent (inout DeviceListenerEvent event);
  10. }

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

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

创建DeviceListerEvent.java

  1. package android.os.het;
  2. import android.os.Parcel;
  3. import android.os.Parcelable;
  4. /**
  5. * android.os.het.DeviceListenerEvent
  6. */
  7. public class DeviceListenerEvent implements Parcelable {
  8. private int what;
  9. private String msg;
  10. public DeviceListenerEvent(int what, String msg) {
  11. this.what = what;
  12. this.msg = msg;
  13. }
  14. public DeviceListenerEvent(Parcel in) {
  15. what = in.readInt();
  16. msg = in.readString();
  17. }
  18. public void setWhat(int what) {
  19. this.what = what;
  20. }
  21. public void setMsg(String msg) {
  22. this.msg = msg;
  23. }
  24. public int getWhat() {
  25. return what;
  26. }
  27. public String getMsg() {
  28. return msg;
  29. }
  30. public static final Creator<DeviceListenerEvent> CREATOR = new Creator<DeviceListenerEvent>() {
  31. @Override
  32. public DeviceListenerEvent createFromParcel(Parcel in) {
  33. return new DeviceListenerEvent(in);
  34. }
  35. @Override
  36. public DeviceListenerEvent[] newArray(int size) {
  37. return new DeviceListenerEvent[size];
  38. }
  39. };
  40. @Override
  41. public int describeContents() {
  42. return 0;
  43. }
  44. @Override
  45. public void writeToParcel(Parcel dest, int flags) {
  46. dest.writeInt(what);
  47. dest.writeString(msg);
  48. }
  49. /**
  50. * <p>从parcel中读取,从parcel中读取,顺序与write一致</p>
  51. * 如果要支持为 out 或者 inout 的定向 tag 的话,需要实现 readFromParcel() 方法
  52. * @param dest
  53. */
  54. public void readFromParcel(Parcel dest) {
  55. what = dest.readInt();
  56. msg = dest.readString();
  57. }
  58. }

创建HetManager.java 供上层APP调用

  1. package android.os.het;
  2. /**
  3. * ---------------------------------------------------------------- <br>
  4. * Copyright (C) 2014-2020, by het, Shenzhen, All rights reserved. <br>
  5. * ---------------------------------------------------------------- <br>
  6. * <p>
  7. * 描述: HetManager <br>
  8. * 作者: lei <br>
  9. * 日期: 2020/6/29 <br>
  10. */
  11. import android.os.RemoteException;
  12. import android.util.Log;
  13. import android.os.het.IHetService;
  14. import android.content.Context;
  15. public class HetManager {
  16. private final Context mContext;
  17. private IHetService mService;
  18. public static final String TAG = "HetManager";
  19. public HetManager(IHetService server) {
  20. Log.d(TAG, "HetManager: ");
  21. mContext = null;
  22. mService = server;
  23. }
  24. public HetManager(Context context, IHetService server) {
  25. Log.d(TAG, "HetManager: ");
  26. mContext = context;
  27. mService = server;
  28. }
  29. public String setState(int type, String state) {
  30. Log.d(TAG, "setState: " + type + " " + state);
  31. try {
  32. if (mService != null) {
  33. return mService.setState(type, state);
  34. }
  35. } catch (RemoteException e) {
  36. e.printStackTrace();
  37. }
  38. return "";
  39. }
  40. public String getState(int type) {
  41. Log.d(TAG, "getState: " + type);
  42. try {
  43. if (mService == null) {
  44. return null;
  45. }
  46. return mService.getState(type);
  47. } catch (RemoteException e) {
  48. e.printStackTrace();
  49. }
  50. return "service connect failed";
  51. }
  52. public boolean setDeviceListener(DeviceEventListener listener) {
  53. Log.d(TAG, "setDeviceListener: ");
  54. try {
  55. if (mService == null) {
  56. return false;
  57. }
  58. return mService.setDeviceEventListener(listener);
  59. } catch (RemoteException e) {
  60. e.printStackTrace();
  61. return false;
  62. }
  63. }
  64. public void release() {
  65. Log.d(TAG, "release: ");
  66. try {
  67. if (mService != null) {
  68. mService.release();
  69. }
  70. } catch (RemoteException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. }

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

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

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

  1. LOCAL_JAVA_LIBRARIES := \
  2. ...
  3. android.hardware.het-V1.0-java \
  4. ...

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

  1. LOCAL_STATIC_JAVA_LIBRARIES := \
  2. ...
  3. android.hardware.het-V1.0-java-static \
  4. ...

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

新建HetService.java

  1. package com.android.server.het;
  2. import android.content.Context;
  3. import android.hardware.het.V1_0.IHet;
  4. import android.hardware.het.V1_0.DeviceType;
  5. import android.hardware.het.V1_0.IDeviceCallback;
  6. import android.hardware.het.V1_0.DeviceEvent;
  7. import android.os.RemoteException;
  8. import android.os.het.DeviceListenerEvent;
  9. import android.os.het.IDeviceEventListener;
  10. import android.os.het.IHetService;
  11. import android.util.Log;
  12. /**
  13. * ---------------------------------------------------------------- <br>
  14. * Copyright (C) 2014-2020, by het, Shenzhen, All rights reserved. <br>
  15. * ---------------------------------------------------------------- <br>
  16. * <p>
  17. * 描述: HetService <br>
  18. * 作者: lei <br>
  19. * 日期: 2020/6/29 <br>
  20. */
  21. public class HetService extends IHetService.Stub {
  22. private String TAG = "HetService";
  23. private final Context mContext;
  24. private IHet halService ;
  25. public HetService(Context context){
  26. mContext = context;
  27. try {
  28. halService = IHet.getService();//获取service
  29. } catch (RemoteException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. @Override
  34. public String setState(int type, String state) throws RemoteException {
  35. DeviceType deviceType = new DeviceType();
  36. deviceType.type = type;
  37. deviceType.state = state;
  38. return halService.setState(deviceType);
  39. }
  40. @Override
  41. public String getState(int type) throws RemoteException {
  42. return halService.getState(type);
  43. }
  44. @Override
  45. public boolean setDeviceEventListener(IDeviceEventListener listener) throws RemoteException {
  46. Log.d(TAG, "setDeviceEventListener: ");
  47. DeviceCallback callback = new DeviceCallback(listener);
  48. return halService.setCallback(callback);
  49. }
  50. @Override
  51. public void release() throws RemoteException {
  52. Log.d(TAG, "release: ");
  53. halService.release();
  54. }
  55. class DeviceCallback extends IDeviceCallback.Stub{
  56. IDeviceEventListener mIDeviceEventListener;
  57. DeviceCallback (IDeviceEventListener listener){
  58. mIDeviceEventListener = listener;
  59. }
  60. @Override
  61. public void onDeviceEvent(DeviceEvent event) throws RemoteException {
  62. Log.d(TAG, "onDeviceEvent: ");
  63. DeviceListenerEvent deviceListenerEvent = new DeviceListenerEvent(event.what,event.msg);
  64. mIDeviceEventListener.onEvent(deviceListenerEvent);
  65. }
  66. }
  67. }

在目录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 里添加

  1. import android.os.het.HetManager;
  2. import android.os.het.IHetService;
  3. ...
  4. registerService(Context.HET_SERVICE, HetManager.class,
  5. new CachedServiceFetcher<HetManager>() {
  6. @Override
  7. public HetManager createService(ContextImpl ctx) throws ServiceNotFoundException {
  8. IBinder b = ServiceManager.getServiceOrThrow(Context.HET_SERVICE);
  9. return new HetManager(ctx, IHetService.Stub.asInterface(b));
  10. }});
  11. ...

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

SystemServer.java 添加

  1. import com.android.server.het.HetService;
  2. private void startOtherServices() {
  3. ...
  4. HetService het = null;
  5. boolean disableHet = SystemProperties.getBoolean("config.disable_het", false);
  6. ...
  7. if (!disableHet) {
  8. traceBeginAndSlog("StartHetService");
  9. try {
  10. Slog.i(TAG, "het Service");
  11. // het support
  12. het = new HetService(context);
  13. ServiceManager.addService(Context.HET_SERVICE, het);
  14. } catch (Throwable e) {
  15. Slog.e(TAG, "Failure starting HetService", e);
  16. }
  17. traceEnd();
  18. }
  19. ...
  20. }
4.1.3 添加SELinux策略

public目录

service.te添加

  1. type het_service, system_api_service, system_server_service, service_manager_type;
  2. 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添加

  1. chmod 0666 /dev/lock_p
  2. chown system system /dev/lock_p
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/317888
推荐阅读
相关标签
  

闽ICP备14008679号