2011-07-30 27 views
17

Tôi đã có một ứng dụng có nghĩa vụ phải sử dụng một số lệnh shell để sao chép tệp từ sdcard sang/system/media /. Nó sẽ yêu cầu root, và tôi đang thử nghiệm trên một thiết bị bắt nguồn từ. Tôi đang sử dụng runtimes để thực thi các lệnh shell, nhưng nó không hoạt động. Đây là những gì tôi đã có cho runtimes tôiChạy lệnh Shell mặc dù mã java trên Android?

public void RunAsRoot{String[] commands = {"sysrw", "rm /data/local/bootanimation.zip", "sysro"};{ 
    Process p = Runtime.getRuntime().exec("su"); 
    DataOutputStream os = new DataOutputStream(p.getOutputStream());    
    for (String tmpCmd : commands) { 
    os.writeBytes(tmpCmd+"\n"); 
    }   
    os.writeBytes("exit\n"); 
    os.flush(); 
} 

Nhưng logcat của tôi chỉ thấy hai người bọn họ không nhận được từ chối

07-30 03:14:11.112: WARN/su(3593): request rejected (10047->0 /system/bin/sh) 
07-30 03:14:11.132: DEBUG/su(3592): 10047 com.bba.stormdroid executing 0 /system/bin/sh using shell /system/bin/sh : sh 
07-30 03:14:11.152: WARN/su(3594): request rejected (0->0 /system/bin/sh) 
07-30 03:14:11.182: WARN/su(3595): request rejected (0->0 /system/bin/sh) 
07-30 03:14:11.202: WARN/su(3596): request rejected (0->0 /system/bin/sh) 
07-30 03:14:11.242: DEBUG/su(3597): 10047 com.bba.stormdroid executing 0 /system/bin/sh using shell /system/bin/sh : sh 

Hai cái nhìn là sysrw và sysro lệnh, tuy nhiên ứng dụng vẫn yêu cầu quyền root khi tôi kích hoạt mã này. Tôi mới làm việc với các công cụ gốc và tôi dường như không thể tìm ra cách để làm việc này.

+0

tôi có thể lấy dự án đang hoạt động của mẫu này không? –

+0

Điều này không có tác dụng đối với tôi và tôi không nhận được bất kỳ ngoại lệ nào của FileNotFound hoặc bất kỳ thứ gì trong Java. Ngoài ra, SuperSU chặn yêu cầu gốc và tôi có thể cấp nó để tôi biết rằng 'getRuntime()' đang hoạt động. Vì lý do nào đó, nó sẽ không cho phép tôi thao tác các tập tin trong thư mục '/ system/media'. – anon58192932

+0

Ah có vẻ như sysrw và sysro là những người không quen biết. – anon58192932

Trả lời

27

Để chạy lệnh gốc, bạn phải sử dụng các định dạng flllowing:

public void RunAsRoot(String[] cmds){ 
      Process p = Runtime.getRuntime().exec("su"); 
      DataOutputStream os = new DataOutputStream(p.getOutputStream());    
      for (String tmpCmd : cmds) { 
        os.writeBytes(tmpCmd+"\n"); 
      }   
      os.writeBytes("exit\n"); 
      os.flush(); 
} 

nơi bạn vượt qua trong một mảng các chuỗi, mỗi chuỗi là một lệnh mà cần phải được thực thi. Ví dụ:

String[] commands = {"sysrw", "rm /data/local/bootanimation.zip", "sysro"}; 
+0

Khi tôi đặt nó trong onClick của tôi, nó nói của() xung quanh (String [] cmds) nên được, 's, mà chỉ cần thêm nhiều lỗi khi tôi làm điều đó. – Ben

+0

Tôi vừa chỉnh sửa câu trả lời gốc để hiển thị một ví dụ về mảng chuỗi cần được chuyển vào – user496854

+0

Trừ khi tôi làm sai, nó làm nổi bật RunAsRoot và nói void là một kiểu không hợp lệ cho RunAsRoot. Tôi đã cập nhật câu hỏi của mình với mã tôi hiện có – Ben

Các vấn đề liên quan