Next: , Previous: , Up: EmacstとAndroid   [Contents][Index]


H.5 AndroidでのEmacsの実行

ユーザーから見るとAndroidはほとんどタンドクユーザー向けオペレーティングシステムです。ただしアプリケーションやEmacsの視点から見ると、非常に多数のユーザーにホストするシステムなのです。

Each application runs in its own user, with its home directory set to its app data directory (see AndroidでEmacsがアクセスできるファイル.)28

アプリケーションはそれぞれ、多くのシステムディレクトリーや他のアプリケーションのアプリケーションデータディレクトリへのアクセスも禁止されています。

Emacsの配布物には複数のバイナリーも含まれています。実行可能ファイルはライブラリーディレクトリーにパッケージされます。そうしなけれしばEmacsのインストールにおいてそれらをシステムがパッケージ展開しないからです。これはctagsemacsclientをサブプロセスで起動する際に、Lispコードがかわりにlibctags.solibemacsclient.soにコマンドライン指定しなければならないことを意味しています。変数ctags-program-nameetags-program-namehexl-program-nameemacsclient-program-namemovemail-program-nameebrowse-program-namercs2log-program-nameの値を調べてどの名前が使用されたのを判断シテ。Subprocess Creation in the Emacs Lisp Reference Manualを参照してください。

Emacsの起動時ファイルを含んだ/assetsディレクトリーは、zygote (アプリケーションを起動する役目和担うシステムサービス)によって直接作成されたプロセスでなければアクセスできないように設計されています。必要となるLispは/assetsディレクトリーにあるので、これにしたがうとサブプロセスとしてEmacsを起動するのは不可能です。Emacsと一緒に提供されるlibandroid-emacs.soという名前の特別なバイナリーが、Emacsを開始してバッチモードでLispを実行するために最善を尽くします。ただしこはAndroidのソースを読むことによって考案されたアプローチであり、Androidの互換性定義ドキュメントによって認可されていないので効果は様々かもしれません。

Android 10以降では表向きはセキュリティー上の懸念という理由により、Emacs自体がアプリケーションデータディレクトリーにある実行可能ファイルを実行することも禁止されました。それらのシステムでは、通常はEmacsが回避策を講じることにます。ただしこの回避策には実行可能ファイルのロードを実装して、その子プロセスすべてにトレースを適用するような別プロセスを介して、すべてのサブプロセスを実行することが要求されます。これは様々な理由による問題が生じる可能性があるのです。そのような場合には変数android-use-exec-loadernilに変更することで、この回避策を無効にできます。

この回避策が効力をもつ間は、process-id関数によって取得されるプロセスIDはその実行可能ローダーのプロセスIDとなります。実行可能ローダーの子プロセスは実行可能ローダーと同じプロセスグループに所属するからです。したがってinterrupt-processやその他の関連する関数は正しく機能しますが、他の目的のためにprocess-idがリターンしたプロセスIDを用いても正しく機能しないでしょう。

このプロセスのトレースが実行されるメカニズムから派生する影響の1つとして、内部シェル(対話的なサブシェルを参照)の内部のジョブ制御機能がプロセスを停止できなくなり、EmacsがサブプロセスにたいしてSIGSTOPシグナルを生成しても効果はないでしょう。

さらにAndroid 12ではEmacs自体がバックグラウンドの間はCPUを消費するサブプロセスも終了させられます。システムはCPUを過剰に消費するプロセスを5分間隔で判定して、もっともCPU時間を多く消費するプロセスを終了させるのです。

Android 12.1およびAndroid 13ではこの挙動を無効にするオプションが提供されています。これを行うには“USB debugging”(Android<でのEmacsの起動を参照)を有効にして別のシステムからAndroidシステムに接続して以下を実行してください:

$ adb shell "settings put global settings_enable_monitor_phantom_procs false"

The “Languages & Input” preferences which apply to the operating system do not influence the C locale set for programs, but are taken into account by Emacs during startup: a locale name is generated from the selected language and regional variant and a language environment (see 言語環境) is selected on that basis, which does not overwrite LANG or other locale-related environment variables. The coding system for language environments set in this fashion is utf-8-unix without exception.

Instead, the LANG environment variable (see 一般的な変数) is set to en_US.utf8 when Emacs starts on Android 5.0 or newer, which induces subprocesses linked against the Android C library to print output sensibly. Earlier versions of Android do not implement locales at all, and on that account, the variable is set to C.

アプリケーションプロセスはシステムによって使い捨て可能な実体として扱われます。Emacsのすべてのフレームがバックグラウンドに移動されると、システムリソースを節約するために、任意のタイミングでEmacsが終了させられる可能性があります。

Android 7.1以前ではメモリー負荷がないかぎりシステムがEmacsをkillしないように、Emacsが自身を“バックグラウンドサービス”に指定します。

Android 8.0ではそのようなバックグラウンドサービスを特別に扱う機能が削除されました。とはいえEmacsには回避策があります。システムは永続的に通知を作成するアプリケーションはアクティブな作業を行っているとみなして、そのようなアプリケーションのkillを回避します。したがってそのようなシステムでは、Emacsが実行されているかぎり通知が永続的に表示されます。

バージョン13より前のAndroidでは、Emacsが通知を表示する権限は不要です。Android 13以降では、ユーザーがEmacsにそのような権限を与えるまで通知は表示されません。それにも関わらず、単に通知の表示を試みるだけで突然死を避けるには十分なのです。通知が表示されるかどうかがバックグラウンドにおけるEmacsの実行能力を損なうことはないので、通知を無効にしても問題はないでしょう。

ただしシステムがEmacsをkillしない保証はありません。Open Handset AllianceのAndroidのサンプル実装は正しく振る舞うとはいえ、多くのメーカーのプロプライエタリーなバージョンのAndroidには、バックグラウンドにおけるプログラムの実行に追加の制限が設けられているのです。https://dontkillmyapp.com/にはそのような問題のあるメーカー、および場合によっては回避策となるようなリストがあります。

AndroidにはEmacsにアクセスできるシステムサービスを判定する権限システムも定義されています。プログラムは欲する権限を指定しなければなりません。その後に何が起こるかは、使用中にAndroidのバージョン次第です。


Footnotes

(28)

Except in cases where a “shared user ID” is specified and other applications signed using the same “package signing key” are installed, in which case Emacs runs as the same user and has access to the same files as each of the aforementioned applications.


Next: The Android Window System, Previous: Androidでの他のプログラムからのファイルアクセス, Up: EmacstとAndroid   [Contents][Index]

This page has generated for branch:work/master_4078d0fd3ee9e55c3da219aa6e7788ac6130697b, commit:d18a231220c4a6cb2583dcc09bf39ca635ef043f to check Japanese translation.