1. 程式人生 > >Android:java.io.IOException: Cannot run program "/system/xbin/su": error=13, Permission denied

Android:java.io.IOException: Cannot run program "/system/xbin/su": error=13, Permission denied

  • java.io.IOException: Cannot run program "/system/xbin/su": error=13, Permission denied

  • 我的情況

同一套App程式,之前跑在Android4.0中沒有這個問題,這個問題是在新的安卓板,跑的是Android7.1.2系統中發現的,我第一個反應就是許可權不夠,但是即使進入安卓裝置中的命令列用"chmod"命令修改許可權成功,也無法解決這個問題,這個問題經過網上其他資料瞭解到,在5.0版本之後,下面這種方式已經不能獲取root許可權了.

Process su = Runtime.getRuntime().exec("/system/xbin/su");

這裡臨時解決方案是使用adb工具,臨時修改系統的引數設定:

adb root
adb shell setenforce 0

注意要先進行"adb root"操作,否則,執行"adb shell setenforce 0"操作的時候會報錯:

setenforce: Couldn't set enforcing status to '0': Permission denied

如果要永久的設定,需要修改系統啟動引數,加入"androidboot.selinux=permissive"這樣的設定,這裡暫時還沒有嘗試,不過接下來我會去嘗試的.

雖然這個問題解決了,但是我想要的結果並沒有達到,因為雖然沒有這個問題了,也能執行獲取root許可權的命令了,但是結果卻返回的是1,這個是說明命令執行失敗的,原因是這個操作不被系統所允許.這個現象說明了su程式雖然能被呼叫了,但是su程式執行過程中失敗了,怎麼辦?沒錯,接下來就修改su原始碼吧,不過這裡我沒有僅僅修改su的原始碼,而是參考了額外說明中的網站,對系統原始碼進行了修改,並重新編譯系統,相關內容在我的這篇部落格中:

還沒來的及寫的部落格TAT.

  • 額外說明

Android4.2.2(Jelly Bean)上,呼叫su命令就可以獲取到root許可權並執行一些命令.但是在Android4.3之上的版本,Google為這種獲取root許可權的方法設定了層層障礙:

1.su命令原始碼中添加了uid檢驗,只允許shell/root使用者進行呼叫;

2.Zygote原始碼中添加了一些東西,遮蔽掉了App可以進行setuid的功能;

3.adb原始碼中添加了一些東西,遮蔽掉了adb可以進行setuid的功能(這裡指的是對於非userdebug等類似版本的系統) ;

4.開啟了SELinux安全模組,1和2條都滿足情況下也會中斷su命令的執行.