本記事を書いている2025年3月、Google PixelでLinuxターミナルが動作するようになり、話題となりました。
今回は、従来からあるAndroid向けターミナルエミュレーターアプリであるTermuxに、それまで利用できなかったパッケージを新規で追加する方法について紹介します。
LinuxターミナルとTermuxの違い
そもそも、Google Pixelで利用できるようになったLinuxターミナルと、Termuxはどのように違うのでしょうか。 まだ提供されてから間もないことから、Google Pixel以外での動向については未知数ですが、次のような違いがあります。
- Google Pixelで利用できるようになったLinuxターミナルはAndroid Virtualization Frameworkを利用した仮想環境で動作する
- AVFに依存しているため、ハードウェア的にAVFをサポートしていても、Android端末のベンダーによっては無効化されて必ずしも使えない可能性がある
- Termuxは、Termux向けに移植(クロスコンパイル)されたパッケージを利用できる
- ネイティブなバイナリなので、Androidとの親和性が高い
- 移植されていない機能やパッケージの制約を受ける
特性が違うので、Linuxターミナルが提供されることになったからといって、即座にTermuxはもういらないというわけでは現時点ではありません。 今後はある程度住み分けしていくことになるのではないでしょうか。
Termuxのパッケージを新規に追加する
話題となったLinuxターミナルとTermuxの違いをおさえたところで、それでもTermuxにまだないパッケージを移植したい人のために、 追加する手順を紹介します。
- Ubuntu 24.04の環境でdockerを利用できるようにする
- termux-packages リポジトリをcloneする
- Termuxパッケージのレシピを作成する
- コンテナを利用してパッケージをビルドする
- ビルドしたパッケージをAndroid端末に導入する
なお、本記事では、Build Environmentで推奨されている Docker Containerを利用したパッケージのビルド方法に基づいて紹介します。
Ubuntu 24.04の環境でdockerを利用できるようにする
$ sudo apt install -y docker.io
$ sudo gpasswd -a $USER docker
dockerコマンドを利用するユーザーをdockerグループに追加しておきます。 Docker Containerでパッケージをビルドする場合の事前準備はこれだけです。
dockerじゃなくて、podmanでは駄目なのかと思うかもしれませんが、後述するtermux-pakcagesリポジトリで提供されているビルドスクリプトがdocker前提になっています。 特段こだわりがないならば、素直にdockerで環境を構築するのを推奨します。
termux-packages リポジトリをcloneする
TermuxのパッケージのレシピはGitHubのリポジトリで管理されています。 次のコマンドを実行して、レシピをcloneしておきます。
$ git clone https://github.com/termux/termux-packages
Termuxパッケージのレシピを作成する
次に、追加したい対象のパッケージのレシピを作成します。 基本的にはCreating new package を参考にすればよいです。
Termuxのパッケージは、次の2つのタイプがあります。
- root権限を前提としないパッケージ
- root権限が利用できることを前提としたパッケージ
通常作成するのは前者で、 packages配下にレシピが収められています。 後者は、root-packages配下にレシピがあります。dockerなどが代表的なパッケージです。 追加したいパッケージの特性に応じて決めるとよいでしょう。
各パッケージのレシピとしては次のものを用意します。
build.sh
(必須)- 必要ならソフトウェアを移植するのに必要なパッチ(オプション)
- 追加でインストールしたい設定ファイル等のファイル(オプション)
build.sh
にはパッケージのメタ情報やビルド手順をシェルスクリプトとして記述します。
ただし、GNU Autotoolsに対応していたりするソフトウェアならば、複雑なシェルスクリプトを書く必要はありません。
ビルドに必要なメタ情報を定義するだけでよいです。
例えば、edの場合は、build.sh
の中身はこれだけです。
TERMUX_PKG_HOMEPAGE=https://www.gnu.org/software/ed/
TERMUX_PKG_DESCRIPTION="Classic UNIX line editor"
TERMUX_PKG_LICENSE="GPL-2.0"
TERMUX_PKG_MAINTAINER="Oliver Schmidhauser @Neo-Oli"
TERMUX_PKG_VERSION="1.21.1"
TERMUX_PKG_SRCURL=https://mirrors.kernel.org/gnu/ed/ed-${TERMUX_PKG_VERSION}.tar.lz
TERMUX_PKG_SHA256=d6d0c7192b02b0519c902a93719053e865ade5a784a3b327d93d888457b23c4b
TERMUX_PKG_AUTO_UPDATE=true
このようなメタ情報でよく利用するのは、実行時のパッケージの依存関係を示すTERMUX_PKG_DEPENDS
や、パッケージをビルドするときに必要な依存関係を示すTERMUX_PKG_BUILD_DEPENDS
でしょう。
build.sh
内で何を定義しないといけないかについては、Package Build Script Variablesを参照してください。
なお、個別にビルド手順をカスタマイズしたい場合には、さまざまなフックが用意されているので、必要に応じてbuild.sh
内で上書きできます。
詳細はPackage Build Step Overridesを参照してください。
Termuxに対応させるためにパッチを当てる必要がでてくる場合がありますが、パッチは次のルールに基づいて作成します。
- 拡張子が.patch32 もしくは .patch64であれば、32/64bit専用のパッチとして適用される
- 拡張子が.patchならば汎用のパッチとして適用される
- 拡張子が.patch.debugならば、デバッグ用のパッチとして、他のパッチのあとに適用される
- 拡張子が.patch.ondeviceならば、実機でパッケージをビルドするときのみ適用される
パッチでは、次のような特殊な変数を利用できます。 これらはパッチを適用するときに動的に置き換えられるようになっています。
@TERMUX_APP_PACKAGE@
: com.termux@TERMUX_BASE_DIR@
: /data/data/com.termux/files@TERMUX_CACHE_DIR@
: /data/data/com.termux/cache@TERMUX_HOME@
: /data/data/com.termux/files/home@TERMUX_PREFIX@
: /data/data/com.termux/files/usr@TERMUX_PREFIX_CLASSICAL@
: /data/data/com.termux/files/usr
パッケージの移植の際には、上記の変数を利用してパッチを書くと見通しが良くなります。 また、Termuxへの移植の際は次のような点に注意が必要です。
/run
などハードコードされたパスを@TERMUX_PREFIX
を使って置き換える- HOMEディレクトリを取り扱うようなプログラムでは、
@TERMUX_HOME@
を返すように置き換える - 実行時のOSの判定を行うロジックでは、Linuxであるように偽装する必要がある(例: Goであれば
runtime.GOOS
を使っている部分を"linux"であるかのようにみなして処理させる) /dev/shm
などAndroidでは使えない機能を代替実装に置き換える必要がある
コンテナを利用してパッケージをビルドする
レシピができたら、パッケージをコンテナ環境でビルドします。
例えば、dockerのパッケージをビルドするには次のコマンドを実行します。
$ ./scripts/run-docker.sh ./build-package.sh -I docker
初回は ghcr.io/termux/package-builder:latest
の3GBほどのコンテナイメージをダウンロードしてくるのと、
依存パッケージのビルドなどで結構時間がかかります。
ビルドに成功すると、outputディレクトリ配下にパッケージが配置されます。
$ find output/
output/
output/docker_1:24.0.6-3_aarch64.deb
ビルドしたパッケージをAndroid端末に導入する
すでに述べたように、outputディレクトリ配下にパッケージが作成されるので、実機に転送してパッケージをインストールします。 なお、ビルドしたパッケージを導入する際は、事前にパッケージのアップデートを先に実行しておいた方が良いようです。 これは、Termuxはローリングリリースということもあり、古いパッケージとの組み合わせでは不整合が発生することがあるためです。1
例えば、root権限利用できる環境で、ビルドしたdockerパッケージをインストールするには次のコマンドを実行します。
# pkg install root-repo
# apt update -y
# apt install -y ./docker_1:24.0.6-3_aarch64.deb
さいごに
今回は、従来からあるAndroid向けターミナルエミュレーターアプリであるTermuxに、それまで利用できなかったパッケージを新規で追加する方法について紹介しました。
クリアコードでは、組み込み機器ソフトウェア開発の一環として、お客様からの依頼でTermuxパッケージの調査・開発サポートの実績があります。 家電製品や、機械の制御パネルなどで多く使われる組み込み機器向けのソフトウェア開発に関して、ニーズに合わせた設計、開発、サポートなども提供しています。 詳しくは組み込み機器ソフトウェア開発 をご覧いただき、お問い合わせフォームよりお気軽にお問い合わせください。
-
以前、gpgmeの依存関係が適切でないのをフィードバックしたことがありましたが、最新版に更新した場合には問題とならないためnot-bug扱いとなったことがあります。参考: [Bug]: missing versioned dependency from gpgme to libassuan ↩