实现自己的HAL-15 控制led(Android 8.1 selinux 配置(自定义系统服务,以及节点的读写)),从app 到 hal 到底层内核kernel层的驱动 的实现
Posted 杨斌并
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现自己的HAL-15 控制led(Android 8.1 selinux 配置(自定义系统服务,以及节点的读写)),从app 到 hal 到底层内核kernel层的驱动 的实现相关的知识,希望对你有一定的参考价值。
android 8.1 selinux 配置(自定义系统服务,以及节点的读写)
SELinux概述
- SELinux 简述
SELinux,安全增强Linux(Security-Enhanced Linux),是由美国国家安全局(NSA)发起, 多个非营利组织和高校参与开发的强制性安全审查机制(Mandatory Access control,简称MAC)。SELinux最早于2000年12月采用GPL许可发布。目前,Linux Kernel 2.6 及以上的版本都已经集成了SELinux。 - SELinux模式
- Disabled(关闭),Selinux并没有实际运行。
- Permissve(宽容模式),宽容模式只通过Kernel Audit System 记录LOG, 但不拦截访问。
- Enfocing mode(强制模式),强制模式在记录LOG 的同时,还会拦截访问。
- 查看SELinux
adb shell getenforce
- 在设备里使用
getenforce
- 设置SELinux模式
adb shell setenforce 1
adb shell setenforce 0- 0是Permissve
- 1是Enfocing
SELinux 的实战配置
-
Android 自定义服务,添加avc权限
-
在自定义的系统service的实现 中 添加的系统服务 在app 调用(HelloWorldServiceManger) getSystemService(“helloworldservice”); 时会找不到"helloworldservice"这个服务,原因如下:
E/SELinux: avc: denied { add } for service=hello_world_service pid=474 uid=1000 scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=1
- 将helloworldservice 该服务addservice 到 SystemService 需要添加 SELinux 的avc权限
- 添加权限的一些配置步骤
traceBeginAndSlog("StartHelloWorldService"); ServiceManager.addService(Context.HELLO_WORLD, new HelloWorldService()); traceEnd();
public abstract class Context { ~~~ public static final String HELLO_WORLD = "helloworldservice"; ~~~ }
-
通过以上的代码可以看出我的服务是 “helloworldservice”,那么就有以 “helloworldservice” 为例,这个名字中尽量不要包含"_"这个符号
- 在Z:\\itop-3399_8.1\\system\\sepolicy\\private\\service_contexts 下添加
window u:object_r:window_service:s0
* u:object_r:default_android_service:s0
###在这里##########
helloworldservice u:object_r:helloworldservice_service:s0
声明 服务helloworldservice 的名字为helloworldservice_service
- 在Z:\\itop-3399_8.1\\system\\sepolicy\\public\\service.te 下 添加
type wifiaware_service, app_api_service, system_server_service, service_manager_type;
type window_service, system_api_service, system_server_service, service_manager_type;
###########在这里###############
type helloworldservice_service,app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
声明 helloworldservice_service 类型
- 在 Z:\\itop-3399_8.1\\system\\sepolicy\\prebuilts\\api\\26.0\\private\\service_contexts 添加同样的
window u:object_r:window_service:s0
* u:object_r:default_android_service:s0
###########在这里####################
helloworldservice u:object_r:helloworldservice_service:s0
- 在 Z:\\itop-3399_8.1\\system\\sepolicy\\prebuilts\\api\\26.0\\public\\service.te 添加同样的
type window_service, system_api_service, system_server_service, service_manager_type;
###########在这里####################
type helloworldservice_service,app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
- 在 Z:\\itop-3399_8.1\\system\\sepolicy\\prebuilts\\api\\26.0\\nonplat_sepolicy.cil 下 添加
(roletype object_r voiceinteraction_service_26_0)
(typeattribute vr_manager_service_26_0)
(roletype object_r vr_manager_service_26_0)
##############################################添加在这里#################
(typeattribute helloworldservice_service_26_0)
(roletype object_r helloworldservice_service_26_0)
##############################################添加在这里#################
(typeattribute wallpaper_service_26_0)
- 在 Z:\\itop-3399_8.1\\system\\sepolicy\\prebuilts\\api\\26.0\\nonplat_sepolicy.cil 下添加
找到 typeattributeset system_server_service 在后面拼加 自己的 helloworldservice_service_26_0
############# 找到 typeattributeset system_server_service 在后面拼加 自己的 helloworldservice_service_26_0######################### 下面是我的
(typeattributeset system_server_service (accessibility_service_26_0 account_service_26_0 activity_service_26_0 alarm_service_26_0 appops_service_26_0 appwidget_service_26_0 assetatlas_service_26_0 audio_service_26_0 autofill_service_26_0 backup_service_26_0 batterystats_service_26_0 battery_service_26_0 bluetooth_manager_service_26_0 cameraproxy_service_26_0 clipboard_service_26_0 contexthub_service_26_0 IProxyService_service_26_0 commontime_management_service_26_0 companion_device_service_26_0 connectivity_service_26_0 connmetrics_service_26_0 consumer_ir_service_26_0 content_service_26_0 country_detector_service_26_0 coverage_service_26_0 cpuinfo_service_26_0 dbinfo_service_26_0 device_policy_service_26_0 deviceidle_service_26_0 device_identifiers_service_26_0 devicestoragemonitor_service_26_0 diskstats_service_26_0 display_service_26_0 font_service_26_0 netd_listener_service_26_0 DockObserver_service_26_0 dreams_service_26_0 dropbox_service_26_0 ethernet_service_26_0 fingerprint_service_26_0 gfxinfo_service_26_0 graphicsstats_service_26_0 hardware_service_26_0 hardware_properties_service_26_0 hdmi_control_service_26_0 input_method_service_26_0 input_service_26_0 imms_service_26_0 ipsec_service_26_0 jobscheduler_service_26_0 launcherapps_service_26_0 location_service_26_0 lock_settings_service_26_0 media_projection_service_26_0 media_router_service_26_0 media_session_service_26_0 meminfo_service_26_0 midi_service_26_0 mount_service_26_0 netpolicy_service_26_0 netstats_service_26_0 network_management_service_26_0 network_score_service_26_0 network_time_update_service_26_0 notification_service_26_0 oem_lock_service_26_0 otadexopt_service_26_0 overlay_service_26_0 package_service_26_0 permission_service_26_0 persistent_data_block_service_26_0 pinner_service_26_0 power_service_26_0 print_service_26_0 processinfo_service_26_0 procstats_service_26_0 recovery_service_26_0 registry_service_26_0 restrictions_service_26_0 rttmanager_service_26_0 samplingprofiler_service_26_0 scheduling_policy_service_26_0 search_service_26_0 sec_key_att_app_id_provider_service_26_0 sensorservice_service_26_0 serial_service_26_0 servicediscovery_service_26_0 settings_service_26_0 shortcut_service_26_0 statusbar_service_26_0 storagestats_service_26_0 task_service_26_0 textclassification_service_26_0 textservices_service_26_0 telecom_service_26_0 trust_service_26_0 tv_input_service_26_0 uimode_service_26_0 updatelock_service_26_0 usagestats_service_26_0 usb_service_26_0 user_service_26_0 vibrator_service_26_0 voiceinteraction_service_26_0 vr_manager_service_26_0 wallpaper_service_26_0 webviewupdate_service_26_0 wifip2p_service_26_0 wifiscanner_service_26_0 wifi_service_26_0 wifiaware_service_26_0 window_service_26_0 helloworldservice_service_26_0))
找到app_api_service 在后面拼加 自己的 helloworldservice_service_26_0
找到ephemeral_app_api_service在后面拼加 自己的 helloworldservice_service_26_0
找到service_manager_type在后面拼加 自己的 helloworldservice_service_26_0
- 在Z:\\itop-3399_8.1\\system\\sepolicy\\private\\compat\\26.0\\26.0.cil 添加如下配置
(typeattributeset helloworldservice_service_26_0 (helloworldservice_service))
- 如果 在Z:\\itop-3399_8.1\\system\\sepolicy\\prebuilts\\api\\26.0 下没有添加如上的配置编译会报错,报错的日志如下
SELinux: The following types were found added to the policy without an entry into the compatibility
mapping file(s) found in private/compat/26.0/26.0[.ignore].cil/nhello_led_device
上面的是必须的下面的根据自己的需求配置
##允许platform_app 通过service_manager 获取自己的服务
platform_app.te 增加 : allow platform_app xxx_serivce:service_manager find;
##允许priv_app通过service_manager 获取自己的服务
priv_app.te 增加 : allow priv_app xxx_serivce:service_manager find;
##允许radio通过service_manager 获取自己的服务
radio.te 增加 : allow radio xxx_serivce:service_manager { add find };
##允许system_app通过service_manager 获取自己的服务
system_app.te 增加 : allow system_app xxx_serivce:service_manager add;
##允许system_server通过service_manager 获取自己的服务
system_server.te 增加 : allow system_server xxx_serivce:service_manager { add find };
Android 设备节点SELinux 服务配置
- 在实现自己的HAL-9 控制led(驱动)中成功将驱动装到内核后,会生成节点/dev/hello_led 如图:
- 配置步骤
- 在 Z:\\itop-3399_8.1\\system\\sepolicy\\prebuilts\\api\\26.0\\private\\file_contexts 中添加
/dev/__properties__ u:object_r:properties_device:s0
###############添加的内容在这里#######################
/dev/hello_led u:object_r:hello_led_device:s0
声明节点的名称
- 在Z:\\itop-3399_8.1\\system\\sepolicy\\prebuilts\\api\\26.0\\public\\device.te 中添加
type misc_block_device, dev_type;
###############添加的内容在这里#######################
type hello_led_device, dev_type;
- 在 Z:\\itop-3399_8.1\\system\\sepolicy\\prebuilts\\api\\26.0\\nonplat_sepolicy.cil 下添加
找到 typeattributeset dev_type 在后面拼加 自己的 hello_led_device_26_0 - 在 Z:\\itop-3399_8.1\\system\\sepolicy\\prebuilts\\api\\26.0\\nonplat_sepolicy.cil 下添加
(typeattribute hello_led_device_26_0)
(roletype object_r hello_led_device_26_0)
- 在Z:\\itop-3399_8.1\\system\\sepolicy\\private\\compat\\26.0\\26.0.cil 添加如下配置
(typeattributeset hello_led_device_26_0 (hello_led_device))
Android 设备节点SELinux 的编译
mmm system/sepolicy/
- 其中 private 会编译到system.img 中 而 public 目录会编译到 vendor.img 和 system.img 中
所以要编译的镜像为vendor.img和system.img
make system.img -j8
make vendor.img -j8
mmm packages/apps/HelloWorld/
make snod
- 将system.img 和 vendor.img 刷到系统 ok!!!
以上是关于实现自己的HAL-15 控制led(Android 8.1 selinux 配置(自定义系统服务,以及节点的读写)),从app 到 hal 到底层内核kernel层的驱动 的实现的主要内容,如果未能解决你的问题,请参考以下文章
实现自己的HAL-11 控制led(jni 的编写),从app 到 hal 到底层内核kernel层的驱动 的实现
实现自己的HAL-11 控制led(jni 的编写),从app 到 hal 到底层内核kernel层的驱动 的实现
实现自己的HAL-12 控制led(自定义的系统service的实现),从app 到 hal 到底层内核kernel层的驱动 的实现
实现自己的HAL-12 控制led(自定义的系统service的实现),从app 到 hal 到底层内核kernel层的驱动 的实现
实现自己的HAL-13 控制led(控制led 的app),从app 到 hal 到底层内核kernel层的驱动 的实现
实现自己的HAL-13 控制led(控制led 的app),从app 到 hal 到底层内核kernel层的驱动 的实现