Androidのアプリ開発関連のブログ

シェルをちょっとやった

SSHクライアントを作って、ほぼ流用でできそうだから、
Androidデバイス自身のshを使うコンソールの制作をちょっとやった。

Javaでの外部コマンドの実行は、ProcessBuilder で簡単だった。
String path="/system/bin/sh";
ProcessBuilder pb=new ProcessBuilder(path);
pb.redirectErrorStream(true);
Process sh=pb.start();
InputStream STDOUT=InputStreamsh.getInputStream();
OutputStream STDIN=sh.getOutputStream();
こんな感じ。
ProcessBuilderのコンストラクタ引数はStringを複数つけることもでき、複数渡す場合は2個目以降がオプションになるらしい。
手元デバイスのshは、/system/bin/sh → /system/bin/mksh とmkshへのリンクになってた。
ProcessBuilderの出力は標準出力とエラー出力が別だが、redirectErrorStream(true) するとエラーも標準出力になる。
start() でプロセスが開始され、Processが取得できる。
Process.getInputStream() と Process.getOutputStream() で入出力のストリームが取得できるが、
InputStream = 向こうからの出力
OutputStream = こっちからの入力
Javaの入出力のストリームは名前が紛らわしい・・・

で、lsコマンドだけ発行してみたが、sshの時はLFは下に移動だけにしたが、
lsがファイル名とLFの連続しか出力しないのでLFで行頭復帰させる必要があった。
VT100とかの情報見て「LFは下に移動だけ」だったのでSSHの時はそうしたが、Linuxコマンドなら本来LF改行だからsshサーバーが変換してるのか?
SSHの方もLFで行頭復帰するように変更した方が良いかな。
とも思ったが、Windows鯖に繋いだ時に考慮されてない可能性が考えられるからLFは下がるだけの方が良いか。

あと、コマンドプロンプトが表示されない。shの起動オプションとかで設定できるのかな?
画面サイズの変更通知はどうやってやるんだろうか?


完全流用ってわけには行かない感じなんだが、やろうと思えば2日は掛からないかな。
アプリは満遍なくリリースしていきたいから、SSHを配信開始したばっかだし、すぐに完成してももう少し温存しておこうかと。