1. 程式人生 > >在android中通過java層程式呼叫命令列的一些備註

在android中通過java層程式呼叫命令列的一些備註

能呼叫哪些命令?


一般性的, 最常用的命令都能呼叫, 比如cat, cp, top, ls, ps命令, 但用法和linux上的有較大區別, 可通過–help/-h查詢具體的命令用法;
我熟知linux terminal命令列, 但如何知道android都有哪些常用命令呢?
首先, 需要知道預設android使用toolbox提供擴充套件命令, 裡面內建的命令少的可憐, 不同api版本也不同, 具體有哪些, 可以針對對應版本通過adb shell命令連線真機或模擬器測試, 也可以檢視https://android.googlesource.com/platform/system/core/+/

對應版本/toolbox/目錄下的羅列;
其次, 有些定製機型採用了busybox代替toolbox, busybox提供了非常豐富的unix命令集, 可謂麻雀雖小但五臟俱全, 那麼也可針對這種機型使用更確實的命令, 但我目前的觀點是, toolbox支援的命令, busybox都支援, 也就是如果想要相容, toolbox是最小的子集;
再次, 回到toolbox上, 我們還需要知道, 從android原始碼的變遷來看, 4.2及其以後提供了grep命令, 5.0開始使用netbsd的一個bin子集代替自己的實現, 包括grep, 6.0則換成了toybox(在原始碼的external/toybox/)來提供grep/cp等命令的實現, 後面可能還會發生變化;
最後, shell內建的命令, 如pwd, echo等在4.0-4.4上還在/system/core/sh/builtins.c裡, 但到5.x上不知道在哪裡實現了, 很囧啊, 有知道的還望告訴我啊. 6.0則一併挪到了external/toybox/toys/posix/下;

java層程式怎麼呼叫?


確認能呼叫某個命令後, 怎麼在程式中呼叫呢? 這裡我只想提及兩點:
1. 測試是否有此許可權;
2. 使用

Runtime.getRuntime().exec(new String[]{"sh", "-c", "top -t -n 1 -d 0"});

代替

Runtime.getRuntime().exec("top -t -n 1 -d 0");