Android端末に jed をインストールしたときの備忘録です。
jed について
jedは、Emacsに近い操作性を持つ軽量なテキストエディタです。
Emacsは内側にLispインタープリタを持っていますが、jedでは、S-LangというC言語風のインタープリタを内包していて、キーバインディングや挙動をS-Langで制御することが出来ます。
Android端末でLinuxコマンドライン ツールを動かすための方法
Jack Palevich 氏が作成、公開されている、Android Terminal Emulator (⇒GooglePlay*1) という端末ソフトをインストールします。
また、よく使うLinuxコマンド群(+環境)を入れるためには、いわゆるBusyBoxが必要になりますが、これはKBOX2を使用します。
KBOX2は、root権限のないAndorid端末上で Linuxに近い動作環境を実現します。
http://kevinboone.net/kbox2.html <---もはやリンク切れしています。今だとkboxを使うメリットはないので、Termuxとかに移行してください・・・身も蓋もありませんが・・・
Termux 参考リンク:DockerでTermuxのパッケージビルドを試す
(結局この記事は、jed+slangを野良ビルドするにはどうしたらいいか、というだけの記事になってしまってます。
Termux上でのjedのビルド方法に関しては、そのうち記事を書きたいと思っています。)
注意事項とか
Android端末にroot権限は必要ありませんが、コマンドライン操作を行うためにキーボードが必須になります。
端末機種によっては、USB接続でPC用のUSBキーボードを接続することが出来ます。
(USB-microBからUSB Aメスに変換するケーブルが必要になります)
あるいは、Bluetooth接続のキーボードを使うこともできます。
物理キーボードが使えない時の妥協案としては、
Klaus Weidner 氏の Hacker's Keyboard (⇒GooglePlay*3 ) というソフトキーボードがお勧めです。
タブキーやコントロールキーをタッチ入力することが出来ます。
KBOX2用バイナリ―の クロスビルド環境の準備
まず、Ubuntu14.04LTSが走るLinux PCもしくはVMWarePlayerインスタンス等を用意します。
Android NDK をインストールします。インストール先は説明単純化の為
/usr/local/ndk/
とします。
NDK内の make-standalone-toolchain.sh を実行して、スタンドアロンなツールチェーンを $HOME/arm/toolchain に作ります。
/usr/local/ndk/build/tools/make-standalone-toolchain.sh --platform=android-19 --toolchain=arm-linux-androideabi-4.6 --install-dir=$HOME/arm/toolchain
ツールチェーンでビルドするための環境変数を設定します。 .bash_profile辺りの最後に追記でOKです。
export NDK_HOME=/usr/local/ndk
export NDK_PREFIX=$HOME/arm/android/libs
export NDK_HOST_ARM=arm-linux-androideabi
export NDK_TOOLCHAIN_ARM=$HOME/arm/toolchain
export PATH=$PATH:$NDK_HOME:$NDK_TOOLCHAIN_ARM/bin
jedとslang2のソースを入手します。
$ cd ~/arm
$ apt-get source jed
$ apt-get source slang2
slang2からビルドします。
$ cd slang2-2.2.4/
$ ./configure --host=$NDK_HOST_ARM --prefix=$NDK_PREFIX/$NDK_HOST_ARM
$ make
$ make install
$ cd ..
インストール先は、$HOME/arm/android/libs/arm-linux-androideabi/ 以下になります。
jedをビルドします。
$ cd jed_0.99.19/
$ ./configure --host=$NDK_HOST_ARM --prefix=$NDK_PREFIX/$NDK_HOST_ARM
$ make
$ make install
同じくインストール先は、$HOME/arm/android/libs/arm-linux-androideabi/ 以下になります。
slang2のビルドで起きる問題と対策
最初に躓くのが、./configure 出来ないことです。
これは autoconf/config.sub を別の新鮮なソースパッケージから取ってきて置き換えます。(vimとか)
HAVE_TERMIOS_H 周りがNDKでは微妙なので、ごにょごにょと手直しします。
(⇒ http://psp.dip.jp/web/upload/jed-ja/diff.sl2.txt )
Android OS はGUIが基本Java実装なので、下層のNDK周りにはlocaleは実装されていません。
なので、locale周りのライブラリ呼び出しを抑止します。
動的リンクライブラリ(libslang2.2.4.so)にするよりもstaticリンクのほうがよい場合は、
$ make static
により、libslang2.aを作って、静的リンクさせます。
jedのビルドで起きる問題と対策
slang2と同様、 autoconf/config.sub を別の新鮮なソースパッケージから取ってきて置き換えます。
環境変数JED_ROOT未定義の時に参照するディレクトリは、
/usr/lib/jed/(のlib/)
になるべきですが、クロスビルドでは、ホストOSのインストール先ディレクトリ名が残ってしまうので、ソースを手直ししてMake変数のJED_ROOTは無視するようにします。
TERMIOS周りも多少の手直しが必要になります。
(⇒ http://psp.dip.jp/web/upload/jed-ja/diff.jed.txt )
実行時、Ctrl+Sを押して検索するときに、require.slが無いというエラーは、
slangのslライブラリからrequire.slが読み込めていないのが原因です。
とりあえず、require.slだけでも、/usr/lib/jed/lib/ 以下にコピーしておくと回避できます。
jed 裏ワザ
KBOX2_shell を使わない状態(chrootする前のAndroid shell) から、jedを起動することが出来るようになりました。
これは、環境変数 JED_ROOT が未定義の場合のデフォルトのjedのディレクトリ:
/usr/lib/jed
が存在しない場合、
/data/data/jackpal.androidterm/kbox2/usr/lib/jed
を代替として参照するようにコードを追加しています。
環境変数 JED_ROOT で明示的に指定する場合はディレクトリ配置は自由です。
jed カスタマイズ
/home/kbox/.jedrc を用意して書きかえします。
雛形ファイルは /etc/jed.rc-sample に置いています。
(Mifes/Vz風味です)
下記の移植済みバイナリに同梱されているslファイルで、tagjumpコマンドを追加してありますので、grepの結果ファイルや、コンパイルエラーのstderr出力などをリダイレクトして、そのままファイルを開くことが出来ます。
移植済 Android(ARM) 版 テキストエディタ jed の入手先
以下のリンク先から入手してください
日本語を通すには、
$ export LANG=ja_JP.UTF-8
を実行するか、上記1行を /etc/profile に追記しておきます。
上記jed移植と同じ要領で、Linux上のコマンドライン ツールをAndroidに移植できます。
また、下記リンク先には、移植されたgccもありますので、小さなプログラムなら、端末上でビルドすることも一応できるようです。
KBOX2用の他のソフトウェアの入手先
KBOX2: coreutils , ssh , rsync , zsh , perl , gcc , make 等
-http://kevinboone.net/kbox2_downloads.html
KBOX2: libfakechroot.so の新しいバージョン(Android 4.2以上で必須)
-http://kevinboone.net/kbox2_diary.html
日本語対応Vim
-https://sites.google.com/site/fudist/Home/qfixhowm/other-service/howm-android
root取得済端末でLinuxユーザーランドを試したい場合
fakechrootではなく、普通のchrootを使用して、Ubuntu Linuxを試せます。
2017年11月時点での追記:
ここまで書いていて、こう言うのもなんですけど・・・。
Android端末にLinux CUI環境が欲しいなら、現時点でお勧めは
GNURoot Debian一択です。(名前が紛らわしくてRoot権限が必要なDebianかと思って敬遠しておりました)
- Google Playから一発導入出来ます。
- Root 権限は要りません。
- apt-getを使用して、好きなソフトを思う存分導入することが出来ます。(自家ビルドは全く不要)
- CUI/GUIともサポート。
動作原理は proot を使用しているそうです。
お勧めです。