Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 避免";苏";在Android中执行toast-on-shell命令?_Java_Android_Checkbox_Exec_Su - Fatal编程技术网

Java 避免";苏";在Android中执行toast-on-shell命令?

Java 避免";苏";在Android中执行toast-on-shell命令?,java,android,checkbox,exec,su,Java,Android,Checkbox,Exec,Su,我正在开发一个简单的应用程序,通过执行shell命令在build.prop上注入行。我的主要问题是,每次我检查创建函数的切换时,都会出现一个显示shell字符串的toast。有没有办法避免这种情况?此外,如果您有任何建议清理一点的代码将不胜感激!(我的第一个应用程序) 代码: 创建视图时的公共视图(布局、充气机、视图组容器、捆绑包保存状态){ //当容器为空时,片段不可用 if(容器==null){ 返回null; } //从布局中展开视图 视图v=(线性布局)充气器。充气(右布局。性能,容器,

我正在开发一个简单的应用程序,通过执行shell命令在build.prop上注入行。我的主要问题是,每次我检查创建函数的切换时,都会出现一个显示shell字符串的toast。有没有办法避免这种情况?此外,如果您有任何建议清理一点的代码将不胜感激!(我的第一个应用程序)

代码:

创建视图时的公共视图(布局、充气机、视图组容器、捆绑包保存状态){ //当容器为空时,片段不可用 if(容器==null){ 返回null; } //从布局中展开视图 视图v=(线性布局)充气器。充气(右布局。性能,容器,错误); 最终复选框hwdebug=(复选框)v.findViewById(R.id.hwdebug); 最后一个字符串[]mountrw={“su”,“-c”,“mount-o-remount,rw/system”}; 最后一个字符串[]enhwdebug1={“su”、“-c”、“sed-i'/debug.sf.hw=*/d'/system/build.prop”}; 最后一个字符串[]enhwdebug2={“su”、“-c”、“echo'#####'>>/system/build.prop”}; 最后一个字符串[]enhwdebug3={“su”,“-c”,“echo debug.sf.hw=1>>/system/build.prop”}; 最后一个字符串[]dishwdebug1={“su”、“-c”、“sed-i'/debug.sf.hw=1/d'/system/build.prop”}; 最后一个字符串[]dishwdebug2={“su”、“-c”、“sed-i'/####/d'/system/build.prop”}; final SharedReferences hwdebugpref=this.getActivity().getSharedReferences(“hwdebugck”,0); //GPU渲染复选框 布尔hwdebugck=hwdebugpref.getBoolean(“hwdebugck”,false); 如果(hwdebugck){ hwdebug.setChecked(true); }否则{ hwdebug.setChecked(false); } hwdebug.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ if((hwdebug.isChecked()){ SharedReferences.Editor=hwdebugpref.edit(); putBoolean(“hwdebugck”,true);//要存储的值 commit(); ArrayList enhwdebug=新的ArrayList(); enhwdebug.add(mountrw); 添加(enhwdebug1); 添加(enhwdebug2); 添加(enhwdebug3); for(字符串[]cmd:enhwdebug){ 试一试{ Runtime.getRuntime().exec(cmd); }捕获(IOE异常){ e、 fillInStackTrace(); } } }否则{ SharedReferences.Editor=hwdebugpref.edit(); putBoolean(“hwdebugck”,false);//要存储的值 commit(); ArrayList diswdebug=新的ArrayList(); diswdebug.add(mountrw); 添加(dishwdebug1); 添加(dishwdebug2); for(字符串[]cmd:diswdebug){ 试一试{ Runtime.getRuntime().exec(cmd); }捕获(IOE异常){ e、 fillInStackTrace(); } } } } }); 所以,我的主要问题是
su-c
显示了令人讨厌的toast。我试图将其传递给busybox或toolbox,但没有成功,因为它们需要使用
su
运行


谢谢!

好,首先回答您的问题,答案是“是”和“否”

简单回答: 否不可能使用当前的SU管理器之一,如SuperUser或SuperSU。toast是一种安全机制。这两个应用都具有删除特定应用的toast的功能,但作为开发人员,您无法控制此操作

答案很难: 是的,这是可能的,但这需要您编译自己的su二进制文件,并使用它代替已安装的su二进制文件。您需要删除引用当前管理器的代码(编译源代码)。建议您添加检查,以便只有您的应用程序才能运行该二进制文件。但这可能会导致安全风险,可能不是一个好主意


我没有仔细阅读您的代码,但我想说的是,在任何情况下都不要在UI线程上运行SU命令。这只是询问问题。

确定首先要回答您的问题,答案是“是”和“否”

简单回答: 否不可能使用当前的SU管理器之一,如SuperUser或SuperSU。toast是一种安全机制。这两个应用都具有删除特定应用的toast的功能,但作为开发人员,您无法控制此操作

答案很难: 是的,这是可能的,但这需要您编译自己的su二进制文件,并使用它代替已安装的su二进制文件。您需要删除引用当前管理器的代码(编译源代码)。建议您添加检查,以便只有您的应用程序才能运行该二进制文件。但这可能会导致安全风险,可能不是一个好主意


我没有仔细阅读您的代码,但我想说的是,在任何情况下都不要在UI线程上运行SU命令。这只是在问问题。

有可能的是,让同一个线程保持对根命令的调用,并让它始终是唯一处理它们的线程

这样,toast只会在您第一次使用根操作时出现


此外,在最终用户端,一些应用程序(如super su)允许避免toast,即使是每个应用程序也是如此。

有可能的是,让对根命令的调用保持在同一线程中,并且让它始终是唯一处理它们的线程

这样,toast只会在您第一次使用根操作时出现


此外,在终端用户方面,一些应用程序(如super-su)允许避免敬酒,即使是每个应用程序。

你应该这样做。su敬酒是有一个很好的理由的——保护用户。你为什么要避免敬酒,并玩弄用户的信任?@Simon有时这是应用程序的要求。所以我们需要隐藏
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(); 
                        } 
                } 
                }
    }
});