# andorid 透過程式碼嘗試操作LED 使用command line操作 LED 的方式 1. adb shell 2. cd /sys/class/leds/blue9010 3. echo 0 > brightness(off) 4. echo 200 > brightness(on) --------------- 透過程式碼的方式來修改上面所提到的brightness檔來操控LED燈 ```java= public void turnLedOn(){ try { FileOutputStream mFileOutputStream = new FileOutputStream("sys/class/leds/blue9010/brightness"); mFileOutputStream.write(255); mFileOutputStream.close(); } catch (Exception e) { e.printStackTrace(); } } ``` 在寫入檔案時會遇到acv denied 為了澄清是否因為SELinux導致的問題,可先執行: setenforce 0 (臨時禁用掉SELinux) 如果問題消失了,基本可以確認是SELinux造成的權限問題,需要通過正規的方式來解決權限問題。 遇到權限問題,在logcat或者kernel的log中一定會印出avc denied提示缺少什麽權限,可以通過命令過濾出所有的avc denied 如下: ```java= avc: denied { search } for name="leds" dev="sysfs" ino=13177 scontext=u:r:system_app:s0 tcontext=u:object_r:sysfs_leds:s0 tclass=dir permissive=0 ``` ```java= avc: denied { read } for name="u:object_r:exported_wifi_prop:s0" dev="tmpfs" ino=23597 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:exported_wifi_prop:s0 tclass=file permissive=0 app=com.askey.dvr.provision ``` 可以從log 判斷出以下幾件事情 1. 缺少什麽權限:{ search }權限 2. 誰缺少權限:scontext=u:r:system_app:s0 3. 對哪個文件缺少權限:tcontext=u:object_r:sysfs_leds 4. 什麽類型的文件:tclass=dir 完整的意思是:system_app對sysfs_leds類型的dir缺少search權限。 首先找到對應的檔案 路徑為:LINUX/android/device/qcom/sepolicy/vendor/common 下的 system_app.te檔加入權限 ``` allow system_app sysfs_leds:dir search; allow system_app sysfs_leds:file write;//這條同樣為avc問題而賦予的權限 ``` 這時後build的時候會出現neverallow的錯誤 原因是google將權限鎖住 在coredomain.te中並不允許我們對sysfs_leds做訪問 於是我們可以透過對file.te 新增一個專有的文件類別 在file.te 當中加入以下這個sysfs_wingtk_leds類別 ``` type sysfs_wingtk_leds, fs_type, sysfs_type; ``` 將上面提到的system_app.te改成 ``` allow system_app sysfs_wingtk_leds:dir search; allow system_app sysfs_wingtk_leds:file write; ``` 再來將想訪問的node 與sysfs_wingtk_leds 這個類別榜定 在file.context中加入 ``` /sys/devices/platform/soc/soc:gpio-leds/leds/blue9010/brightness u:object_r:sysfs_wingtk_leds:s0 ``` 測試結果pass