Android Runtime使得直接調用底層Linux下的可執行程序或腳本成爲可能java
好比Linux下寫個測試工具,直接編譯後apk中經過Runtime來調用ide
或者寫個腳本,apk中直接調用,省去中間層或者JNI工具
這個至少效率應該比較高吧測試
代碼:spa
[java] view plaincopy.net
public class test extends Activity { blog
TextView text; get
/** Called when the activity is first created. */ cmd
@Override it
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (TextView) findViewById(R.id.text);
Button btn_ls = (Button) findViewById(R.id.btn_ls);
btn_ls.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
do_exec("ls /mnt/sdcard");
}
});
Button btn_cat = (Button) findViewById(R.id.btn_cat);
btn_cat.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
do_exec("cat /proc/version");
}
});
Button btn_rm = (Button) findViewById(R.id.btn_rm);
btn_rm.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
do_exec("rm /mnt/sdcard/1.jpg");
}
});
Button btn_sh = (Button) findViewById(R.id.btn_sh);
btn_sh.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
do_exec("/system/bin/sh /mnt/sdcard/test.sh 123");
}
});
}
String do_exec(String cmd) {
String s = "/n";
try {
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(
new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
s += line + "/n";
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
text.setText(s);
return cmd;
}
}
test.sh:
echo test.sh
echo $1
須要注意:
1. exec不等於console命令
2. exec的輸入輸出流須要本身處理
3. exec執行時阻塞、非阻塞,返回結果問題
4. 注意權限問題