【问题标题】:Avoid "su" toast on shell command execute in Android?在Android中执行shell命令时避免“su” toast?
【发布时间】:2013-01-26 04:02:39
【问题描述】:

我正在开发一个简单的应用程序,它通过执行 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运行。

谢谢!

【问题讨论】:

  • 你应该这样做。 SU toast 的存在是有充分理由的——保护用户。您为什么要避开它们并在用户信任的情况下玩弄?
  • @Simon 有时是应用程序的需求。所以我们需要把它隐藏起来
  • +1 Google Play 商店并不是安装应用程序的唯一有效方式。 Android应用可以直接安装在有根的嵌入式设备或机顶盒中,需求是有道理的,在这种情况下与“用户信任”无关。

标签: java android checkbox exec su


【解决方案1】:

有可能,通过让对根命令的调用保持不变并让它始终是唯一处理它们的线程。

这样,toast 只会在你第一次使用 root 操作时出现。

此外,在最终用户方面,一些应用程序(如 super-su)允许避免 toast,甚至每个应用程序。

【讨论】:

    【解决方案2】:

    好的,首先回答您的问题,答案是肯定的和否定的。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      相关资源
      最近更新 更多