Termux 開発コミュニティによる libandroid-shmem.so を Debian noroot 環境に導入する

追記 (2018/11/12)

libandroid-shmem.soの差分ファイルについて、一部動作の不具合の修正を行い、新たな差分ファイルlibandroid-shmem-termux-0.2_2-fix.diff として以下の通りに公開しました。

これに伴い、本稿の修正を行いました。どうか御了承下さい。

追記 (2018/11/26)

本稿の続きとして、 pelya 氏によるオリジナルの libandroid-shmem.soTermux の開発コミュニティによる libandroid-shmem.so の比較についての投稿を以下の通りに行いました。どうか御覧下さい。

追記 (2018/12/10)

本稿及び本稿の続きとなる投稿である上記の投稿を纏めた上で加筆修正して、下記の通り Qiita 半島に投稿しました。今後は、本稿に関する追記及び訂正は、 “Termux 開発コミュニティによる libandroid-shmem.so を Debian noroot 環境に導入する - Qiita“ にて行いますので、どうか御了承下さい。

はじめに

Debian noroot とは、 Android OS 上において root 権限を取ることなく Debian 環境を構築するためのアプリケーションです。

CPU の性能とメモリ容量が潤沢にある Android 端末であれば、 Debian noroot の導入によって Android 端末上で非常に軽快な Debian 環境を実現することができます。

pelya 氏によって作成された Debian noroot 環境には、共有メモリ関連の標準 C ライブラリ関数を /dev/ashmem によってエミュレートする Debian noroot 環境のための動的ライブラリである libandroid-shmem.so が導入されています。

しかし、 pelya 氏による libandroid-shmem.so では、幾つかの共有メモリ関係のライブラリ関数を用いたソフトウエアが正常に動作しなかったり、パフォーマンスがあまり良くないという問題があります。

ここで、 Debian noroot 環境において、 pelya 氏による libandroid-shmem.so に代えて、 termux の開発コミュニティによって改良された libandroid-shmem.so を導入することにより、関数shmget(2)の第一引数keyにIPC_PRIVATE以外の値を指定出来るために、termux の開発コミュニティによるlibandroid-shmem.soの導入によってDebian noroot 環境上で動作する共有メモリを使用したソフトウェアが正常かつ安定に動作することが可能となりました。

差分ファイルの適用とソースコードのコンパイル

まず、 termux の開発コミュニティによる libandroid-shmem.so の github 版若しくは v0.2 版を以下の URL から入手し、 tarball の場合は適当なディレクトリに展開します。

次に、termux の開発コミュニティによる libandroid-shmem.so を Debian noroot 環境に再移植するための差分ファイルを以下の URL より入手します。

そして、入手したソースコードが置かれているディレクトリに、以下のようにして、差分ファイル libandroid-shmem-termux-0.2_2-fix.diff を適用して通常通りに make コマンドによってコンパイルすると、動的ライブラリ libandroid-shmem-termux.so が生成されます。

 $ patch -p1 < /path/to/diff/libandroid-shmem-termux-0.2_2-fix.diff  
 (ここに、 /path/to/diff は、 libandroid-shmem-termux-0.2_2-fix.diff が置かれているディレクトリのパス名)  
 $ make ... (オプションを適宜設定すること。)

この動的ファイルを使用するには、まず最初に生成された動的ライブラリを Debian noroot 環境のルートディレクトリにインストールします。

 # install -v -m 0755 libandroid-shmem-termux.so /

次に、 Debian noroot 環境の初期化ファイルである /proot.sh において、環境変数 LD_PRELOAD が定義されている行を以下のように修正します。

...  
# LD_PRELOAD="... /libandroid-shmem.so ..."  
LD_PRELOAD="... /libandroid-shmem-termux.so ..."    # /libandroid-shmem.so を /libandroid-shmem-termux.so に修正。  
...

初期化ファイル /proot.sh の修正後は、 Debian noroot 環境を再起動して設定を有効にします。

結論

pelya 氏による libandroid-shmem.so と異なり、 termux の開発コミュニティによる libandroid-shmem.so は、関数 shmget(2) の第一引数 keyIPC_PRIVATE 以外の値を指定出来るために、 termux の開発コミュニティによる libandroid-shmem.so の導入によって、Debian noroot 環境上で動作する各種ソフトウェアが正常かつ安定に動作することが可能となったことが判りました。