Android5 中,安全机制增强后, 自己写的 操作 串口 的APP 想正确运行, 都需要经过一番折腾.
我从 svn checkout http://android-serialport-api.googlecode.com/svn/trunk/ android-serialport-api-read-only 这里下了个老牌的串口测试程序, 编译到 API 21 版本, 成功生成 APK 文件, 在开发板上运行,
会出现下面的错误(在android5 以前的版本是可以正常运行的)
[ 2675.458824] type=1400 audit(1435647256.801:4): avc: denied { read } for pid=2147 comm="port_api.sample" name="/" dev="tmpfs" ino=3074 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0
[ 2685.263432] type=1400 audit(1435647266.601:5): avc: denied { read } for pid=2172 comm="port_api.sample" name="/" dev="tmpfs" ino=3074 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0
[ 4740.602723] type=1400 audit(1435649321.941:6): avc: denied { read } for pid=9184 comm="port_api.sample" name="/" dev="tmpfs" ino=3074 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0
[ 4818.779498] type=1400 audit(1435649400.121:7): avc: denied { read } for pid=9815 comm="port_api.sample" name="/" dev="tmpfs" ino=3074 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0
[ 4842.962507] type=1400 audit(1435649424.301:8): avc: denied { read } for pid=9971 comm="port_api.sample" name="/" dev="tmpfs" ino=3074 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0
google搜索了一下, 是因为SELinux安全机制, 需要grant合适的权限.
grant权限, 必须先知道自己的APP运行在哪种进程类型.
想知道自己的 进程(APP)属于什么 *.te 吗?
用 ps -Z 查看:
root@sabresd_6dq:/ # ps -Z
LABEL USER PID PPID NAME
u:r:init:s0 root 1 0 /init
u:r:kernel:s0 root 2 0 kthreadd
u:r:kernel:s0 root 3 2 ksoftirqd/0
u:r:kernel:s0 root 5 2 kworker/0:0H
u:r:kernel:s0 root 7 2 migration/0
u:r:kernel:s0 root 8 2 rcu_preempt
u:r:kernel:s0 root 9 2 rcu_bh
u:r:kernel:s0 root 10 2 rcu_sched
u:r:kernel:s0 root 11 2 migration/1
u:r:kernel:s0 root 12 2 ksoftirqd/1
u:r:kernel:s0 root 13 2 kworker/1:0
u:r:kernel:s0 root 14 2 kworker/1:0H
u:r:kernel:s0 root 15 2 migration/2
u:r:kernel:s0 root 16 2 ksoftirqd/2
u:r:kernel:s0 root 17 2 kworker/2:0
u:r:kernel:s0 root 18 2 kworker/2:0H
u:r:kernel:s0 root 19 2 migration/3
u:r:kernel:s0 root 20 2 ksoftirqd/3
u:r:kernel:s0 root 21 2 kworker/3:0
u:r:kernel:s0 root 22 2 kworker/3:0H
u:r:kernel:s0 root 23 2 khelper
u:r:kernel:s0 root 24 2 kdevtmpfs
u:r:kernel:s0 root 25 2 suspend_sys_syn
u:r:kernel:s0 root 26 2 suspend
u:r:kernel:s0 root 28 2 kworker/1:1
u:r:kernel:s0 root 30 2 kworker/3:1
u:r:kernel:s0 root 31 2 writeback
u:r:kernel:s0 root 32 2 bioset
u:r:kernel:s0 root 33 2 crypto
u:r:kernel:s0 root 34 2 kblockd
u:r:kernel:s0 root 35 2 khubd
u:r:kernel:s0 root 41 2 ipu1_task
u:r:kernel:s0 root 42 2 ipu1_task
u:r:kernel:s0 root 43 2 ipu2_task
u:r:kernel:s0 root 44 2 ipu2_task
u:r:kernel:s0 root 45 2 rpciod
u:r:kernel:s0 root 46 2 kswapd0
u:r:kernel:s0 root 47 2 ksmd
u:r:kernel:s0 root 48 2 fsnotify_mark
u:r:kernel:s0 root 49 2 nfsiod
u:r:kernel:s0 root 86 2 kworker/0:3
u:r:kernel:s0 root 87 2 spi32766
u:r:kernel:s0 root 90 2 ci_otg
u:r:kernel:s0 root 91 2 dm_bufio_cache
u:r:kernel:s0 root 92 2 cfinteractive
u:r:kernel:s0 root 93 2 irq/352-2198000
u:r:kernel:s0 root 94 2 galcore workque
u:r:kernel:s0 root 95 2 Vivante Kernel
u:r:kernel:s0 root 96 2 mmcqd/1
u:r:kernel:s0 root 97 2 galcore daemon
u:r:kernel:s0 root 98 2 galcore daemon
u:r:kernel:s0 root 99 2 galcore daemon
u:r:kernel:s0 root 100 2 vpu_wq
u:r:kernel:s0 root 101 2 binder
u:r:kernel:s0 root 102 2 krfcommd
u:r:kernel:s0 root 103 2 deferwq
u:r:kernel:s0 root 104 2 f_mtp
u:r:kernel:s0 root 105 2 file-storage
u:r:ueventd:s0 root 106 1 /sbin/ueventd
u:r:watchdogd:s0 root 107 1 /sbin/watchdogd
u:r:kernel:s0 root 109 2 kworker/0:1H
u:r:kernel:s0 root 110 2 jbd2/mmcblk1p5-
u:r:kernel:s0 root 111 2 ext4-dio-unwrit
u:r:kernel:s0 root 112 2 jbd2/mmcblk1p4-
u:r:kernel:s0 root 113 2 ext4-dio-unwrit
u:r:kernel:s0 root 114 2 jbd2/mmcblk1p6-
u:r:kernel:s0 root 115 2 ext4-dio-unwrit
u:r:kernel:s0 root 116 2 jbd2/mmcblk1p7-
u:r:kernel:s0 root 117 2 ext4-dio-unwrit
u:r:logd:s0 logd 118 1 /system/bin/logd
u:r:healthd:s0 root 119 1 /sbin/healthd
u:r:lmkd:s0 root 120 1 /system/bin/lmkd
u:r:servicemanager:s0 system 121 1 /system/bin/servicemanager
u:r:vold:s0 root 122 1 /system/bin/vold
u:r:surfaceflinger:s0 system 123 1 /system/bin/surfaceflinger
u:r:init_shell:s0 root 124 1 /system/bin/sh
u:r:netd:s0 root 125 1 /system/bin/netd
u:r:debuggerd:s0 root 126 1 /system/bin/debuggerd
u:r:drmserver:s0 drm 127 1 /system/bin/drmserver
u:r:mediaserver:s0 media 128 1 /system/bin/mediaserver
u:r:installd:s0 install 129 1 /system/bin/installd
u:r:keystore:s0 keystore 130 1 /system/bin/keystore
u:r:rild:s0 root 131 1 /system/bin/rild
u:r:zygote:s0 root 132 1 zygote
u:r:sdcardd:s0 media_rw 134 1 /system/bin/sdcard
u:r:su:s0 root 136 1 /sbin/adbd
u:r:kernel:s0 root 151 2 kauditd
u:r:kernel:s0 root 152 2 kworker/2:1H
u:r:kernel:s0 root 157 2 kworker/3:1H
u:r:kernel:s0 root 160 2 kworker/1:1H
u:r:system_server:s0 system 411 132 system_server
u:r:platform_app:s0 u0_a14 497 132 com.android.systemui
u:r:kernel:s0 root 512 2 cfg80211
u:r:untrusted_app:s0 u0_a5 518 132 android.process.media
u:r:wpa:s0 wifi 581 1 /system/bin/rtl_wpa_supplicant
u:r:untrusted_app:s0 u0_a34 620 132 com.android.inputmethod.latin
u:r:radio:s0 radio 714 132 com.android.server.telecom
u:r:radio:s0 radio 734 132 com.android.phone
u:r:untrusted_app:s0 u0_a7 775 132 com.android.launcher
u:r:kernel:s0 root 813 2 RTW_CMD_THREAD
u:r:untrusted_app:s0 u0_a2 830 132 android.process.acore
u:r:untrusted_app:s0 u0_a27 873 132 com.android.deskclock
u:r:system_app:s0 system 1191 132 com.android.settings
u:r:untrusted_app:s0 u0_a10 1276 132 com.android.musicfx
u:r:bluetooth:s0 bluetooth 1379 132 com.android.bluetooth
u:r:dhcp:s0 dhcp 1584 1 /system/bin/dhcpcd
u:r:untrusted_app:s0 u0_a20 1824 132 com.android.browser
u:r:kernel:s0 root 1967 2 kworker/u8:1
u:r:platform_app:s0 u0_a39 1983 132 com.android.packageinstaller
u:r:platform_app:s0 u0_a29 2025 132 com.android.documentsui
u:r:platform_app:s0 u0_a3 2080 132 com.android.defcontainer
u:r:untrusted_app:s0 u0_a32 2107 132 com.android.gallery3d
u:r:untrusted_app:s0 u0_a40 2128 132 com.svox.pico
u:r:system_app:s0 system 9097 132 com.android.keychain
u:r:untrusted_app:s0 u0_a49 10723 132 android_serialport_api.sample
u:r:kernel:s0 root 10994 2 kworker/0:1
u:r:su:s0 root 11004 136 /system/bin/sh
u:r:su:s0 root 11017 136 logcat
u:r:kernel:s0 root 17033 2 kworker/u8:0
u:r:untrusted_app:s0 u0_a37 17138 132 com.android.music
u:r:kernel:s0 root 19474 2 kworker/2:2
u:r:su:s0 root 29110 11004 ps
root@sabresd_6dq:/ #
我的 android_serialport_api.sample 进程安全策由 untrusted_app 这个组配置, 即是 需要修改 untrusted_app.te 文件. 可参见 http://blog.csdn.net/tung214/article/details/44461985 这篇文件
只是我修改的 untrusted_app.te 文件的位置不同, 我的是freescale开发板, 我修改的是 (android_root_file)/device/fsl/imx6/sepolicy/untrusted_app.te
添加:
allow untrusted_app tty_device:chr_file rw_file_perms
///
用 ls -Z 查看object的所属 domain,
ps -Z 查看进行 所属 domain
id -Z 查看当前用户信息
调试 SELinux 的权限设置, 需要学会看懂 log 中的信息
======================================================================================================
======================================================================================================
如果要让系统添加新的硬件支持, 比如添加一个4G模块, 这需要修改kernel和android framework层.
4G 模块驱动正确添加之后, 一般会生成 一个 网络接口 例如: eth0, 一个/dev 下的设备节点, 和 /dev 下 几个 ttyUSB* 虚拟串口....
在android 5 中使用这些节点, 需要做些审核策略设置.
查看设备节点的信息:
root@sabresd_6qd:/dev # ls -Z
crw------- root root u:object_r:device:s0 mxs_viim
crw------- root root u:object_r:device:s0 network_latency
crw------- root root u:object_r:device:s0 network_throughput
crw-rw-rw- root root u:object_r:null_device:s0 null
crw-rw---- radio vpn u:object_r:ppp_device:s0 ppp
crw-rw-rw- root root u:object_r:ptmx_device:s0 ptmx
drwxr-xr-x root root u:object_r:devpts:s0 pts
crw------- root root u:object_r:device:s0 qcqmi0
crw-rw-rw- root root u:object_r:random_device:s0 random
crw------- root root u:object_r:device:s0 rfkill
crw-r----- system system u:object_r:device:s0 rtc0
crw-rw---- bluetooth net_bt_stack u:object_r:hci_attach_dev:s0 rtk_btusb
drwxr-xr-x root root u:object_r:audio_device:s0 snd
drwxr-xr-x root root u:object_r:socket_device:s0 socket
crw------- root root u:object_r:device:s0 sw_sync
crw-rw-rw- root root u:object_r:owntty_device:s0 tty
上面列表中, 设备节点归属哪个用户组, 哪个用户, 是在 一个 名称为 ueventd.freescale.rc 这个文件中定义的(每个platform 不同 , 名称也可能不同),
例如
rtk_btusb 这个节点, 上面显示 属于 bluetooth 组, net_bt_stack 用户 所有, 参见下表, 正好与下表中定义吻合
#/dev/ttymxc4 0660 bluetooth bluetooth
/dev/snd/* 0660 system audio
/dev/ttyUSB* 0640 radio radio
/dev/ttyACM* 0640 radio radio
/dev/video* 0660 system camera
/dev/video0 0660 system camera
/dev/video1 0660 system camera
/dev/video2 0660 system camera
/dev/video16 0660 system graphics
/dev/mxc_ipu 0660 media system
/dev/mxc_vpu 0660 media system
/dev/uinput 0660 system bluetooth
#/dev/ttymxc2 0660 system gps
/dev/ttya0 0660 system gps
/dev/ptya0 0660 system gps
/dev/ttya1 0660 system gps
/dev/ptya1 0660 system gps
/dev/ion 0666 media system
/dev/galcore 0666 system graphics
/dev/graphics/fb0 0660 system graphics
/dev/watchdog 0660 system root
/dev/ir 0660 system system
/dev/mma8x5x 0640 compass system
/dev/caam_kb 0660 system system
/dev/rtk_btusb 0660 bluetooth net_bt_stack
设备节点所属的 domain (域) , 就由一个 名称为 file_contexts 的文件定义的
在我的 file_contexts 中有一行关于
rtk_btusb的定义:
/dev/rtk_btusb u:object_r:hci_attach_dev:s0
这句话定义 rtk_btusb 这个设备节点属于 hci_attahc_dev 这个域中了
如果新的设备节点没有在 file_contexts 中定义, 那么默认属于 root 组 , root 所有
下面是定义 某个应用程序 能够使用某个节点 , 在rild.te中, 最后一行, 定义 rild 这个程序能够使用 tty_device 域中的节点,
allow rild net_radio_prop:property_service {set};
allow rild ctl_default_prop:property_service {set};
#tootzoe
allow rild tty_device:chr_file rw_file_perms;
流程差不多就这样, 记录备忘一下