H.3 AndroidでEmacsがアクセスできるファイル

EmacsはAndroidシステム上で/assetsという名前の特別なディレクトリーを公開します。このディレクトリーにはGNUやUnixなら通常は/usr/share/emacsにインストールされるディレクトリーetclispinfoが含まれています。AndroidシステムではlsのLispエミュレーション(MS-Windowsでのlsのエミュレーションを参照)がデフォルトで有効になっています。システムに付属するlsのバイナリーはメーカーによって異なり、Emacsが求めるすべての機能は通常はサポートしていないからです。一部のAndroidシステムとともに配布されるlsのコピーの中には、-lフラグさえ欠落していることが知られています。

Androidはパッケージの展開時にアプリケーションのパッケージ内容を展開せずに、“asset manager”という特別なインターフェイスを用いることをEmacsのようなプログラムに要求するためにこのディレクトリーが存在します。このような実装による結果として以下のような特性が生じます:

/assetsディレクトリー以外にも、Androidプログラムは通常は以下の4つのディレクトリーにアクセスできます:

Androidの通常のインストールでは(普通だと読み取り専用である)ルートディレクトリーにcontentassetsという名前のファイルはないはずですが、使用しているAndroidのインストールがカスタマイズされていてそれらの名前で実際のファイルにアクセスしたい場合があるかもしれません。このようなファイルは前述した特別なディレクトリーと競合しますが、/../content/../assetsのようにルートディレクトリーの“親”ディレクトリーから相対的な名前を記述することによってアクセスできます。

外部ストレージディレクトリーは/sdcardで見つけることができます。アプリケーションデータディレクトリーは通常は/data/data/org.gnu.emacs/filesにシンボリックリンクされているとはいえ、その他のディレクトリーを固定的な位置で見つけることはできません(が以下を参照のこと)。

Androidの以前のバージョンでは、アプリケーションライブラリーディレクトリーはアプリケーションデータディレクトリーの親ディレクトリーにあるlibという名前のディレクトリーでした。このディレクトリーは現在ではランダムに生成された名前で/data/app配下に置かれることが多いようです。

Emacsと同じユーザーIDを共有するアプリケーション内で実行される(exec-directory変数にアクセスできない)スクリプトの利便性のために、起動時にアプリケーションデータディレクトリーの親ディレクトリー配下の従来の場所に、アプリケーションデータライブラリーをシンボリックリンクさせるために少なからぬ労力が費やされています。

Emacsを再インストールした結果、アプリケーションライブラリーディレクトリーの位置が変更された場合には、システムが次回にEmacsを起動する際に新たな場所を指すようこのシンボリックリンクを更新します。

非常に古いバージョン(2.6.29)のLinuxカーネルを実行するAndroidデバイスでは、assetのファイルから読み込むために一時ファイル用ディレクトリーにEmacsがtemp~unlinkedで始まる名前のファイルを作成する必要があります。そのような名前のファイルは上書きされたり削除されるかもしれないので作成しないでください。

Android 11以降のAndroidシステムでは、アプリケーションによるopenreaddirのようなファイル関連のシステムコールを用いた/sdcardディレクトリーへのアクセスが制限されています。

この“対象範囲別ストレージ(Scoped Storage)”と呼ばれる制限によって、おそらくシステムはより安全になります。これは残念なことにEmacsが必要な権限を保有していても、それらのディレクトリーのファイルにアクセスできないことを意味しています。ただありがたいことにOpen Handset Alliance版のAndroidでは、プログラムごとにこの制限を無効にすることができます。以下がシステムセッティングパネルでこれに相当するオプションです:

System -> Apps -> Special App Access -> All files access -> Emacs

このセッティングを適切に無効あるいは有効にしてEmacsに“Files and Media”の権限を付与すれば、通常通りEmacsは/sdcard配下のファイルにアクセスできるでしょう。一部のプロプライエタリーなバージョンのAndroidでは、これらのセッティングは用意されていません。

This page has generated for branch:work/emacs-30_69b16e5c63840479270d32f58daea923fe725b90, commit:5e3f74b56ff47b5bcef2526c70f53f749bbd45f6 to check Japanese translation.