为三方bin建立工程
在vendor/自己公司目录
下建立工程文件夹,我这里以CarpalyMonter工程,新建如下文件
CarplayMonitor为三方bin文件
Android.mk模块编译配置如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := carplaymonitor #模块名字
LOCAL_SRC_FILES := CarplayMonitor #源文件
LOCAL_INIT_RC := carplaymonitor.rc #开机启动文件
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := EXECUTABLES #执行文件
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/bin #输出目录
LOCAL_SHARED_LIBRARIES := libcutils liblog libmdnssd libnetutils libstdc++ libtinyalsa #依赖库,每个不一样。改成自己的,不知道不写编译时候回提示修复,复制粘贴上即可
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true #不检测依赖
include $(BUILD_PREBUILT)
CarPlayMonitor.mk系统编译配置如下:
#产品包添加编译模块
PRODUCT_PACKAGES += \
carplaymonitor
# selinux增加本模块配置路径
BOARD_SEPOLICY_DIRS += \
vendor/External/CarplayMonitor/sepolicy
carplaymonitor.rc开机启动配置文件如下:
service carplaymonitor /system/bin/carplaymonitor
class main
user root
group root system
disabled
oneshot
#开机完成后再执行
on property:sys.boot_completed=1
start carplaymonitor
carplaymontior.te配置如下:
type carplaymonitor, domain, coredomain;
type carplaymonitor_exec, exec_type, file_type, system_file_type;
init_daemon_domain(carplaymonitor)
file_contexts配置如下:
# System files
/system/bin/carplaymonitor u:object_r:carplaymonitor_exec:s0
carplaymontior.te的system_file_type配置如何确定?
我的bin文件输出路径是system/bin
目录,使用adb进入后执行命令ls lZ
查看即可确定:
编译调试
编译完成后,烧录固件到机器中,如果使用命令ps -A|grep carplaymontor
查看模块是否自启动成功,如果失败,可以通过手动执行的方式使用控台命令 ./
,查看脚本功能是否可以启动。
如果有权限报错,可以先临时关闭selinux进行调试,临时关闭selinux方式如下:
setenforce 0
在adb中执行,再次手动执行。
使用 audit2allow 工具添加SELinux权限
启动程序会在log输出如下avc的log,根据上面应用的命名过滤下。
使用文本记录记录保存为avc_log.txt。命名随意,注意仅仅保存avc以后日志
进入源码路径执行
source build/envsetup
再执行
lunch [自己的镜像]
如果不执行以上命令有如下错误:
将avc_log.txt上传到AOSP源码audit2allow路径external/selinux/prebuilts/bin/audit2allow
使用ssh执行如下命令:
audit2allow -i avc_log.txt
将allow如下输出复制到te文件中,启动编译。
carplaymontior.te配置添加avc后如下:
type carplaymonitor, domain, coredomain;
type carplaymonitor_exec, exec_type, file_type, system_file_type;
init_daemon_domain(carplaymonitor)
# 生成的te配置
allow carplaymonitor tty_device:chr_file { ioctl open read write };
单编通过的话说明语法没问题,也没有触发 neverallow 。然后再全编译验证即可。
nerverallow处理
出现了nerverallow是比较头疼的事情,出现的原因主要是路径使用了不允许的权限导致的,解决办法一般有2个:
在出现报错的地方,强行注释掉google不允许的权限,这样可能会造成google的测试无法通过。最好不要使用,高版本对权限限制严格,最好不要夸分区调用,如system调用vendor里的文件。
通过其他办法绕过该权限,如vendor访问system是没办法实现的,那就可以将需要访问的资源再编译一份放到vendor。