EmacsはAndroidシステム上で特別なディレクトリを提供しています。そのディレクトリ名は/assetsであり、通常GNUやUnixシステムでは/usr/share/emacsディレクトリにインストールされるetc、lisp、infoの各ディレクトリが含まれています。Androidシステムでは、システムに付属するlsバイナリがメーカーによって異なり、通常Emacsが必要とするすべての機能をサポートしていないため、lsのLispエミュレーション(MS-Windowsにおけるlsのエミュレーションを参照)もデフォルトで有効になっています。一部のAndroidシステムに配布されているlsのコピーの中には、-lフラグをサポートしていないものさえあることが知られています。
このディレクトリが存在するのは、Androidがアプリケーションパッケージを展開する際にその内容をファイルシステム上に抽出せず、代わりに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が起動される際に、そのシンボリックリンクも新しい場所を指すように更新されます。
非常に古い(2.6.29)バージョンのLinuxカーネルを搭載したAndroidデバイスでは、Emacsがアセットファイルから読み込むために、一時ファイルディレクトリ内にtemp~unlinkedで始まる名前のファイルを作成する必要があります。このような名前のファイルをご自身で作成しないでください。上書きされたり削除されたりする可能性があります。
Android 11 以降では、Android システムは、open や readdir といったファイル関連のシステムコールを使用して、アプリケーションが /sdcard ディレクトリ内のファイルにアクセスすることを制限しています。
この制限は「スコープ付きストレージ」として知られており、システムのセキュリティを高めるとされています。残念ながら、これはEmacsが必要な権限を持っているにもかかわらず、それらのディレクトリ内のファイルにアクセスできないことも意味します。幸いなことに、Open Handset Alliance版のAndroidでは、プログラムごとにこの制限を無効化することが可能です。システム設定パネルにある対応するオプションは以下の通りです:
System -> Apps -> Special App Access -> All files access -> Emacs
必要に応じてこの設定を無効または有効にし、Emacsに「ファイルとメディア」権限を付与すれば、通常通り /sdcard 配下のファイルにアクセスできるようになります。これらの設定は、一部のプロプライエタリなAndroidバージョンには搭載されていません。