1

シェル コマンドを実行して build.prop に行を挿入する単純なアプリを開発しています。私の主な問題は、関数を作成するトグルをチェックするたびに、シェル文字列を表示するトーストが表示されることです。これを回避する方法はありますか?また、少しきれいにする提案があれば、コードをいただければ幸いです! (私にとって最初のアプリ)。

コード:

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 または toolbox に渡そうとしましたが、 で実行する必要があるため成功しませんでしたsu

ありがとうございました!

4

2 に答える 2

0

最初にあなたの質問に答えてください。答えは「はい」と「いいえ」です。

簡単な答え: SuperUser や SuperSU などの現在の SU マネージャーのいずれかを使用することはできません。トーストは安全機構です。どちらのアプリも特定のアプリのトーストを削除する機能を備えていますが、開発者としてこれを制御することはできません。

難しい答え: はい、可能ですが、独自の su バイナリをコンパイルし、既にインストールされている su バイナリの代わりにそれを使用する必要があります。現在のマネージャー (コンパイル元のソース) を参照するコードを削除する必要があります。アプリのみがそのバイナリを実行できるように、チェックを追加することをお勧めします。ただし、これはセキュリティ上のリスクにつながる可能性があり、おそらく良い考えではありません。

私はあなたのコードをあまり見ていませんでしたが、UIスレッドでSUコマンドを実行しないでください。これは問題を求めているだけです。

于 2013-01-26T04:43:00.130 に答える