強化 Android 的 shell

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 特徵
稍早,0xlab 的成員 walkingice 就做了評估與實驗,讓整個 Busybox 得以動態連結到 bionic libc 並確保功能可運作,這部份有很多 hacking,暫時不談。現在這些更動已初步提交到 system/core repository。在 0xdroid 的 beagle-cupcake branch 下,相關的 ash 設定組態如下:
  • 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
佔用的記憶體空間:
[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
可以發現,新引入的 /system/bin/ash 佔用的磁碟與記憶體空間相似,但功能完整度卻大不相同,後者允許我們回顧歷史指令並編輯, 以及在 Embedded Linux 熟悉的操作環境。目前 ash 的移植還有很多調整改進的空間,不過算是堪用了,可在 init.rc 檔案中,將預設的 shell 指定為 /system/bin/ash。


About this entry