Android 預設的 shell 就是 /system/bin/sh 這個 process,移植自 NetBSD 早期的 sh 程式,原本功能算是完整,但被 Android 開發團隊移去相當多功能,致使在 shell 下的操作苦不堪言,只好透過 adb 作遠端指令的下達,但問題是,移植 Android 的平台在初期往往缺乏有效的連線機制,又需要作些調整與嘗試,實在很不方便。所以筆者就在 0xlab 最近釋出的 0xdroid 專案上,引入來自 Busybox 的 ash 實做,試著保持相近的 footprint 的前提下,提供更多的功能。
因此,我們有以下考量:
- 必須動態連結到 bionic libc
- 簡化 Busybox 的實做,修改 libbb 與對應的 applet
- 保有 bash 相容模式, Line edit, history, readline 等 Busybox 特徵
- CONFIG_ASH_BASH_COMPAT
- CONFIG_ASH_READ_NCHARS
- CONFIG_ASH_READ_TIMEOUT
- CONFIG_ASH_ALIAS
- CONFIG_ASH_GETOPTS
- CONFIG_ASH_BUILTIN_ECHO
- CONFIG_ASH_OPTIMIZE_FOR_SIZE
- CONFIG_ASH_EXPAND_PRMT
佔用的記憶體空間:[build_host]$ ls -lh system/bin/{ash,sh}
87K 2009-08-13 02:24 system/bin/ash
98K 2009-08-13 01:15 system/bin/sh
可以發現,新引入的 /system/bin/ash 佔用的磁碟與記憶體空間相似,但功能完整度卻大不相同,後者允許我們回顧歷史指令並編輯, 以及在 Embedded Linux 熟悉的操作環境。目前 ash 的移植還有很多調整改進的空間,不過算是堪用了,可在 init.rc 檔案中,將預設的 shell 指定為 /system/bin/ash。[beagleboard] # ps
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 300 192 c00b2394 0000ca6c S /init
root 777 1 736 324 c0057648 afe0c3fc S /system/bin/sh
root 835 777 744 356 c0057648 afe0c3fc S /system/bin/ash
0 意見:
Jump to comment form | comments rss | trackback uri