在android執行有root權限的java程序

手機ROOT後通過adb是可以訪問目錄的,然而java程序卻不可以

比如下面這段代碼爲了獲取根目錄下所有文件和文件夾的名稱,如果封裝成apk安裝到手機裏面,則運行的時候listFiles();這個方法會返回Null,app會直接閃退。

import java.io.File;
public class Woo {
    public static void main(String args[]){
        System.out.println("Test Android");
        File root = new File("/");
        File[] files = root.listFiles();
        for (File file : files) {
            System.out.println(file.getName());
        }
    }
}

是因爲apk並沒有ROOT權限的問題,爲了使這段代碼有ROOT權限,先將這段程序編譯爲class文件,然後用androidSdk裏面構建工具(build-tools目錄下)dx轉換成dex文件

javac Woo.java
dx --dex --output=Woo.dex Woo.class

最後得到Woo.dex文件

將這個文件封裝進apk文件中,用

Runtime.getRuntime().exec()

執行

這裏省略封裝部分,直接將dex文件放入DCIM文件夾

demo:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        StringBuilder result = new StringBuilder();
        DataOutputStream dos;
        DataInputStream dis;
        try {
            // 經過Root處理的android系統即有su命令
            Process p = Runtime.getRuntime().exec("su");
            dos = new DataOutputStream(p.getOutputStream());
            dis = new DataInputStream(p.getInputStream());
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(dis));
            dos.writeBytes("cd /storage/emulated/0/DCIM \n" +
                    "app_process -Djava.class.path=Woo.dex  /storage/emulated/0/DCIM Woo \n");
            dos.writeBytes(" exit\n");
            dos.flush();
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                result.append(line).append("\n");
            }
            p.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
        TextView textView = new TextView(this);
        textView.setText(result);
        textView.setMovementMethod(ScrollingMovementMethod.getInstance());
        textView.setTextIsSelectable(true);
        setContentView(textView);
    }
}

最後得到第一段代碼的執行結果

wx

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章