Next: Androidでの他のプログラムからのファイルアクセス, Previous: AndroidでのEmacsの起動, Up: EmacstとAndroid [Contents][Index]
EmacsはAndroidシステム上で/assetsという名前の特別なディレクトリーを公開します。このディレクトリーにはGNUやUnixなら通常は/usr/share/emacsにインストールされるディレクトリーetc、lisp、infoが含まれています。Androidシステムではls
のLispエミュレーション(MS-Windowsでのls
のエミュレーションを参照)がデフォルトで有効になっています。システムに付属するls
のバイナリーはメーカーによって異なり、Emacsが求めるすべての機能は通常はサポートしていないからです。一部のAndroidシステムとともに配布されるls
のコピーの中には、-l
フラグさえ欠落していることが知られています。
Androidはパッケージの展開時にアプリケーションのパッケージ内容を展開せずに、“asset manager”という特別なインターフェイスを用いることをEmacsのようなプログラムに要求するためにこのディレクトリーが存在します。このような実装による結果として以下のような特性が生じます:
ls
のような)サブプロセスを/assetsディレクトリーから実行できない。current-directory
に/assets、/content/storage、あるいはそれらのサブディレクトリーをセットしてサブプロセスの実行を試みても、かわりにホームディレクトリーから実行されることになるだろう。
/assetsディレクトリー以外にも、Androidプログラムは通常は以下の4つのディレクトリーにアクセスできます:
exec-path
に追加されて、起動時にexec-directory
が作成される。このディレクトリーにはEmacs自体とともに実行可能なユーティリティーが含められる。
Androidの通常のインストールでは(普通だと読み取り専用である)ルートディレクトリーにcontentやassetsという名前のファイルはないはずですが、使用しているAndroidのインストールがカスタマイズされていてそれらの名前で実際のファイルにアクセスしたい場合があるかもしれません。このようなファイルは前述した特別なディレクトリーと競合しますが、/../contentや/../assetsのようにルートディレクトリーの“親”ディレクトリーから相対的な名前を記述することによってアクセスできます。
外部ストレージディレクトリーは/sdcardで見つけることができます。アプリケーションデータディレクトリーは通常は/data/data/org.gnu.emacs/filesにシンボリックリンクされているとはいえ、その他のディレクトリーを固定的な位置で見つけることはできません(が以下を参照のこと)。
Androidの以前のバージョンでは、アプリケーションライブラリーディレクトリーはアプリケーションデータディレクトリーの親ディレクトリーにあるlibという名前のディレクトリーでした。このディレクトリーは現在ではランダムに生成された名前で/data/app配下に置かれることが多いようです。
Emacsと同じユーザーIDを共有するアプリケーション内で実行される(exec-directory
変数にアクセスできない)スクリプトの利便性のために、起動時にアプリケーションデータディレクトリーの親ディレクトリー配下の従来の場所に、アプリケーションデータライブラリーをシンボリックリンクさせるために少なからぬ労力が費やされています。
Emacsを再インストールした結果、アプリケーションライブラリーディレクトリーの位置が変更された場合には、システムが次回にEmacsを起動する際に新たな場所を指すようこのシンボリックリンクを更新します。
On Android devices running very old (2.6.29) versions of the Linux kernel, Emacs needs to create files named starting with temp~unlinked in the temporary file directory in order to read from asset files. Do not create files with such names yourself, or they may be overwritten or removed.
Android
11以降のAndroidシステムでは、アプリケーションによるopen
やreaddir
のようなファイル関連のシステムコールを用いた/sdcardディレクトリーへのアクセスが制限されています。
この“対象範囲別ストレージ(Scoped Storage)”と呼ばれる制限によって、おそらくシステムはより安全になります。これは残念なことにEmacsが必要な権限を保有していても、それらのディレクトリーのファイルにアクセスできないことを意味しています。ただありがたいことにOpen Handset Alliance版のAndroidでは、プログラムごとにこの制限を無効にすることができます。以下がシステムセッティングパネルでこれに相当するオプションです:
System -> Apps -> Special App Access -> All files access -> Emacs
このセッティングを適切に無効あるいは有効にしてEmacsに“Files and Media”の権限を付与すれば、通常通りEmacsは/sdcard配下のファイルにアクセスできるでしょう。一部のプロプライエタリーなバージョンのAndroidでは、これらのセッティングは用意されていません。