Android版のGNU Emacsについて

# Android版のGNU Emacsについて

[0. 前書き](#0-前書き)

[1. Android版のGNU Emacsの入手](#1-android版のgnu-emacsの入手)
[1.1 F-Droid版](#11-f-droid版)
[1.2 SourceForge版](#12-sourceforge版)
[1.3 野良ビルド版](#13-野良ビルド版)

[2. Android版GNU Emacsと共存可能なTermuxの入手](#2-android版gnu-emacsと共存可能なtermuxの入手)
[2.0 用語の定義](#20-用語の定義)
[2.1 F-Droid版](#21-f-droid版)
[2.2 SourceForge版](#22-sourceforge版)
[2.3 野良ビルド版](#23-野良ビルド版)

[3. 野良ビルドの必要性](#3-野良ビルドの必要性)
[3.1 Android版GNU Emacsの場合](#31-android版gnu-emacsの場合)
[3.2 Termuxの場合](#32-termuxの場合)
[3.3 再署名してしまう](#33-再署名してしまう)

[4. スマホでの操作性を向上させるために行った設定](#4-スマホでの操作性を向上させるために行った設定)
[4.1 early-init.elの設定](#41-early-initelの設定)
[4.2 修飾キーへの対応その1](#42-修飾キーへの対応その1)
[4.3 修飾キーへの対応その2](#43-修飾キーへの対応その2)
[4.4 Taskerによるソフトキーボード切り替え](#44-taskerによるソフトキーボード切り替え)
[4.5 Emacsサーバーの起動](#45-emacsサーバーの起動)
[4.6 フォントのインストール](#46-フォントのインストール)

# 0. 前書き
以前qiitaに[EmacsのAndroidポートのビルド](https://qiita.com/ayatakesi/items/c857c907c8c7e675da9e)、[Emacs for AndroidをTermuxと一緒に使う](https://qiita.com/ayatakesi/items/92ec551532303eeb59f9)といった記事を投稿してからそれほど間は空いていませんが、アドカレに空きがあるようなので、それらの記事のまとめとして当記事を投稿させていただきます。

- - -
# 1. Android版のGNU Emacsの入手
GNU EmacsのAndroidポートはEmacsの次期メジャーリリースとなるバージョン30から利用できます。バージョン29がリリースされたのがつい最近(2023年7月30日)なので、バージョン30のベータ版(pretestと呼ばれる30.0.90)が出るのは当分先のことでしょう。とは言え前メジャーバージョンであるEmacs 28.1のリリース(2022年4月4日)から1年ちょっともしないでEmacs 29.1がリリースされたことを考えると、30.1も以外と早くリリースされてしまうかもしれません。

:::note info
個人的には今回リリースされたバージョン29は[バージョン22](https://news.mynavi.jp/techplus/article/20070604-a001/)に匹敵する大きなバージョンアップと思っていたので、29が早々にリリースされちゃったときはとてもビックリさせられました。
:::

ということで、EmacsのAndroidポートを試用するためにはアルファ版、つまり時々刻々と修整が加えられているバージョン30.0.50をAndroid用にconfigureしてビルドしたバイナリを入手する必要があるのです。

## 1.1 F-Droid版
2023年2月22日にF-DroidでAndroidネイティブなEmacsがダウンロードできるようになりました。ビルド済み最新版を簡単に試用できるということで当初話題となりましたが、アルファ版にたいする実装追加、バグ修整が施されているEmacsの開発メインレポジトリsavannahにたいして、F-Droid版の同期頻度が少ない(次にF-Droid版が更新されたのは10月8日)こと、後述するTermuxとのディレクトリー共有ができない(同時にインストールは可能)ことから、あまりお勧めできません。

:::note info
わたしは自分で野良ビルドしようといろいろ試行錯誤しましたが、後に[F-Droid版のビルドログやメタデータ](https://f-droid.org/ja/packages/org.gnu.emacs/)を参照できることを知り「もっと早く気づいていれば…」と思いました。野良ビルドする人には参考になると思います。
:::

## 1.2 SourceForge版
あまりアナウンスされていないような気がしますが、SourceForgeで提供されている[Android ports for GNU Emacs](https://sourceforge.net/projects/android-ports-for-gnu-emacs/files/)は最新版にたいして1日に数回というスパンで更新されています。更に現時点でEmacsとともにビルド可能なライブラリー(Emacsのmasterブランチの[java/INSTALL](https://git.savannah.gnu.org/cgit/emacs.git/plain/java/INSTALL)を参照)の多くとともにビルドされているのでお勧めです(apk分析アプリや拡張子をzipに変えて解凍後にlib/のフォルダを確認すれば一緒にビルドされているライブラリーが確認できます)。

:::note info
Androidポートの主要開発者Po Luさんによるプロジェクトと思いましたが提供者が別の人の名前であり、READMEでPo Luさんを三人称で呼ぶ箇所もあるので別の人が提供するプロジェクトなのかもしれませんね。ここのREADMEのFAQ、それにAndroidポート用にパッチ済みのライブラリー、そしてお互いに共存可能なEmacsとTermuxのビルドはとても役に立ちます(ここ以外でそれらを入手するには現時点では野良でビルドするしかありません)。
:::

## 1.3 野良ビルド版
昔からEmacsユーザーにはお馴染みの野良ビルド、いわゆる「俺Emacs」です。Androidアプリはインストールおよび実行される環境(スマホやタブレットのこと、デバイスと呼ばれる)とコンパイルおよびビルドされる環境(USBやWifiで接続したPCのこと、ホストと呼ばれる)が異なります。ソフトウェア開発に従事されている人でも、自身がAndroidスマホを使用しているからPCにもAndroid開発環境をもっているという人はあまりいないのではないでしょうか?(そうでもないのかな)? しかしデバイスとは別のホストでビルドするというこのお作法は、Github ActionsのようなCI/CDと相性ドンピシャなのです。前に投稿したとおり色々悪戦苦闘しましたが、共有ライブラリーのインストールで嵌っております(後述しますが、自前でビルドする必要はなくなりつつあります)。

:::note info
以前のTermuxはオンデバイスビルドをサポートしていませんでしたが、[Build android app on termux](https://gist.github.com/tmatz/817bf03433e059bf89c63dc33f286ccb)を見ると現在は可能なようです。ただしセットアップにおいて大量のビルド用アプリがインストールされるので、内部ストレージに相応な空きが必要になります(わたしは空きを用意できなかったので試せていません)。
:::

- - -
# 2. Android版GNU Emacsと共存可能なTermuxの入手
EmacsはOSと冗談混じりに評されることがあります。重箱の隅をつつくと、Emacsがハードウエアリソースの管理などを行うことはないので、オペレーティングシステムというよりはシェルのようにその背後にあるシステムとユーザーとの間を取りまとめるユーザーインターフェイスとして振る舞える側面が由来の比喩でしょう。最近のEmacsのキラーアプリの1つであるmagitは背後にあるgitというEmacsとは関係ないコマンドとユーザーの間をとりもつEmacs Lispパッケージです。松山朋洋さんの良記事[Emacsは死んだ](https://qiita.com/akmiyoshi/items/1c19d1484049683b4cec)は、Emacsのこの側面をEmacsの生命とみなして逆説的に記述された記事でしょう(そこから逸脱していく最近の動向を「...死んだ」と評している訳です)。

前置きが長くなってしまいました。Android版のEmacsですが当初はF-DroidにおいてEmacs単体で提供でリリースされました。この時分は背後にgit、diff、grepなどのコマンドが存在しなかったため、言語に応じて構文ハイライトができる普通?のエディターとして使うくらいしか思いつきませんでしたが、その後ドキュメントで共存させる方法が紹介され、現在はSourceForgeで共存できるバージョンのapkファイルも提供されています。それらの入手方法や特徴について説明します。

## 2.0 用語の定義
ここまで共存という単語1つで表していましたが、混乱してしまうので用語を定義します(似ている単語なのでまだ紛らわしいですが)。

- 共存
デバイスに同時にインストールできるが、お互いに関係のない別のアプリケーションなので、ユーザーがいくら権限を与えてもそれぞれ自身のファイルしか参照できない(リリース当初のバージョン)。

- 共有
同時にインストールできるのはもちろんお互いのファイル、たとえばTermuxにあるSSHの設定ファイルをAndroid版Emacsで編集したりできる(理想)。

## 2.1 F-Droid版
F-Droidで提供されているTermuxとAndroid版Emacsは共存できます。しかし共有はできずお互いにもう一方のファイルは参照できません。

:::note info
どちらもF-Droidが提供したことを証明するために同じキーで署名されていますが、TermuxのユーザーIDのcom.termuxとAndroid版EmacsのユーザーIDのorg.gnu.emacsが異なるので共有はできません。
:::

## 2.2 SourceForge版
SourceForgeにトップディレクトリーで提供されているのは共存は可能でも共有できないEmacsで、これはユーザーIDがorg.gnu.emacs、キーはEmacsディストリビューションに含まれているキーストアファイル(`java/emacs.keystore`)で署名されています。ダウンロードページのtermuxフォルダにあるEmacsとTermuxはどちらもユーザーIDがcom.termux、キーは`java/emacs.keystore`で、これらがお互いが共有できるバージョンのEmacsとTermuxなので、こちらの2つをダウンロードしてインストールすればお互いのファイルを参照することができ、EmacsからTermuxのコマンドを実行することができます。

## 2.3 野良ビルド版
SourceForgeで提供されているのはTermux-appだけです。TaskerやFloatなどTermuxの他のプラグインをビルドしたい場合や、特定のバージョンをビルドしたい場合には自分でビルドする必要が生じます。

- - -
# 3. 野良ビルドの必要性
Emacsにかぎらず、*nix系システムではビルド済みのバイナリーを調達してインストールするのではなく、自前でビルドしたものをインストールして使うという伝統があるようです(実際にFSFのダウンロードページでダウンロードできるのはソースファイルです)。

## 3.1 Android版GNU Emacsの場合
自己記述式(Self-documented)と呼ばれるEmacsには、実行中の内部のオブジェクト(関数や変数)の状態やヘルプ文字列、ソースコードを参照する`describe`というコマンドがあり、自分でビルドしたEmacsならばCで記述されたオブジェクトも参照できるのです。

:::note info
実は自分でビルドしたバイナリーでなくても、ビルドした元ソースの場所を設定すれば、同じようにソースを参照することができるし、gdb等のデバッガでソースコードを利用することができます。
:::

~~SourceForgeで提供されているバイナリーはほぼ最新版と思われるものの、自分が閲覧したかぎりどのコミットバージョンからビルドしたバイナリーを調べる方法がわかりませんでした。上述したようなことを行いたい場合には、やはり自前でビルドしたEmacsが欲しくなります。~~
SourceForgeのREADMEの最後に`M-x describe-variable RET emacs-repository-version RET`でsavannahレポジトリのどのコミットからビルドされたか確認できると説明されていました。このコミットをクローンして変数`source-directory`にセットすれば`describe`からソースコードに飛べるはずです。

:::note info
**2024-04-07追記**
[EmacsのAndroidポートのビルド](https://qiita.com/ayatakesi/items/c857c907c8c7e675da9e)から、Github Actions上でのビルドに挑戦してきて、やっと最近どうにか満足できるapkをビルドできるようになりました。詳細については[レポジトリ](https://github.com/ayatakesi/my-emacs)の`README.md`に記載してあります。

:::

## 3.2 Termuxの場合
TermuxもGPLでライセンスされているオープンソースのソフトウェアであり、[Github](https://github.com/termux)において開発やソースコードが公開されています。SourceForgeで公開されているTermuxのバージョンはリリースバージョンからソースを追跡できますがTermux本体(Termux-app)だけです。Termuxには他にもプラグインと呼ばれる拡張プラグイン(Termux-taskerなど)がいくつかあり、Emacsのキーで署名されたTermux-appで使う場合には、プラグインも同じキーで署名したバイナリーが必要になります。TermuxはGithubにビルド用のGithub Actionsのワークフローファイルがあるので、Emacsの`java/emacs.keystore`をstoreFileに指定すればビルドできると思います(FYI: わたしがビルドに使用したレポジトリはemacs-compat-termux-*という名前でgithub/ayatakesiに残ってます)。

:::note info
Linux環境を提供するTermuxですが、Linuxもコマンド(diff、grep、git、vimとか)を追加できなければあまり役に立ちません。Termux用に移植されたコマンドはTermux-packagesというレポジトリで管理されていますが、こちらは自前で用意する必要はありません。Termuxにはコマンドのインストールやアンインストールを行うためにpkgというコマンドがあります(このコマンドはDebian系Linuxなどでパッケージ管理に用いられているaptコマンドのラッパーシェルです; 当然aptコマンドを自分で叩くこともできます)。
:::

## 3.3 再署名してしまう
EmacsとTermuxの自前ビルドにチャレンジする手間を省きたい場合には、インストールメディアファイルであるapkファイルの署名を書き換えてしまうというツールもあるようです。わたしは自前でビルドしようと悪戦苦闘しているのであまり試せていませんが、[APK Explorer & Editor](https://f-droid.org/ja/packages/com.apk.editor/)はapkファイルの署名書き換えだけではなく、システムにインストールされているアプリケーションからapkファイルを再抽出することまでできるようです。

:::note info
Termuxで通常通りの方法で日本語入力ができるのは、わたしが知るかぎりではGoogle日本語入力しかないのですが、それの後継と思われるGboardをインストールしてしまうとGoogle PlayからGoogle日本語入力をインストールできません。そのためわたしは別機にインストール済みのGoogle日本語入力からこのアプリでapkを抽出、別機にインストールとかして使っています。
:::

- - -
# 4. スマホでの操作性を向上させるために行った設定
Emacs(だけではありませんが)を使う人は編集用になるべく表示領域を確保して、自分好みのハードウェアで快適に使うことを目標にカスタマイズする人が大半と思われます。この大目標と、素のスマホでのEmacsの使用は真っ向から競合する要件でしょう。スマホでEmacsを使う上でわたしが行ったカスタマイズや設定などを以下に紹介しておきます。

:::note info
なぜよりによってEmacsをスマホで使う必要があるのでしょう? わたしの場合は「スマホを使わなければならない」からです。ガラケーを卒業してから随分たち、携帯が楽で電源補給なしで長時間使用できるネットワーク接続された端末なしで生きていくことは、わたしにとって非現実な生活スタイルになってしまいました。メール閲覧やウェブ検索などもスマホで行うようになりましたが、スマホの入力UI(特にテキスト範囲の選択操作性などは発狂レベル)や各種ファイルを開く際の融通の効かなさ(メールに添付されたpatchのプレビューもダウンロードして拡張子を弄らなければ開くことさえできない)には苦労させられます。Emacsを入れても依然としてブラインドタッチ不可能で入力しづらい小さなQWERTY配列のソフトウェアキーボードですが、スマホのデフォルトの入力方法に比べれば断然ましなのです。
:::

## 4.1 early-init.elの設定
Android版EmacsからTermuxのコマンドを使えるように設定します。SourceForgeにあるREADMEの設定に加えて、わたしはホームディレクトリーをEmacsのホームディレクトリーからTermuxのホームディレクトリーに変更しています。これはTermux版のCUIのemacsと設定を共有するためです。

```elisp:early-init.el
(setenv "HOME" "/data/data/com.termux/files/home")
(setenv "PATH" (format "%s:%s" "/data/data/com.termux/files/usr/bin"
		       (getenv "PATH")))
(setenv "LD_LIBRARY_PATH" (format "%s:%s"
				  "/data/data/com.termux/files/usr/lib"
				  (getenv "LD_LIBRARY_PATH")))
(push "/data/data/com.termux/files/usr/bin" exec-path)
```

:::note warn
`earth-init.el`で`HOME`を変更したので、この後に読み込まれる本来のinitファイル、すなわち`~/.emacs.d/init.el`は`/data/data/com.termux/files/home/.emacs.d/init.el`になります。
:::

## 4.2 修飾キーへの対応その1
Escape Meta Alt Control Shiftの略だと揶揄されることもあるEmacsです。当然修飾キーなしでの運用には厳しいものがありますが、スマホ用に使われる日本語入力に対応しており、かつ修飾キーをもつソフトウェアキーボードを見つけることはできませんでした。そのような場合に対処するために、Emacs 30にはModifier Barモードが追加されました。このモードを有効にすることによって、Emacsのツールバーに修飾キー用のボタンが追加されます。

![Screenshot_20231215-193633.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134669/9529969e-b166-be93-f10d-68e2d8c89bf0.jpeg)

## 4.3 修飾キーへの対応その2
Termuxにはスマホでブラインドタッチ可能という希少なキーであるボリュームボタンを修飾キーとして使う機能があります。Emacsでこれと似たことを行うための設定が[emacs-devel](https://lists.gnu.org/archive/html/emacs-devel/2023-07/msg00193.html)で紹介されていた設定を拝借しました。

![Screenshot_20231215-195011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134669/625a30ed-ccfc-e6ee-5697-b10b42c5cd0c.jpeg)

## 4.4 Taskerによるソフトキーボード切り替え
上記2つの設定で乗り切るのが辛いときは手動で[Hacker's Keyboard](https://f-droid.org/ja/packages/org.pocketworkstation.pckeyboard/)に切り替えていたのですが結構な頻度なので、Taskerというアプリで自動的に切り替えるよう設定しました。設定方法については完全に別トピックとなるなので[別記事](https://qiita.com/ayatakesi/items/2cc97114a1b63c23556f)で挙げました。

## 4.5 Emacsサーバーの起動
問答無用でEmacsサーバーを有効にします。

![Screenshot_20231215-200034.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134669/e1249f10-f9fa-5bf8-476b-9fd431a381a5.jpeg)

これによりスマホでファイルをタップすればEmacsでそのファイルがオープンされます。以下はGmailに添付されていたpatchをオープンした様子です。

![Screenshot_20231215-200514.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134669/1f053ea1-8e6f-29f0-6a2c-e69afb989f49.jpeg)

サーバーを有効にしていないと以下のようなエラーが表示されてオープンできません。

![Screenshot_20231215-200918.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134669/76d4b520-91fa-07a8-df2a-24637e9f2537.jpeg)

## 4.6 フォントのインストール
Android版のEmacsの場合には、Emacsのホームディレクトリに`fonts`というディレクトリーを作成してTTFフォントを置けばEmacsから使用できるようになります。試しにSource Code Proをインストールしてみました。

![Screenshot_20231206-195122.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134669/fb5be753-95f8-ef98-6f9b-25fc9862080f.jpeg)

:::note info
`.emacs.d/early-init.el`などで`(setenv "HOME" "/data/data/com.termux/files/home")`のように環境変数HOMEをTermuxのホームディレクトリーに変更している場合でも、Emacs用のフォントはAndroid版Emacsのホームディレクトリーの配下、たとえばわたしの場合だと`/data/data/org.gnu.emacs/files/fonts`のようにディレクトリーを作成してください。

ちなみにTermux用のフォントはどんなフォントを設定しようとTermuxのホームディレクトリーにある`~/.termux/`ディレクトリーのファイル`font.ttf`、すなわち`/data/data/com.termux/files/home/.termux/font.ttf`になるようです。
:::

- - -
# 5. まとめ
最近アップデートが激しいEmacsですが、当然Androidポートも日々更新、改良されています。わたしが気づいただけでも、以前はskkやdevilなど修飾キーなしでコマンドを実行するパッケージの一部が動作しなかった問題が解決されていたり、要望が多かったピンチインアウトによるテキストサイズ変更にも現在は対応しています。普段使いのスマホで日々進化するEmacsを触れるのは嬉しいですよね?

おしまい

- - -
# 6. おまけ
[本家savannahの12/9時点のコミット](https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=598ab9ca10d35d6990f9af3a4d58f265acd8b121)からEmacs 30のEmacsユーザーマニュアルのAndroidの章だけ訳してみました(もちろん更新が激しいので内容はすぐに古くなってしまうでしょう)。[こちら](https://ayatakesi.github.io/emacs/translation_HEAD/html/Android.html)はHTML版。作業用のURLなどでいずれ消えてしまうので、以下にテキスト版を仕込んでおきますね

<details><summary>emacs/android.texiの日本語訳</summary>

```plaintext

Appendix H Emacs and Android
****************************

AndroidとはOpen Handset Allianceが開発したモバイル向けオペレーティングシ
ステムです。このセクションではAndroid 2.2以降を実行するAndroidデバイスに
おいてEmacsを使用する際の特色について説明します。

   Androidデバイスにおけるユーザー入力は、一般的にタッチスクリーンやデジ
タイザーデバイス、仮想キーボードに依存します。この種のデバイスをEmacsで
使用することに関する詳細については*note Other Input::を参照してください
。

H.1 Android History
===================

Androidは共通する(おそらくはフリーな)ソフトウェア集合を実行可能な携帯機
器の開発に関心をもつ企業グループである、Open Handset Allianceによって開
発されたモバイルデバイス用オペレーティングシステムです。

   かつてのXコンソーシアムと同じように"オープン度"、すなわちAndroidのソ
ースコードの定期的なリリースは、Androidプラットフォームの人気を高めるた
めの単なるツールだとOpen Handset Allianceは考えています。コンピューター
企業が作り出すのは、通常はプロプライエタリーソフトウェア(訳注: 利用者の
権利を制限して自身の利益を確保するフリーソフトウェアとは対極なソフトウェ
アを指す)です。Open Handset Allianceに所属する企業も同じです。デバイスに
インストールされるAndroidのほとんどは、多くの場合はユーザーによる置き換
えさえできないプライエタリーなコンポーネントを含むのでプロプライエタリー
なバージョンです。

   Androidはユーザーの自由を尊重するようにはデザインされていません。
Androidのほとんどのバージョン(フリーソフトウェアと思われるものを含む)に
は、DRM(Digital Restrictions Management: デジタル著作権管理)にたいするサ
ポートが含まれています。これはユーザーがユーザー自身のデバイス間でメディ
アを複製する能力を制限する技術のことです。さらにAndroidデバイスのほとん
どにはシステム、および他の多くのアプリケーションの実行に必要なGoogleのプ
ロプライエタリーなアプリケーションも付属するのです。

   したがってAndroidのプロプライエタリーソフトウェアにたいする判断は、実
用的観点から行う必要性が伴ってしまうのです。これは公正ではありません。あ
なたがAndroidユーザーなら、単にあなたが自由を獲得するという目的のために
もフリーなオペレーティングシステムに切り替えることをお勧めします。

   この自由を味わうことにより、プロプライエタリーなオペレーティングシス
テムシステムから抜け出すようユーザーが啓発されることを希望に、わたしたち
はプロプライエタリーなオペレーティングシステム上でGNU Emacsをサポートし
ているのです。

H.2 Starting Emacs on Android
=============================

AndroidデバイスでのEmacsのインストールは、ソースコードやパッケージマネー
ジャーを経由しません。別のオペレーティングシステム上でAndroid用にEmacsを
コンパイル、そのバイナリーをアーカイブにパッケージングしてからシステムに
転送してインストールします。

   インストール後にシステムがアプリケーションアイコンをデスクトップ("ホ
ームスクリーン"とも呼ばれる)に配置します。そのアプリケーションアイコンを
クリックすると、Emacsが起動します。

   Emacsはスタートアップ中のメッセージをシステムログバッファーに表示しま
す。スタートアップ中にこのバッファーを読み取るためには、別のコンピュータ
ーに‘adb’ユーティリティー(Android Debug Bridge)が必要になります。

   Androidシステムで"USB Debugging(USBデバッグ)"の機能を有効にした後に、
‘adb’ユーティリティーがインストールされている別のシステムで以下のコマン
ドをUSB経由で実行すれば、ログを閲覧できます:

     $ adb logcat | grep -E "(android_run_debug_thread|[Ee]macs)"

   ‘adb’ユーティリティーがGNU/LinuxあるいはUnixシステムにインストールさ
れていると仮定すると、以下の手順にしたがってデバイスに接続できます。

  1. システム設定アプリケーションの"About"ページで"build version"か
     "kernel version"を5から7回クリックすることで"developer options(開発
     者オプション)"を有効にする。

  2. 設定ページ"developer options"をオープンする(設定アプリケーションの
     "system"ページの下にあるはず)。

  3. "USB debugging".<をオンに切り替える。

  4. USBケーブルの終端にあるデバイスと、もう一方の終端にあるコンピュータ
     ーのUSBポートを接続する。

  5. コンピューターでコマンド‘adb shell’を実行する。接続済みデバイスへの
     アクセス権限をコンピューターにまだ付与していないので失敗、あるいは
     ハングするだろう。

  6. コンピューターからのアクセスを許可するかどうかを尋ねる画面がデバイ
     ス上にポップアップされる。

   Androidおよびインストールした‘adb’のバージョンに応じて接続を確立する
方法は異なるかもしれない。詳細については公式ドキュメント
<https://developer.android.com/studio/command-line/adb>を参照してくださ
い。

   Emacsが起動したら、非同期シェルコマンド(*note Shell::を参照)としてコ
マンド‘logcat’を実行するだけでログバッファーが表示されるでしょう。

   別のAndroidプログラムから‘emacsclient’プログラム(*note Emacs
Server::を参照)を開始する方法が存在しないので、すべてのファイルをオープ
ン可能なアプリケーションとして、Emacsが‘emacsclient’のラッパープログラム
を提供してシステムに登録します。

   ファイルをオープンするプログラムとしてこのラッパーが選択されると、ラ
ッパーがオプション‘--reuse-frame’、‘--timeout=10’、‘--no-wait’、およびオ
ープンするファイルの名前とともに‘emacsclient’を呼び出します。それが成功
するとオープンされているEmacsフレームにフォーカスが移ります。

   ラッパーのオープン時にEmacsが実行中でなければ、オープンするファイルを
引数としてEmacsを開始します。起動されたEmacsがその後にEmacsサーバーを開
始しなければ、その後のラッパーによるファイルのオープンは失敗することに注
意してください。

   一部のファイルは"content identifiers"(システムにより提供される通常の
ファイルシステムAPIの範囲外へのアクセス)としてEmacsに与えられます。
Emacsは‘/content/by-authority’という名前の疑似ディレクトリーを用いてそれ
らのファイルにアクセスします。このディレクトリー内のファイルにたいして何
かを仮定したり、自分でそれらのファイルをオープンしないでください。

   この機能はAndroid 4.3以前では提供されていないので、それらのファイルは
オープン前に一時ディレクトリーにコピーされます。

   普通のテキストファイルに加えて、Emacsは‘emacsclient’ラッパーを
"org-protocol"リンク(*note (org)Protocols::を参照)をオープン可能なプログ
ラムとしても登録します。

   さらにこのラッパーは‘mailto’のURIにメールを送信可能なプログラムとして
も登録されます。そのようなURLをオープンするために呼び出されると、その
URIを1つ目の引数として関数‘message-mailto’を呼び出します。この機能は
Emacsサーバーがまだ実行されていなければ機能しません。

H.3 What Files Emacs Can Access on Android
==========================================

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

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

   • (‘ls’のような)サブプロセスを‘/assets’ディレクトリーから実行できない
     。‘current-directory’に‘/assets’、‘/content/storage’、あるいはそれ
     らのサブディレクトリーをセットしてサブプロセスの実行を試みても、か
     わりにホームディレクトリーから実行されることになるだろう。

   • ‘/assets’、‘/content’のディレクトリーの中には‘.’、‘..’というディレ
     クトリーがない。

   • ‘/assets’ディレクトリー内のファイルは常に読み取り専用であり、オープ
     ンされる度に複数回メモリーに読み込まれるかもしれない。

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

   • “アプリケーションデータ(app data)”ディレクトリー。これはEmacsのホー
     ムディレクトリーの役目ももち、常に読み取りと書き込みでアクセスでき
     る。

   • “アプリケーションライブラリー(app library)”ディレクトリー。これは自
     動的に‘exec-path’に追加されて、起動時に‘exec-directory’が作成される
     。このディレクトリーにはEmacs自体とともに実行可能なユーティリティー
     が含められる。

   • “外部ストレージ(external storage)”ディレクトリー。ユーザーがシステ
     ムセッティングを通じてEmacsに"Files and Media"の権限を付与すれば
     Emacsがアクセスできる。

   • Android 5.0以降で“ドキュメントプロバイダー(document providers)”によ
     り提供されるディレクトリー。このディレクトリーはUnixの通常のファイ
     ルシステムの範囲外にあり、外部プログラムが提供するプログラムが含ま
     れている(*note Android Document Providers::を参照)。

   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デバイス
では、assetのファイルから読み込むために一時ファイル用ディレクトリーに
Emacsが‘temp~unlinked’で始まる名前のファイルを作成する必要があります。そ
のような名前のファイルは上書きされたり削除されるかもしれないので作成しな
いでください。

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

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

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

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

H.4 Accessing Files from Other Programs on Android
==================================================

Android 5.0では"document provider"という新たな概念のプログラムが導入され
ました。これらのプログラムはアセットマネージャーとUnixファイルシステムの
範囲外にある、プログラム独自のファイルへのアクセスを提供する小さなプログ
ラムです。これらのプログラムが提供するファイルやディレクトリーを
‘/content/storage’ディレクトリーに配置することによって、Emacsはそれらに
たいするアクセスをサポートしています。

   これらのディレクトリーのいずれかへのアクセスが付与される前に、まずは
Emacsがアクセスする権限を要求しなければなりません。これはコマンド
‘android-request-directory-access’を実行(*note M-x::を参照)することによ
り達成されます。このコマンドによってファイル選択ダイアログを表示されます
。

   このダイアログでディレクトリーを選択すると、
‘/content/storage/AUTHORITY/ID’という新たなディレクトリーでディレクトリ
ー内のファイルが利用可能になります(AUTHORITYはドキュメントプロバイダー名
、IDはドキュメントプロバイダーがディレクトリーに割り当てる一意な識別子
)。

   これらのディレクトリーでサブプロセスを作成する際には、‘/assets’ディレ
クトリー(*note Android File System::を参照)に課せられるのと同じ制限が適
用されます(Unixファイルシステムには存在しないため)。これらのディレクトリ
ーでEmacsが通常通り読み取りと書き込みが可能であっても、シンボリックリン
クやハードリンクを作成することはできません。

   ドキュメントプロバイダーはファイルコンテンツを取得するために高価なネ
ットワーク処理を実行することが許されているので、これらのディレクトリーに
あるファイルへのアクセス処理には有意な時間が費やされる可能性があります。

H.5 Running Emacs under Android
===============================

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

   アプリケーションはそれぞれ独自のホームディレクトリー(アプリケーション
のアプリケーションデータディレクトリー; *note Android File System::を参
照)をセットされて、独自のユーザーにより実行されます。(1)

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

   Emacsの配布物には複数のバイナリーも含まれています。実行可能ファイルは
ライブラリーディレクトリーにパッケージされます。そうしなけれしばEmacsの
インストールにおいてそれらをシステムがパッケージ展開しないからです。これ
は‘ctags’や‘emacsclient’をサブプロセスで起動する際に、Lispコードがかわり
に‘libctags.so’や‘libemacsclient.so’にコマンドライン指定しなければならな
いことを意味しています。変数‘ctags-program-name’、‘etags-program-name’、
‘hexl-program-name’、‘emacsclient-program-name’、
‘movemail-program-name’、‘ebrowse-program-name’、
‘rcs2log-program-name’の値を調べてどの名前が使用されたのを判断シテ。
*note (elisp)Subprocess Creation::を参照してください。

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

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

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

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

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

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

     $ adb shell "settings put global settings_enable_monitor_phantom_procs false"

   Emacsはシステムのユーザーアプリケーションにたいして構成されたlocaleに
したがいません。Androidで利用できる選択されたlocaleが、Cライブラリーによ
って提供されるlocaleと一致しないからです。EmacsがAndroid 5.0以降で開始さ
れると環境変数‘LANG’が‘en_US.utf8’にセットされます。これには出力を適切に
プリントできるようにするために、Android Cライブラリーにたいしてリンクさ
れたサブプロセスも含まれます。それ以前のバージョンのAndroidでは何の
localeも実装されていないために、この変数は‘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のバージョン次第です。

   • ある程度最近リリースされたAndroid、たとえばAndroid 6.0以降では、イ
     ンストール時にEmacsが取得する権限は以下の権限だけです:

        − ‘android.permission.VIBRATE’
        − ‘android.permission.ACCESS_NETWORK_STATE’
        − ‘android.permission.INTERNET’
        − ‘android.permission.SET_WALLPAPER’
        − ‘android.permission.NFC’
        − ‘android.permission.TRANSMIT_IR’
        − ‘android.permission.WAKE_LOCK’
        − ‘android.permission.FOREGROUND_SERVICE’
        − ‘android.permission.FOREGROUND_SERVICE_SPECIAL_USE’

     その他の権限については、ユーザーがシステム設定アプリケーションを介
     して付与しなければなりません。これを行う方法はデバイスにより異なる
     ので、詳細はデバイスの製造元に照会してください。

   • Android 5.1以前では、Emacsはインストール時に要求した以下の権限を自
     動的に取得します:

        − ‘android.permission.READ_CONTACTS’
        − ‘android.permission.WRITE_CONTACTS’
        − ‘android.permission.VIBRATE’
        − ‘android.permission.ACCESS_COARSE_LOCATION’
        − ‘android.permission.ACCESS_NETWORK_STATE’
        − ‘android.permission.INTERNET’
        − ‘android.permission.SET_WALLPAPER’
        − ‘android.permission.READ_CALENDAR’
        − ‘android.permission.WRITE_CALENDAR’
        − ‘android.permission.READ_EXTERNAL_STORAGE’
        − ‘android.permission.WRITE_EXTERNAL_STORAGE’
        − ‘android.permission.SEND_SMS’
        − ‘android.permission.RECEIVE_SMS’
        − ‘android.permission.RECEIVE_MMS’
        − ‘android.permission.WRITE_SMS’
        − ‘android.permission.READ_SMS’
        − ‘android.permission.NFC’
        − ‘android.permission.TRANSMIT_IR’
        − ‘android.permission.READ_PHONE_STATE’
        − ‘android.permission.WAKE_LOCK’
        − ‘android.permission.FOREGROUND_SEVICE’
        − ‘android.permission.REQUEST_INSTALL_PACKAGES’
        − ‘android.permission.REQUEST_DELETE_PACKAGES’
        − ‘android.permission.SYSTEM_ALERT_WINDOW’
        − ‘android.permission.RECORD_AUDIO’
        − ‘android.permission.CAMERA’
        − ‘android.permission.POST_NOTIFICATIONS’

     これらの権限のほとんどについてはEmacs自体に使われることはありません
     が、他のプログラムに有用かもしれないのでEmacsにより宣言されています
     。たとえば連絡先へのアクセス権限はEUDCにとって有用かもしれません。

   ---------- Footnotes ----------

   (1) "共有ユーザーID(shared user ID)"を指定して、同じ'パッケージ署名キ
ー('package signing key)"を用いて署名、インストールされた他のプログラム
は除外される。このような場合にはEmacsは同じユーザーで実行されるとともに
、それらのアプリケーションそれぞれにたいして同じアクセス圏を保有する。

H.6 The Android Window System
=============================

Androidのウィンドウシステムは特殊です。ウィンドウはすべて最大化あるいは
全画面で表示されまづ。そして一度に表示できるウィンドウは1つだけです。大
き目のデバイスではシステムが許容すれば画面に同時に4つまでのウィンドウを
タイル表示できます。

   Androidにおけるウィンドウは作成された後に永久に存在する訳ではありませ
ん。メモリー節約のために画面上にないウィンドウのクローズをシステムが選択
するかもしれないのです。システムはユーザーが後でプログラムのオープンを求
めた際にコンテンツをリストアできるように、プログラムがコンテンツをディス
クに保存しているとみなしているためです。これは明らかにEmacsには不可能な
ので、Emacsはフレーム関連のリソースをシステムウィンドウから分離していま
す。

   作成されたシステムウィンドウ(Emacs起動時に作成される初期ウィンドウを
含む)はそれぞれ、フレームに関連付けられていないウィンドウのリストに追加
されます。フレームの作成時にEmacsがこのリストのウィンドウすべてを調べて
、そのウィンドウ内にフレーム内容を表示するのです。ウィンドウがなければウ
ィンドウが作成されます。同様にシステムによって新たにウィンドウが作成され
た際には、まだウィンドウ内部に表示されていないすべてのフレームの内容を
Emacsがウィンドウに配置します。フレームのクローズ時には、それに応じたシ
ステムウィンドウもクローズされます。起動時にはシステム自体がウィンドウを
作成します(その直後にEmacsが最初のウィンドウシステムのフレームをそのウィ
ンドウ内に表示する)。Emacsはそのウィンドウとフレームの代理として作成され
たウィンドウを区別します。これはフレームに関連付けられたシステムウィンド
ウがクローズされた際に何を行うか判断するためです。

   • メモリー節約のためにシステムによってアプリケーション起動中に作成さ
     れたウィンドウがクローズされる際には、後でそのウィンドウが作成され
     たときのためにEmacsによりフレームが保持される。

   • アプリケーション起動中に作成されたウィンドウがユーザーにクローズさ
     れて、かつメモリー節約のためにシステムによってそのウィンドウが以前
     にクローズされていなければ、Emacsがそのウィンドウ内に表示されたすべ
     てのフレームを削除する。

   • 特定のフレームの代理としてEmacsが作成した任意のウィンドウがユーザー
     かシステムによってクローズされた際には、Emacsがそのウィンドウに表さ
     れているフレームを削除する。

   AndroidでEmacsがサポートするGUI機能は、以下のように限定されたサブセッ
トだけです:

   • Androidデバイスではほとんど役に立たないので、スクロールバーはサポー
     トしない。

   • フレームパラメーター‘alpha’、‘alpha-background’、‘z-group’、
     ‘override-redirect’、‘mouse-color’、‘title’、‘wait-for-wm’、
     ‘sticky’、‘undecorated’、‘tool-bar-position’はサポートしない(*note
     (elisp)Frame Parameters::を参照)。 The frame parameters are
     unsupported.

   • Android 4.0以前ではトップレベルのフレームのフレームパラメーター
     ‘fullscreen’は常に‘maximized’ (それより後のAndroidでは
     ‘fullscreen’も可)。

   EmacsはAndroid上のXウィンドウシステムでサポートされている選択
(selection)に関連する機能すべてを実装していません。たとえばサポートされ
ているのは‘CLIPBOARD’および‘PRIMARY’という選択だけであり(*note Cut and
Paste::を参照)、Emacsが選択をセットできるのは平文テキストにたいしてだけ
です。

   それに加えてAndroidシステム自体がEmacsにアクセス可能な選択データに以
下のように特定の制限を設けています:

   • Android 2.3以前では、クリップボード選択にたいして関数
     ‘gui-selection-owner-p’は常に‘nil’をリターンする。

   • Android 3.0からAndroid 9.0では、Emacsが望めばいつでもクリップボード
     にアクセスでき、‘gui-selection-owner-p’は常に正しい結果をリターンす
     る。

   • Android 10.0以降では、Emacsのいずれかのフレームが入力フォーカスもつ
     際のみクリップボードのデータにアクセスでき、クリップボード選択にた
     いして‘gui-selection-owner-p’は常に‘nil’をリターンする。

   Androidシステム自体にプライマリー選択という概念が存在しないので、かわ
りにEmacsがエミュレーションを提供しています。これはカットアンドペースト
を通じてプライマリー選択の内容を他のアプリケーションに送信する手段が存在
しないことを意味しています。

   ボリュームキーは通常はEmacsにより予約済みであり、物理キーボード(*note
On-Screen Keyboards::を参照)なしでEmacsを終了する機能を提供するために使
用されています。しかし音量調節に使いたい場合には、変数
‘android-pass-multimedia-buttons-to-system’に非‘nil’値をセットしてくださ
い。この場合にはボリュームキーを用いてEmacsを終了できなくなることに注意
してください。

   Android 6.0以降では入力フォーカスがEmacsにない間は、ダイアログボック
ス(*note Dialog Boxes::を参照)を表示できません。この点があなたにとって重
要なら、他のプログラム上に表示できる権限をEmacsに付与して、この機能を復
元できます。ほとんどのシステムでは以下の設定メニューからこれを行うことが
できます:

     System -> Apps -> Emacs -> More -> Display over other apps

   物理的な修飾キーととキーイベントにより報告されるEmacsの修飾子には直接
的な関係があります。1つ例外がありキーボードで<Alt>キーが押下されると
Emacsにその箇所で<Meta>修飾子が報告されます(逆も成り立つ)。これはほとん
どのキーボードには特に<Meta>キーがなく、Emacsでは<Alt>修飾子がほとんど使
用されていないことに由来する不規則性です。

   Androidは<Super>修飾子にたいして違う名前を用いることに留意してくださ
い。これはAndroidキーボードやキーマップ設定メニューでは<SYM>と呼ばれてい
ます。

   Androidの入力メソッドにはイベントのフィルタリング処理中に‘C-SPC’を含
むキーシーケンスを使用するような現実のアプリケーションを通常はもたないに
も関わらず、そのようなキーシーケンスを暗黙理に破棄するというイライラさせ
られる傾向があります。デフォルトでは入力メソッドによってこれらのキーシー
ケンスがフィルターされる前に、Emacsがキーシーケンスを横取りします。

   これが望ましくないと判明した場合(たとえば入力メソッドが言語切り替えの
ショートカットとして‘C-SPC’を扱う場合には、変数
‘android-intercept-control-space’を‘nil’にセットしてこれを無効にできます
。

   Androidにインストールされているキーボードベルは、ベルを鳴動させる場面
では数ミリ秒間アクティブになる振動要素という形式を採用しています。この振
動時間は変数‘android-keyboard-bell-duration’を‘10’から‘1000’の値に変更し
てカスタマイズできます。

H.7 Font Backends and Selection under Android
=============================================

EmacsはAndroidでは2つのフォントバックエンドをサポートしています。これら
にはそれぞれ‘sfnt-android’、‘android’という名前がつけられています。

   Emacsは起動時に‘/system/fonts’、‘/product/fonts’、およびEmacsのホーム
ディレクトリーにある‘fonts’というディレクトリー内にあるTrueType形式フォ
ントすべてを列挙します。Emacsは"Droid Sans Mono"という名前のフォントが常
に存在すると仮定して、そのフォントをデフォルトとして使用します。これらの
フォントはフォントドライバー‘sfnt-android’によって表示されます。

   このフォントドライバーには現在のところOpenTypeフォントのサポートがあ
りません。したがってEmacsが利用できるのは与えられたシステムにインストー
ルされているフォントのサブセットだけです。この制限の克服に興味がある場合
には、どうか<emacs-devel@gnu.org>に連絡してください。

   フォントドライバー‘sfnt-android’がフォントｗ見つけられず失敗すると、
Emacsはフォントドライバー‘android’にフォールバックします。これは
Androidプラットフォームが提供するフォントメトリックの制限と不正確さによ
る、非常に貧弱なフォントドライバーです。この場合にはEmacsはシステムで構
成されているタイプフェイス"Monospace"(常にDroid Sans Monoであること)を使
用します。

   Xシステムの場合と同じように、AndroidにおいてEmacsは変形可能フォント
(distortable fonts)をサポートします。("TrueType GXフォント"、"可変フォン
ト"、"multiple masterフォント"とも呼ばれる)これらのフォントは単一のフォ
ントファイルを用いて"Bold(太字)"、"Italic(斜体)"等のような異なる複数のス
タイルを提供します。

   ユーザーがインストールした変形可能フォントが見つかると、以前に検出さ
れたフォントが提供していたスタイルは使用されなくなります。加えて新たな変
形可能フォントが以前にインストールされた変形可能フォントのスーパーセット
であるようなスタイルの場合には、以前インストールされた同じファミリー名を
もつ変形可能フォントは無視されます。筆記体フォント(conventional font)が
見つかると、同じスタイルとファミリーをもつ以前の筆記体フォントは削除され
ます。同じファミリーであるような変形可能フォントが提供していたスタイルは
使用されなくなります。

   Emacsは一般的に‘Monospace’、‘Monospace Serif’、‘Sans Serif’、、
‘DejaVu Serif’という名前のファミリーのフォントが存在すると仮定します。
Androidはそのような名前のフォントを提供していないのでEmacsがそのようなフ
ォントにたいする要求を、Androidとともに配布されている相当するフォントフ
ァミリーセットのいずれかへの要求に変更しています。

   置換するフォントファミリーセット、あるいは置換されるフォントファミリ
ーセットのいずれかを変更するためには、変数‘sfnt-default-family-alist’を
変更してください。これは通常は保証されていないことに留意してください。デ
フォルト、あるいは‘variable-pitch’フェイスのカスタマイズは、それらの定義
(*note Face Customization::を参照)の変更によって行うほうが適切です。

H.8 Troubleshooting Startup Problems on Android
===============================================

Androidにはコマンドラインが存在しないので、通常はEmacs起動時にコマンドラ
イン引数を指定する手段は存在しません。これはEmacs初期化ファイルにたいし
てEmacsの起動を完全に妨げるような間違いを犯した場合に非常に厄介です。通
常はシステムが他のプログラムによるEmacsのホームディレクトリーへのアクセ
ス和禁止しているからです。*note Initial Options::を参照してください。

   しかし特別な設定画面から‘--quick’あるいは‘--debug-init’と等価なオプシ
ョンでえまを起動することができます。Android 7.0以降ではシステム設定プロ
グラムにあるEmacsの"app info"のページからアクセスできます。それより古い
システムではデスクトップにある"Emacs options"という別のアイコンから表示
できます。

   デバイスにより異なるので、あなたのデバイスの製造元に照会してください
。

   デバイスでEmacsの特定のコピーを初めて起動する際には、通常はEmacsに付
属する事前ロードされたLispファイルのロードにしばらく時間がかかるでしょう
。これによりfilesディレクトリーに、そのEmacsのコピー特有の識別子を含んだ
"ダンプファイル"(*note Initial Options::を参照)が作成されます。

   同じEmacsコピーを時間起動する際には、そのダンプファイルに含まれるデー
タを単にロードするだけなので、起動時間が劇的に短縮されるでしょう。

   予期せぬ状況下でダンプファイルが破損すると、Emacsがクラッシュするかも
しれません。これが発生したは上述の設定画面からEmacsのfilesディレクトリー
に保存されているダンプファイルを消去できます。

   Android 4.4以降では破損したインストール済みEmacsを救済するための代替
え手段が提供されています。EmacsはEmacsのホームディレクトリーのコンテンツ
にアクセスできる"ドキュメントプロバイダー"をエクスポートしていまづ。これ
により任意のファイルマネージャーからそれらにアクセスできます。

   デバイス付属のファイルマネージャーでこのドキュメントプロバイダーをオ
ープンする方法が見つけられれば、そこから初期化ファイルやダンプファイルの
リネーム、削除、あるいは編集が可能になります。

H.9 Installing Extra Software on Android
========================================

Androidのデフォルトのインストールとともに、例外的に限定されたUnix風のコ
マンドラインツールが配布されます。この選択を強化するためにUnixコマンドラ
インユーティリティーの改善されたバージョンの再現から、GNUおよびUnixのフ
リーソフトウェアの広範なコレクションを提供するパッケージレポジトリに至る
幅広いオプションを提供するプロジェクトが複数存在します。

   Busybox (http://busybox.net)はAndroidで実行可能な静的にリンクされた単
一のLinuxバイナリーであり、Unixユーティリティーおよび‘wget’のような特定
の著名なGNUプログラムの制限されたレプリカを提供しています。

   Termux (https://termux.dev)はDebianプロジェクトの‘dpkg’システム、およ
びコンパイラー、デバッガ、それにC、C++、Java、Python、Common Lispのよう
な言語向けのランタイムを含む相当数のUnixシステム向けフリーソフトウェアを
含んだ一連のパッケージレポジトリを提供しています。これらのパッケージは通
常は専用の端末エミュレーターからインストールされますが、同じアプリケーシ
ョン署名キー、"shared user ID(共有ユーザーID)"を同じパッケージ名にセット
してビルドすれば、その端末エミュレーターと同じようにインストールできます
。このやり方によってEmacsをビルドする方法についてはEmacsとともに配布され
るファイル‘java/INSTALL’に説明があります。

   termux-packages (https://github.com/termux/termux-packages)Termuxのパ
ッケージレポジトリを生成するためにTermuxがシヨウするパッケージ定義を提供
しています。これらをEmacsのホームディレクトリーにインストールするために
個別〜いインストールすることもできます。

   上記のプロジェクトに加えて、Linuxカーネルベースのシステム用に静的にリ
ンクされたバイナリーのほとんどはAndroidでも実行できます。
```
</details>