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。
 
 
  以上給大家參考!
 
 
arrow
arrow
    文章標籤
    device file permissive=0
    全站熱搜
    創作者介紹
    創作者 CuteParrot 的頭像
    CuteParrot

    馴龍窩

    CuteParrot 發表在 痞客邦 留言(1) 人氣()