手機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);
}
}
最後得到第一段代碼的執行結果