在終端裡用insmod命令可以載入,但寫到程式裡就不行。
工具/原料
Android程式里加載linux核心模組
方法/步驟
java層。 java.lang.Runtime's exec() methods:native層就是jni了。
可以用popen() 。
但指令知否支援就得看bionic了。
也可以嘗試system() and pipe。
普通apk不可能有root許可權,除非機器被root了,使用Runtime.exec之類的執行su -c insmod xx.kosu為root的象徵,配合superuser使用 。
在終端下使用su進入root使用者,然後insmod xx.ko這個肯定可以成功的,因為insmod在root使用者下執行的。但是Java的Runtime.exec()也好,Native層execl()也好,只能用su -c命令臨時在root使用者下執行一條指令。adb shell進入終端,普通使用者下執行su -c insmod xx.ko,會發現命令執行失敗,失敗原因就是需要注意的地方,su的-c引數只把下一個變數作為可執行的指令,因此其執行的命令是insmod而引數並沒有傳遞過去,xx.ko作為了su的引數,因此如果想執行成功我們需要使用su -c "insmod xx.ko",將傳遞給insmod的引數和命令組合成一個引數。這樣的話在Java層和Native層執行失敗的問題也可以解決了,在Runtime.exec()中將命令格式進行格式化,比如Runtime.exec(“su -c ” + "\"insmod xx.ko\"" ),或者在Native中執行execl("/sytem/bin/su","/sytem/bin/su","-c","insmod xx.ko", NULL),這樣最終傳遞給shell的命令就是su -c "insmod xx.ko"了。
注意事項
可以使用部分指令,用Runtime的exec...