Запуск команд оболочки из программы Android - PullRequest
5 голосов
/ 16 сентября 2011

Этот вопрос уже задавался здесь ранее, но предоставленные решения не работают .. Я пытаюсь отобразить содержимое папки / data / dalvik-cache. Я знаю, что для этого нам нужно стать су. Я даже сделал это, но все еще не могу выполнить команду оболочки ..

package org.linuxconfidg.Example2;

import android.app.Activity;
import android.widget.*;
import android.os.Bundle;
import java.io.*;
public class Example2Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String lsreturn=myFunLs();
        TextView tv=new TextView(this);
        tv.setText("Hello Sindhu !! Try to get it \n"+lsreturn);
        setContentView(tv);
    }

    public String myFunLs()
    {

        try {
            // Executes the command.
            Process process;
            process = Runtime.getRuntime().exec("/system/bin/su");
            process = Runtime.getRuntime().exec("/system/bin/ls /data/dalvik-cache > /data/local");
            pr
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(process.getInputStream()));
            int read;
            char[] buffer = new char[4096];
            StringBuffer output = new StringBuffer();
            while ((read = reader.read(buffer)) > 0) {
                output.append(buffer, 0, read);
            }
            reader.close();

            // Waits for the command to finish.
            process.waitFor();

            return output.toString();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

}

Может кто-нибудь, пожалуйста, помогите мне узнать, как запускать команды Linux в приложении Android. Я тестирую это приложение в моем эмуляторе, который по умолчанию имеет root-права

Ответы [ 3 ]

3 голосов
/ 29 июня 2012

Я думаю, что проблема в том, что вы используете ДВА различных экземпляра процесса. Вы должны быть в процессе su для продолжения отправки команд:

Вы можете проверить вопрос «Чтение вывода команды внутри процесса su» за ответ.

Затем я попытался создать рабочий код (я уверен, что он работает!)

public void runAsRoot(String[] cmds) throws Exception {
    Process p = Runtime.getRuntime().exec("su");
    DataOutputStream os = new DataOutputStream(p.getOutputStream());
    InputStream is = p.getInputStream();
    for (String tmpCmd : cmds) {
        os.writeBytes(tmpCmd+"\n");
        int readed = 0;
        byte[] buff = new byte[4096];

        // if cmd requires an output
        // due to the blocking behaviour of read(...)
        boolean cmdRequiresAnOutput = true;
        if (cmdRequiresAnOutput) {
            while( is.available() <= 0) {
                try { Thread.sleep(200); } catch(Exception ex) {}
            }

            while( is.available() > 0) {
                readed = is.read(buff);
                if ( readed <= 0 ) break;
                String seg = new String(buff,0,readed);
                console.println("#> "+seg);
            }
        }
    }        
    os.writeBytes("exit\n");
    os.flush();
}
3 голосов
/ 17 сентября 2011

Вы не можете просто запустить 'su' на эмуляторе, по умолчанию нет корневого доступа. Вам нужно будет установить программу 'su', а также SuperUser.apk, и вам придется делать это каждый раз, когда вы запускаете эмулятор, если вы не используете снимки.

Дополнительную информацию и ссылки на нужные вам файлы можно найти здесь на SO, а также это сообщение в блоге Расселом Дэвисом

1 голос
/ 10 октября 2012

В приведенном ниже примере я пытаюсь выполнить "/ system / bin / screencap" для захвата экрана Android.

через adb:

> adb shell
# /system/bin/screencap -p /sdcard/myscreenshot.png

через приложение для Android:

sh = Runtime.getRuntime().exec("su", null,null);
OutputStream os = sh.getOutputStream();
os.write(("/system/bin/screencap -p " + path).getBytes("ASCII"));
os.flush();
os.close();
sh.waitFor();

Надеюсь, это поможет.

...