android APP 無法開啟 device file 解決方式(Qualcomm MSM8992 Android 5.1.1)
狀況:
---
寫了一隻APK呼叫JNI library要開啟/dev/v4l-subdev16,但卻失敗
debug message出現以下錯誤訊息
--
[ 207.905424] type=1400 audit(2013.599:10): avc: denied { read write } for pid=6248 comm=".yps.cameratest" name="v4l-subdev16" dev="tmpfs" ino=11488 scontext=u:r:platform_app:s0 tcontext=u:object_r:camera_device:s0 tclass=chr_file permissive=0
--
解決方法:
---
1.因為android 5.0之後有啟動 SEAndroid機制,這是是一種安全性存取機制,詳細了解可以看以下網址
http://blog.csdn.net/Luoshengyang/article/details/...
錯誤訊息
type=1400 audit(2013.599:10): avc: denied { read write } for pid=6248 comm=".yps.cameratest" name="v4l-subdev16" dev="tmpfs" ino=11488 scontext=u:r:platform_app:s0 tcontext=u:object_r:camera_device:s0 tclass=chr_file permissive=0
就是因為SEAndroid不允許 APK 去存取 /dev/v4l-subdev16所產生的錯誤訊息
所以要 allow APK去存取 /dev/v4l-subdev16
首先先了解一下debug message- [scontext=u:r:platform_app:s0]
scontext 四個欄位分別表示:[ SElinux用戶、角色、類型、安全級別],用戶固定為u,角色固定為r,級別固定為s0,會變動的為 [類型],在這邊是 [platform_app]
[platform_app]表示的是 在AOSP source code下編譯並使用平台簽名的APP,所以獲得的seinfo為"platform",如果是第三方簽名的APP獲得的seinfo簽名為 "default"
(check \external\sepolicy\mac_permissions.xml)
再來了解一下devug message-[tcontext=u:object_r:camera_device:s0 tclass=chr_file]
從檔案
\device\qcom\sepolicy\common\file_contexts
可以看到這一行
/dev/v4l-subdev.* u:object_r:camera_device:s0
表示"/dev/v4l-subdev*" 他的 [類型]名稱為 [camera_device]
所以我們加入 allow APK去存取 /dev/v4l-subdev* 的規則
修改檔案
\device\qcom\sepolicy\common\platform_app.te
加上
allow platform_app camera_device:chr_file {write read open ioctl};
重新編譯發現會有錯誤訊息
所以還要修改檔案 \external\sepolicy\app.te
將camera_device 的 neverallow 拿掉
--
# Access to any of the following character devices.
neverallow appdomain {
audio_device
dm_device
radio_device
gps_device
rpmsg_device
}:chr_file { read write };
---
重新編譯更新到裝置上
這樣就可以允許APK 去存取 /dev/v4l-subdev*
就不會出現以下錯誤訊息
--
[ 207.905424] type=1400 audit(2013.599:10): avc: denied { read write } for pid=6248 comm=".yps.cameratest" name="v4l-subdev16" dev="tmpfs" ino=11488 scontext=u:r:platform_app:s0 tcontext=u:object_r:camera_device:s0 tclass=chr_file permissive=0
--
2.解決了 andorid 5.0 的 SEAndroid存取設定問題後,你會發現 APK仍是無法開啟 /dev/v4l-subdev16
我們先用 adb shell切換成 su看一下 /dev/v4l-subdev16 檔案權限,發現為 /dev/v4l-subdev16 檔案權限0660如下:
crw-rw---- system camera 81, 21 1970-01-01 00:13 v4l-subdev16
這樣是無法讓 APK去存取,所以 我們必須將/dev/v4l-subdev16 更改為 0666才可以讓 APK 存取
修改
\device\qcom\common\rootdir\etc\ueventd.qcom.rc
將
/dev/v4l-subdev* 0660 system camera
改為
/dev/v4l-subdev* 0666 system camera
重新編譯更新到裝置上
這樣一來APK就可以順利存取/dev/v4l-subdev16。
以上給大家參考!
狀況:
---
寫了一隻APK呼叫JNI library要開啟/dev/v4l-subdev16,但卻失敗
debug message出現以下錯誤訊息
--
[ 207.905424] type=1400 audit(2013.599:10): avc: denied { read write } for pid=6248 comm=".yps.cameratest" name="v4l-subdev16" dev="tmpfs" ino=11488 scontext=u:r:platform_app:s0 tcontext=u:object_r:camera_device:s0 tclass=chr_file permissive=0
--
解決方法:
---
1.因為android 5.0之後有啟動 SEAndroid機制,這是是一種安全性存取機制,詳細了解可以看以下網址
http://blog.csdn.net/Luoshengyang/article/details/...
錯誤訊息
type=1400 audit(2013.599:10): avc: denied { read write } for pid=6248 comm=".yps.cameratest" name="v4l-subdev16" dev="tmpfs" ino=11488 scontext=u:r:platform_app:s0 tcontext=u:object_r:camera_device:s0 tclass=chr_file permissive=0
就是因為SEAndroid不允許 APK 去存取 /dev/v4l-subdev16所產生的錯誤訊息
所以要 allow APK去存取 /dev/v4l-subdev16
首先先了解一下debug message- [scontext=u:r:platform_app:s0]
scontext 四個欄位分別表示:[ SElinux用戶、角色、類型、安全級別],用戶固定為u,角色固定為r,級別固定為s0,會變動的為 [類型],在這邊是 [platform_app]
[platform_app]表示的是 在AOSP source code下編譯並使用平台簽名的APP,所以獲得的seinfo為"platform",如果是第三方簽名的APP獲得的seinfo簽名為 "default"
(check \external\sepolicy\mac_permissions.xml)
再來了解一下devug message-[tcontext=u:object_r:camera_device:s0 tclass=chr_file]
從檔案
\device\qcom\sepolicy\common\file_contexts
可以看到這一行
/dev/v4l-subdev.* u:object_r:camera_device:s0
表示"/dev/v4l-subdev*" 他的 [類型]名稱為 [camera_device]
所以我們加入 allow APK去存取 /dev/v4l-subdev* 的規則
修改檔案
\device\qcom\sepolicy\common\platform_app.te
加上
allow platform_app camera_device:chr_file {write read open ioctl};
重新編譯發現會有錯誤訊息
所以還要修改檔案 \external\sepolicy\app.te
將camera_device 的 neverallow 拿掉
--
# Access to any of the following character devices.
neverallow appdomain {
audio_device
dm_device
radio_device
gps_device
rpmsg_device
}:chr_file { read write };
---
重新編譯更新到裝置上
這樣就可以允許APK 去存取 /dev/v4l-subdev*
就不會出現以下錯誤訊息
--
[ 207.905424] type=1400 audit(2013.599:10): avc: denied { read write } for pid=6248 comm=".yps.cameratest" name="v4l-subdev16" dev="tmpfs" ino=11488 scontext=u:r:platform_app:s0 tcontext=u:object_r:camera_device:s0 tclass=chr_file permissive=0
--
2.解決了 andorid 5.0 的 SEAndroid存取設定問題後,你會發現 APK仍是無法開啟 /dev/v4l-subdev16
我們先用 adb shell切換成 su看一下 /dev/v4l-subdev16 檔案權限,發現為 /dev/v4l-subdev16 檔案權限0660如下:
crw-rw---- system camera 81, 21 1970-01-01 00:13 v4l-subdev16
這樣是無法讓 APK去存取,所以 我們必須將/dev/v4l-subdev16 更改為 0666才可以讓 APK 存取
修改
\device\qcom\common\rootdir\etc\ueventd.qcom.rc
將
/dev/v4l-subdev* 0660 system camera
改為
/dev/v4l-subdev* 0666 system camera
重新編譯更新到裝置上
這樣一來APK就可以順利存取/dev/v4l-subdev16。
以上給大家參考!
文章標籤
全站熱搜
留言列表