我正在开发一个简单的应用程序,它通过执行shell命令在build.prop上注入行。我的主要问题是每次检查创建函数的切换时,都会出现显示shell字符串的Toast。有什么方法可以避免这种情况吗?此外,如果您有任何建议清理一下代码将不胜感激! (对我来说是第一个应用程序)。
代码:
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
// fragment not when container null
if (container == null) {
return null;
}
// inflate view from layout
View v = (LinearLayout)inflater.inflate(R.layout.performance,container,false);
final CheckBox hwdebug = (CheckBox) v.findViewById(R.id.hwDebug);
final String[] mountrw = {"su","-c","mount -o remount,rw /system"};
final String[] enhwdebug1 = {"su","-c","sed -i '/debug.sf.hw=*/d' /system/build.prop"};
final String[] enhwdebug2 = {"su","-c","echo '## Rendering GPU Enabled ##' >> /system/build.prop"};
final String[] enhwdebug3 = {"su","-c","echo debug.sf.hw=1 >> /system/build.prop"};
final String[] dishwdebug1 = {"su","-c","sed -i '/debug.sf.hw=1/d' /system/build.prop"};
final String[] dishwdebug2 = {"su","-c","sed -i '/## Rendering GPU Enabled ##/d' /system/build.prop"};
final SharedPreferences hwdebugpref = this.getActivity().getSharedPreferences("hwdebugck",0);
// GPU Rendering Checkbox
boolean hwdebugck = hwdebugpref.getBoolean("hwdebugck", false);
if (hwdebugck) {
hwdebug.setChecked(true);
} else {
hwdebug.setChecked(false);
}
hwdebug.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if((hwdebug.isChecked())) {
SharedPreferences.Editor editor = hwdebugpref.edit();
editor.putBoolean("hwdebugck", true); // value to store
editor.commit();
ArrayList<String[]> enhwdebug = new ArrayList<String[]>();
enhwdebug.add(mountrw);
enhwdebug.add(enhwdebug1);
enhwdebug.add(enhwdebug2);
enhwdebug.add(enhwdebug3);
for(String[] cmd:enhwdebug){
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
e.fillInStackTrace();
}
}
} else {
SharedPreferences.Editor editor = hwdebugpref.edit();
editor.putBoolean("hwdebugck", false); // value to store
editor.commit();
ArrayList<String[]> diswdebug = new ArrayList<String[]>();
diswdebug.add(mountrw);
diswdebug.add(dishwdebug1);
diswdebug.add(dishwdebug2);
for(String[] cmd:diswdebug){
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
e.fillInStackTrace();
}
}
}
}
});
所以,我的主要问题是su -c
显示了烦人的吐司。我试图将它传递给busybox或工具箱,但没有成功,因为它们需要与su
一起运行。
谢谢!
答案 0 :(得分:1)
通过让调用root命令的相同线程保持不变并且让它始终是唯一一个处理它们的线程,这是可能的。
这样,吐司只会在您第一次使用root操作时出现。
此外,在最终用户方面,一些应用程序(如super-su)允许避免吐司,即使是每个应用程序。
答案 1 :(得分:0)
好的,首先回答你的问题答案是肯定的,不是。
简单回答: 不可能使用当前的SU管理员之一,如SuperUser或SuperSU,你不能。吐司是一种安全机制。这两个应用程序都可以删除特定应用程序的Toast,但您作为开发人员无法控制它。
硬答案: 是的,这是可能的,但它需要您编译自己的su二进制文件并使用它代替已安装的su二进制文件。您需要删除引用当前管理器的代码(从您编译的源代码)。建议添加检查,以便只有您的应用程序才能运行该二进制文件。这可能导致安全风险,并且可能不是一个好主意。
我没有仔细查看你的代码,但我会说在任何情况下都不会在UI线程上运行SU命令。这只是问题。