手机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);
}
}
最后得到第一段代码的执行结果