1. 程式人生 > >android下裝置許可權為777卻無法訪問的問題

android下裝置許可權為777卻無法訪問的問題

    在android5或5.1的開發中經常會碰到,明明裝置節點是有777的許可權,可是在我們程式中訪問這個裝置卻報Permission denied,無法開啟裝置。
    這是因為在Android 5.0或5.1下,採取了SEAndroid/SElinux的安全機制。
    SELINUX是美國國家安全域性和一些公司設計的一個針對linux的安全加強系統,在這種訪問控制體系的限制下,程序只能訪問那些在他的任務中所需要檔案。
     下面我們來看看怎麼設定來允許我們的應用可以訪問裝置節點。
      第一步,我們找到file_contexts檔案,這個檔案通常在device/mypaltform/sepolicy 或者external/sepolicy目錄下。我們在這個檔案下增加一行 “/dev/devname  u:object_r:my_device:s0”。/dev/devname是裝置節點,也就是我們要開啟的裝置名。my_device我們可以定義一個我們看的懂的有意義的名字。object_r標明這是一個檔案。s0是表示優先順序的。
      第二步,在device.te檔案中新增一行 “type my_device, dev_type ”;
      第三步,在對應的在device/mypaltform/sepolicy 或者external/sepolicy目錄下找到程序名加te為副檔名的,例如如果我們希望rild程式可以訪問我們的節點可以開啟rild.te檔案在後面加上一行“allow rild my_device:chr_file rw_file_perms;”這時我們重新編譯後,再看看在rild程序裡面開啟/dev/devname,讀寫這個裝置檔案都正常了。可是在實際的開發中往往是我們並不知道這個驅動將會被哪個應用程式呼叫,可能其他人呼叫我們的驅動做開發,或者安裝第三方APP。如果是這樣,我們可以找到例如app.te、systemp_app.te、untrusted_app.te。等檔案,在裡面加上如“allow appdomain my_device:chr_file rw_file_perms; ”(表示所有的APP都可以訪問該裝置節點)、“allow system_app my_device:chr_file rw_file_perms; ”表示具有system UID的APP都可以訪問該裝置節點)、“allow untrusted_app my_device:chr_file rw_file_perms;”(表示所有第三方的APP都可以訪問該裝置節點)。或者直接開啟domain.te加上“allow domain my_device:chr_file rw_file_perms;”(所有的程序、服務都可以訪問該節點)。當然了,實際上上訴的語句不一定放在上面指定的檔案裡,放在任何檔案裡效果是一樣的,但是為了方便閱讀和管理,還是新增到對應的檔案中比較好。