我正在开发一个适用于root设备的应用程序。
我有两个问题:
当我启动应用程序时,它检查root,出现了SuperUser对话框,我点击Accept然后点击'Remember my Choice',我运行一个命令:
Process process;
try {
process = Runtime.getRuntime().exec(new String[]
{"su", "-c", "rm -r /data/data"});
prefs = this.getSharedPreferences("Prefs",
Context.MODE_WORLD_WRITEABLE);
prefsEditor = prefs.edit();
stopSelf();
然后再次出现SuperUser对话框。为什么同一个应用程序出现的次数不止一次?我查看了“记住我的选择”。
我正在使用
process = Runtime.getRuntime().exec(new String[]
{"su", "-c", "rm -r /data/data"});
有没有办法添加例外,例如Do not delete "com.My.App"
?
答案 0 :(得分:1)
您正在删除/ data / data及其所有子目录。这是应用程序存储应用程序私有数据的地方,并且SuperUser肯定会在此处存储授权应用程序列表。
我相信你已经猜到了什么事情......你正在取消自己的授权。
您需要向超级用户添加例外。
要添加例外,我找不到简单的解决方案,因为只有有限的shell命令可用。如果你安装了busybox,它会让你有机会使用grep命令来解析输入并排除你想要的行。
或者,您可以使用以下方法以编程方式执行此操作:
process = Runtime.getRuntime().exec(new String[] {"su", "-c", "ls /data/data"});
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
ArrayList<String> files = new ArrayList<String>();
files.add("su");
files.add("-c");
files.add("rm -r");
while ((line = bufferedReader.readLine()) != null){
//test if you want to exclude the file before you add it
files.add("/data/data/" + line);
}
//issue a new command to remove the directories
process = Runtime.getRuntime().exec(files.toArray(new String[0])); //changed this line
希望它有所帮助。
- 编辑 -
下面的代码在root设备上工作正常。发出的最终命令也是ls
,因为我不想删除我的文件,但你可以用其他任何东西替换它(参见文件中的注释)。
private void execCmd(){
Process process;
try {
process = Runtime.getRuntime().exec(new String[] {"su", "-c", "ls /data/data"});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
ArrayList<String> files = new ArrayList<String>();
files.add("su");
files.add("-c");
// files.add("rm -r"); //Uncomment this line and comment the line bellow for real delete
files.add("ls");
try {
while ((line = bufferedReader.readLine()) != null){
//test if you want to exclude the file before you add it
files.add("/data/data/" + line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//comment lines bellow to stop logging the command being sent
Log.d(TAG, "Command size: " + files.size());
for(int i=0; i< files.size(); i++)
Log.d(TAG, "Cmd[" + i + "]: " + files.get(i));
try {
process = Runtime.getRuntime().exec(files.toArray(new String[0]));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //changed this line
}
此致