从android程序运行shell命令

时间:2011-09-16 19:35:27

标签: android permissions exec su

之前已经在这里提出过这个问题,但提供的解决方案无法正常工作。我正在尝试显示/ data / dalvik-cache文件夹的内容。我知道要做到这一点,我们需要成为su。我甚至做到了但仍然无法执行shell命令..

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);
        }
    }

}

任何人都可以帮我找出如何在Android应用程序中运行linux命令。我正在我的模拟器中测试这个应用程序,它默认为root

3 个答案:

答案 0 :(得分:3)

你不能简单地在模拟器上运行'su',默认情况下没有root访问权限。您需要安装'su'程序以及SuperUser.apk,除非使用快照,否则每次启动模拟器时都必须这样做。

有关所需文件的更多信息和链接可以在SO上找到here,也可以在Russell Davis找到this blog post

答案 1 :(得分:3)

我认为问题来自于您使用两个不同的流程实例。 您必须在su进程中继续发送命令:

您可以查看问题"Read command output inside su process" 得到答案。

然后我试过&设法制作工作代码(我确信它有效!)

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();
}

答案 2 :(得分:1)

在下面的例子中,我尝试执行“/ 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();

希望这有帮助。