Android
目次
Android端末でのshellの実行†
- Android端末で shellやLinuxコマンド を動かすには、Jackpal:Android-Terminal-Emulatorを使用します。
- これは、GooglePlay から入手できます。
KBOX2 について†
- KBOX2は、上記 Android-Terminal-Emulator 内で動作する、基本的なLinuxコマンド群(BusyBoxと呼ばれるもの)の実行環境です。
- 同じく、GooglePlayから、インストーラーを入手して実行します。
- Android端末の /data/data/jackpal.androidterm/kbox2/ というディレクトリにインストールされます。
- Android-Terminal-Emulator の「設定」メニューを開き、初期コマンドに
/data/data/jackpal.androidterm/kbox2/bin/kbox_shell
- を与えることで、Terminal-Emulator起動直後からKBOX2のシェルに入ることが出来ます。
- そしてインストール完了後は、インストーラーをアンインストールしても問題ありません。
- 他のBusyBoxとの違いは、libfakechroot.soを使用して、Linuxの基本的なディレクトリ構成を再現出来る事です。
- 環境変数はこんな感じになります。
FAKECHROOT='true' FAKECHROOT_BASE='/data/data/jackpal.androidterm/kbox2' FAKECHROOT_EXCLUDE_PATH='/data/data/jackpal.androidterm/kbox2:/data/data/jackpal.androidterm/kbox2' FAKECHROOT_VERSION='2.16' HOME='/home/kbox' ・・・ KBOX='/data/data/jackpal.androidterm/kbox2' LD_LIBRARY_PATH='/data/data/jackpal.androidterm/kbox2/lib:/data/data/jackpal.androidterm/kbox2/usr/lib' LD_PRELOAD='/data/data/jackpal.androidterm/kbox2/lib/libfakechroot.so'
libfakechrootについて†
- root権限なしでchrootするツールです。(chrootというのは、ファイルシステムの'/' マウントポイントを現在のファイルシステムの任意のディレクトリ位置に再設定する機能)
- Debianとかで、dpkg作るときに使われるツール。
- cygwinもこの原理で動いているそうです。
どうやって実現しているの?†
- ld.so の LD_PRELOAD 機能を使って、 /lib/libfakechroot.so を libc.soよりも先に常駐(リンク)させておきます。
- libc.soの open や chdir , opendir 等をhookしてディレクトリ位置を置き換えます。
テキストエディタ jed の移植†
- jedは、Emacsに近い操作性を持つ軽量なテキストエディタです。
- 早速 jed を移植してみました。
ダウンロード: jed-android.tgz
- 日本語を通すには、
$ export LANG=ja_JP.UTF-8
を実行するか、上記1行を /etc/profile に追記しておきます。
- jedは、UTF-8以外の文字コード(例えば、EUC,S-JIS)のサポートはありません。
テキストエディタ jed の移植手順に関するメモ†
- まず、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です。
# ANDROID 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/ 以下になります。
実際にやってみると、上記手順でビルドエラーがいろいろ発生するので、ソースやconfigの手直しが必要になります。
slang2のビルドで起きる問題と対策†
- 最初に躓くのが、./configure 出来ないことです。
- これは autoconf/config.sub を別の新鮮なソースパッケージから取ってきて置き換えます。(vimとか)
- ソース手直し差分を置きます。
- /ATMEL_AVR/upload/jed-ja/diff.sl2.txt
- 動的リンクライブラリ(.so)にするよりもstaticリンクのほうがよい場合は、
$ make static
- にて、libncurses.aを作って、そっちをリンクします。
jedのビルドで起きる問題と対策†
- slang2と同様、 autoconf/config.sub を別の新鮮なソースパッケージから取ってきて置き換えます。
- ソース手直し差分を置きます。
- /ATMEL_AVR/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 で明示的に指定することも出来ます。その場合はディレクトリ配置は自由です。
KBOX2の裏ワザ†
- 同様に、KBOX2に含まれるBusyBoxや、その他のコマンドについても、KBOX_shellを使用せずに起動しても一部の機能は使えます。
/data/data/jackpal.androidterm/kbox2/bin/ls とか。
- また、ROOT権限取得済の端末から、
$ su
- を行った後、
/data/data/jackpal.androidterm/kbox2/bin/kbox_shell
- を起動することで、特権付きのKBOX_shellを使うことも出来るようです。( /android_root/ にchdirすれば、Android側のファイルシステムも触れます )
- ただし、root権限を持ったままの各種作業は、あまりお勧めできません。
物理キーボードは必要†
- ただでさえ狭い端末画面はソフトウェアキーボードを表示させるとさらに狭くなりますし、キータッチストレスが溜まるので物理キーボードは必須です。
2択
- Bluetooth接続のキーボード(小型なので携帯しやすいけれど打ちにくい)
- USB micro-B to Aメス 変換ケーブルを使用して、USBキーボードを接続(いつも使っているUSBキーボードが使える)
- 物理キーボードが使えない状況では、hackers keyboardがお勧め。
- デフォルト設定では、Portlait modeではCTRLやTABが出ないので、設定を変えてやる必要がある。
他のソフトウェアの入手†
ここから:
日本語対応Vim
参考URL
android-memo |
AndroidのNDKのツールを使って実行ファイルをビルドする簡単な方法 |
AndroidのNDKツールを使ってrubyをビルドして動かす |
android NDKでCライブラリをクロスコンパイル |