5

之前已在此处提出此问题,但提供的解决方案不起作用..我正在尝试显示 /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命令。我正在我的模拟器中测试这个应用程序,它默认是植根的

4

3 回答 3

3

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

更多信息和您需要的文件的链接可以SO 以及Russell Davis的这篇博文中找到

于 2011-09-17T04:46:33.200 回答
3

我认为问题出在您使用两个不同的流程实例这一事实。您必须在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();
}
于 2012-06-29T17:04:05.260 回答
1

在下面的示例中,我尝试执行“/system/bin/screencap”来捕获 android 屏幕。

通过亚行:

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

通过安卓应用:

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

希望这可以帮助。

于 2012-10-10T03:56:45.600 回答