Запускаете родной андроид исполняемый файл от имени root? - PullRequest
1 голос
/ 11 октября 2011

Кто-нибудь знает, как это сделать?Это мой код:

try {
            Process p = Runtime.getRuntime().exec("su");
            p.waitFor();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            Process p = Runtime.getRuntime().exec(
                    "/system/bin/netcfg > /sdcard/netcfg.txt");
            p.waitFor();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
}

Да, я знаю, что у меня нет тестов, чтобы увидеть, действительно ли пользователь принял диалог суперпользователя, но это всего лишь тест для меня.

Ответы [ 3 ]

1 голос
/ 11 октября 2011

Это не будет вашим полным решением, но это код, с которым я экспериментировал некоторое время назад.МОЖЕТ выполнить произвольную команду (код использует ls здесь).Как вы можете видеть на скриншоте, диалог суперпользователя всплывает для ls.

enter image description here

Первоначально я пытался открыть оболочку с помощью sh, а затем выполнить команды внутри этой оболочки, чтобы только начальный диалог суперпользователя shкаждый будет показан.Я видел приложения, которые, кажется, делают это, но я все еще не уверен, как это делается.Я подозреваю, что это то, что вы ищете, но по крайней мере с этим кодом вы можете запускать команды.:)

В любом случае, вот код.Вставьте его в скелет Android-приложения, и оно должно работать.

public class ShellCommandTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final StringBuilder log = new StringBuilder();
    try{
        ArrayList<String> commandLine = new ArrayList<String>();
        commandLine.add("su");
        commandLine.add("-c");
        commandLine.add("ls");

        Process process = Runtime.getRuntime().exec(commandLine.toArray(new String[0]));
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

        for (String command : commandLine){
            Log.i("SU_Test", command);
        }

        String line;
        while ((line = bufferedReader.readLine()) != null){ 
            log.append(line);
            log.append("\n"); 
        }
    } 
    catch (IOException e){
        Log.e("SU_Test", "Fail: " + e.getMessage());
    } 
    Log.i("SU_Test", log.toString());
}

Удачи!

0 голосов
/ 11 октября 2011

Я никогда не пробовал себя, но для вас было бы бессмысленно иметь возможность делать вещи как su из приложения без прав su.Итак, я думаю, первое, что вам нужно сделать, это запросить права su для вашего приложения:

// arbitrary number of your choosing
final int SUPERUSER_REQUEST = 2323; 

// superuser request
Intent intent = new Intent("android.intent.action.superuser"); 

// tell Superuser the name of the requesting app
intent.putExtra("name", "Shell"); 

// tel Superuser the name of the requesting package
intent.putExtra("packagename", "koushikdutta.shell"); 

// make the request!
startActivityForResult(intent, SUPERUSER_REQUEST);

Тогда вы можете:

Runtime.getRuntime().exec("su -c <your privileged command here>");

(скопировано с http://forum.xda -developers.com/showpost.php?p=2954887&postcount=7)

0 голосов
/ 11 октября 2011

Только что проверил, и он НЕ работает на Nexus S, OS 2.3.6.

Обновление

Поскольку ваш телефон рутирован su должен работать.Проблема, которую вы видите, в том, что диалоговое окно пароля не отображается.Похоже, это работает на некоторых рутованных телефонах, но, вероятно, это особенность пользовательской прошивки.

Что вы можете сделать, это запустить процесс su, запросить пароль у пользователя через диалог и затем вывести его на su процесс.

 Process process = new ProcessBuilder()
   .command("su", "android.com")
   .redirectErrorStream(true)
   .start();

// Dialog for asking pass here
OutputStream out = process.getOutputStream();
out.write(password);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...