之前已经在这里提出过这个问题,但提供的解决方案无法正常工作。我正在尝试显示/ 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
答案 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();
希望这有帮助。