@c This is part of the Emacs manual. @c Copyright (C) 2023--2025 Free Software Foundation, Inc. @c See file emacs.texi for copying conditions. @node Android @appendix Emacs and Android @cindex Android Android is a mobile operating system developed by the Open Handset Alliance. This section describes the peculiarities of using Emacs on an Android device running Android 2.2 or later. Android devices commonly rely a touch screen or digitizer device and virtual keyboard for user input. For more information about using such devices with Emacs, @pxref{Other Input}. @menu * What is Android?:: Preamble. * Android Startup:: Starting up Emacs on Android. * Android File System:: The Android file system. * Android Document Providers:: Accessing files from other programs. * Android Environment:: Running Emacs under Android. * Android Windowing:: The Android window system. * Android Fonts:: Font selection under Android. * Android Troubleshooting:: Dealing with problems. * Android Software:: Getting extra software. @end menu @node What is Android? @section Android History Android is an operating system for mobile devices developed by the Open Handset Alliance, a group of companies interested in developing handsets that can run a common set of software. It is supposedly free software. Like the X Consortium of times past, the Open Handset Alliance believes that ``openness'' (namely, the regular release of the Android source code) is simply a tool to increase the popularity of the Android platform. Computer companies normally produce proprietary software. The companies in the Open Handset Alliance are no different -- most versions of Android installed on devices are proprietary, by virtue of containing proprietary components, that often cannot even be replaced by the user. Android is not designed to respect users' freedom. Almost all versions of Android (including some which are supposedly free software) include support for Digital Restrictions Management, technology that is designed to limit users' ability to copy media to and from their own devices. Most Android devices also come with proprietary Google applications which are required to run the system, and many other Android applications. Thus, it must be necessary to consider Android proprietary software from a practical standpoint. That is an injustice. If you use Android, we urge you to switch to a free operating system, if only for your freedom's sake. We support GNU Emacs on proprietary operating systems because we hope this taste of freedom will inspire users to escape from them. @node Android Startup @section Starting Emacs on Android Emacs is not installed on Android devices from source code or through a package manager. Instead, Emacs is compiled for Android on a different operating system, with the resulting binaries packaged into an archive, that is then transferred to the system and installed. After being installed, the system places an application icon on the desktop (a.k.a@: ``home screen''.) Emacs then starts up once the application icon is clicked. @cindex ``adb logcat'' During startup, Emacs will display messages in the system log buffer; reading that buffer during start-up requires the Android Debug Bridge (@command{adb}) utility to be installed on another computer. After enabling the ``USB Debugging'' feature on the Android system, and connecting it via USB to another system with the @command{adb} utility installed, the log can be viewed by running the following command on that other system: @example $ adb logcat | grep -E "(android_run_debug_thread|[Ee]macs)" @end example Assuming that the @command{adb} utility is installed on a GNU/Linux or Unix system, follow the steps below to connect to your device. @enumerate @item Enable ``developer options'' on your device, by going to the ``About'' page in the system settings application and clicking on the ``build version'' or ``kernel version'' items five to seven times. @item Open the ``developer options'' settings page, which should be under the ``system'' page in the settings application. @item Turn on the switch ``USB debugging''. @item Connect one end of a USB cable to your device, and the other end to your computer's USB port. @item Run the command @command{adb shell} on your computer. This will fail or hang because you have not yet granted your computer permission to access the connected device. @item Confirm the pop-up displayed on your device asking whether or not it should allow access from your computer. @end enumerate Depending on the versions of Android and @command{adb} installed, there may be other ways to establish a connection. See the official documentation at @url{https://developer.android.com/studio/command-line/adb} for more details. Once Emacs starts up, simply running the command @command{logcat} as an asynchronous shell command (@pxref{Shell}) will display the log buffer. @cindex emacsclient wrapper, android Since there is no other way to start the @command{emacsclient} program (@pxref{Emacs Server}) from another Android program, Emacs provides a wrapper around the @command{emacsclient} program, which is registered with the system as an application that can open any file. When that wrapper is selected as the program with which to open a file, it invokes @command{emacsclient} with the options @command{--reuse-frame}, @command{--timeout=10}, @command{--no-wait}, and the name of the file being opened. Then, upon success, the focus is transferred to any open Emacs frame. However, if Emacs is not running at the time the wrapper is opened, it starts Emacs and gives it the file to open as an argument. Note that if that Emacs in turn does not start the Emacs server, subsequent attempts to open the file with the wrapper will fail. @cindex /content/by-authority directory, android @cindex /content/by-authority-named directory, android Some files are given to Emacs as ``content identifiers'' that the system provides access to independently of the normal filesystem APIs. Emacs uses pseudo-directories named @file{/content/by-authority} and @file{/content/by-authority-named} to access those files. Do not make any assumptions about the contents of these directories, or try to open files in it yourself. This feature is not provided on Android 4.3 and earlier, in which case such files are copied to a temporary directory before being opened. @cindex ``org-protocol'' links, android In addition to opening ordinary text files, Emacs also registers its @command{emacsclient} wrapper as a program capable of opening ``org-protocol'' links (@pxref{Protocols,,,org, The Org Manual}). @cindex ``mailto'' links, android Furthermore, the wrapper is also registered as a program capable of sending mail to @code{mailto} URIs; when it is invoked to open such a URL, it calls the function @code{message-mailto} with that URI as its first argument. This feature does not function when the Emacs server is not already running. @node Android File System @section What Files Emacs Can Access on Android @cindex /assets directory, android Emacs exposes a special directory on Android systems: the name of the directory is @file{/assets}, and it contains the @file{etc}, @file{lisp} and @file{info} directories which are normally installed in @file{/usr/share/emacs} directory on GNU and Unix systems. On Android systems, the Lisp emulation of @command{ls} (@pxref{ls in Lisp}) is also enabled by default, as the @command{ls} binary which comes with the system varies by manufacturer and usually does not support all of the features required by Emacs. One copy of @command{ls} distributed with some Android systems is even known to lack support for the @code{-l} flag. @cindex limitations of the /assets directory This directory exists because Android does not extract the contents of application packages on to the file system while unpacking them, but instead requires programs like Emacs to access its contents using a special ``asset manager'' interface. Here are the peculiarities that result from such an implementation: @itemize @bullet @item Subprocesses (such as @command{ls}) can not run from the @file{/assets} directory; if you try to run a subprocess with @code{current-directory} set to @file{/assets}, @file{/content/storage} or a subdirectory thereof, it will run from the home directory instead. @item There are no @file{.} and @file{..} directories inside the @file{/assets} or @file{/content} directory. @item Files in the @file{/assets} directory are always read only, and may be read in to memory more than once each time they are opened. @end itemize Aside from the @file{/assets} directory, Android programs normally have access to four other directories. They are: @itemize @bullet @item The @dfn{app data} directory. This also serves as the home directory for Emacs, and is always accessible read-write. @item The @dfn{app library} directory. This is automatically appended to @code{exec-path} and made @code{exec-directory} upon startup, and contains utility executables alongside Emacs itself. @item The @dfn{external storage} directory. This is accessible to Emacs when the user grants the ``Files and Media'' permission to Emacs via system settings. @item Directories provided by @dfn{document providers} on Android 5.0 and later. These directories exist independently of the Unix virtual filesystem, containing files provided by external programs (@pxref{Android Document Providers}.) @end itemize Despite ordinary installations of Android not having files within the (normally read-only) root directory named @file{content} or @file{assets}, you may want to access real files by these names if the Android installation in use has been customized. These files will conflict with the aforementioned special directories, but can nevertheless be accessed by writing their names relative to the ``parent'' directory of the root directory, as so illustrated: @file{/../content}, @file{/../assets}. The external storage directory is found at @file{/sdcard}. The other directories are not found at any fixed location (but see below), although the app data directory is typically symlinked to @file{/data/data/org.gnu.emacs/files}. @cindex app library directory, android @cindex where is emacsclient under android Older versions of Android used to place the app library directory under the name @file{lib} in the parent of the app data directory. Today, this directory is often placed in a directory with a randomly generated name under @file{/data/app}. For the convenience of scripts running within applications sharing the same user ID as Emacs (which have no access to the @code{exec-directory} variable), a fairly considerable effort is made at startup to symlink the application library directory to its traditional location within the parent of the app data directory. If Emacs is reinstalled and the location of the app library directory consequently changes, that symlink will also be updated to point to its new location the next time Emacs is started by the system. @cindex temp~unlinked.NNNN files, Android On Android devices running very old (2.6.29) versions of the Linux kernel, Emacs needs to create files named starting with @file{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. @cindex file system limitations, Android 11 On Android 11 and later, the Android system restricts applications from accessing files in the @file{/sdcard} directory using file-related system calls such as @code{open} and @code{readdir}. This restriction is known as ``Scoped Storage'', and supposedly makes the system more secure. Unfortunately, it also means that Emacs cannot access files in those directories, despite holding the necessary permissions. Thankfully, the Open Handset Alliance's version of Android allows this restriction to be disabled on a per-program basis; the corresponding option in the system settings panel is: @example System -> Apps -> Special App Access -> All files access -> Emacs @end example After you disable or enable this setting as appropriate and grant Emacs the ``Files and Media'' permission, it will be able to access files under @file{/sdcard} as usual. These settings are not present on some proprietary versions of Android. @node Android Document Providers @section Accessing Files from Other Programs on Android @cindex document providers, Android @cindex /content/storage directory, Android Android 5.0 introduces a new sort of program, the ``document provider'': these programs are small services that provide access to their own files independently of the asset manager and the Unix filesystem. Emacs supports accessing files and directories they provide, placing their files within the directory @file{/content/storage}. @findex android-request-directory-access Before Emacs is granted access to one of these directories, it must first request the right to access it. This is done by running the command (@pxref{M-x}) @code{android-request-directory-access}, which displays a file selection dialog. If a directory is selected from this dialog, its contents are subsequently made available within a new directory named @file{/content/storage/@var{authority}/@var{id}}, where @var{authority} is the name of the document provider, and @var{id} is a unique identifier assigned to the directory by the document provider. @findex android-relinquish-directory-access Such a directory can be deleted once no longer required by providing its name to the command @code{android-relinquish-directory-access}. The same limitations applied to the @file{/assets} directory (@pxref{Android File System}) are applied when creating sub-processes within those directories, because they do not exist within the Unix file-system. In addition, although Emacs can normally write and create files inside these directories, it cannot create symlinks or hard links. Since document providers are allowed to perform expensive network operations to obtain file contents, a file access operation within one of these directories has the potential to take a significant amount of time. @node Android Environment @section Running Emacs under Android From the perspective of users, Android is mostly a single user operating system; however, from the perspective of applications and Emacs, the system is host to an overwhelming number of users. Each application runs in its own user, with its home directory set to its app data directory (@pxref{Android File System}.)@footnote{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.} Each application is also prohibited from accessing many system directories and the app data directories of other applications. The Emacs distribution also incorporates several binaries. While being executable files, they are packaged as libraries in the library directory, because otherwise the system will not unpack them while Emacs is being installed. This means that instead of @code{ctags} or @code{emacsclient}, Lisp code must specify @code{libctags.so} or @code{libemacsclient.so} on the command line when starting either of those programs in a subprocess; to determine which names to use, consult the values of the variables @code{ctags-program-name}, @code{etags-program-name}, @code{hexl-program-name}, @code{emacsclient-program-name}, @code{movemail-program-name}, @code{ebrowse-program-name}, and @code{rcs2log-program-name}. @xref{Subprocess Creation,,, elisp, the Emacs Lisp Reference Manual}. The @file{/assets} directory containing Emacs start-up files is meant to be inaccessible to processes not directly created by @code{zygote}, the system service responsible for starting applications. Since required Lisp is found in the @file{/assets} directory, it would thus follow that it is not possible for Emacs to start itself as a subprocess. A special binary named @command{libandroid-emacs.so} is provided with Emacs, which is installed into the library directory, and which tries its best to start Emacs for the purpose of running Lisp in batch mode. The approach it takes was devised by reference to Android source code, and is not sanctioned by the Android compatibility definition documents, so your mileage may vary. @cindex EMACS_CLASS_PATH environment variable, Android Even when the location of the @command{libandroid-emacs.so} command is known in advance, special preparation is required to run Emacs from elsewhere than a subprocess of an existing Emacs session, as it must be made to understand the location of resources and shared libraries in or extracted from the installed application package. The OS command @command{pm path org.gnu.emacs} will print the location of the application package, though the said command must be invoked in a peculiar manner to satisfy system restrictions on communication between pseudoterminal devices created by user applications and system services such as the package manager, which is to say, with the standard IO streams redirected to a real file or a pipe. This value, once established, must be specified in the environment variables @code{EMACS_CLASS_PATH}, so that this sample shell script may be installed as @code{emacs} in any location that is accessible: @example #!/system/bin/sh package_name=`pm path org.gnu.emacs 2>/dev/null Apps -> Emacs -> More -> Display over other apps @end example @cindex keyboard modifiers, android There is a direct relation between physical modifier keys and Emacs modifiers (@pxref{Modifier Keys}) reported within key events, subject to a single exception: if @key{Alt} on your keyboard is depressed, then the @key{Meta} modifier will be reported by Emacs in its place, and vice versa. This irregularity is since most keyboards possess no special @key{Meta} key, and the @key{Alt} modifier is seldom employed in Emacs. Bear in mind that Android uses a different name for the @key{Super} modifier: it is referred to as @key{SYM} on Android keyboards and within the Settings keymap menu. @vindex android-intercept-control-space @cindex @kbd{C-SPC} interception, android Android input methods have a penchant for irritating users by silently discarding key sequences containing @kbd{C-SPC} during the event filtering process, that they normally have no real application for such key sequences notwithstanding. By default, Emacs intercepts these key sequences before they can be filtered by the input method. If this proves unwanted (for instance, if the input method treats @kbd{C-SPC} as a shortcut key for switching languages), it can be disabled by setting the variable @code{android-intercept-control-space} to @code{nil}. @vindex android-keyboard-bell-duration @cindex keyboard bell, android The keyboard bell installed within Android systems takes the form of a vibrating element that is activated for a number of milliseconds whenever the bell is rung. The duration of this vibration can be customized through altering the variable @code{android-keyboard-bell-duration} to any value between @code{10} and @code{1000}. @vindex android-display-planes @cindex visual class, Android @cindex display color space, Android Color-related characteristics of the display are not automatically detectable on Android, so the variable @code{android-display-planes} should be configured to a suitable value if Emacs is to realize faces and images in a manner consistent with the true visual attributes of a grayscale or monochrome display: to @code{8} for the former class of display, and @code{1} for the latter, which will, respectively, force all colors to be rendered in 256 grays, or in monochrome. As this variable is processed at the time the display connection is established, customizations will not take effect unless they be performed from @code{early-init.el} (@pxref{Early Init File}). The value of this variable does not affect anti-aliasing in the font driver, as monochrome displays nevertheless expect Emacs to provide antialiased text, which they receive after it is processed into bitmap data by the display driver. @node Android Fonts @section Font Backends and Selection under Android @cindex fonts, android Emacs supports two font backends under Android: they are respectively named @code{sfnt-android} and @code{android}. Upon startup, Emacs enumerates all the TrueType format fonts in the directories @file{/system/fonts} and @file{/product/fonts}, and the @file{fonts} directory (@dfn{user fonts directory}) inside the Emacs home directory. Emacs assumes there will always be a font named ``Droid Sans Mono'', and then defaults to using this font. These fonts are then displayed by the @code{sfnt-android} font driver. This font driver is presently without support for OpenType or color fonts; hence, only a subset of the fonts installed on any given system are available to Emacs. If you are interested in lifting this limitation, please contact @email{emacs-devel@@gnu.org}. If the @code{sfnt-android} font driver fails to find any fonts at all, Emacs falls back to the @code{android} font driver. This is a very poor font driver, consequent upon limitations and inaccuracies in the font metrics provided by the Android platform. In that case, Emacs uses the ``Monospace'' typeface configured on your system; this should always be Droid Sans Mono. @cindex TrueType GX fonts, android @cindex distortable fonts, android As on X systems, Emacs supports distortable fonts under Android. These fonts (also termed ``TrueType GX fonts'', ``variable fonts'', and ``multiple master fonts'') provide multiple different styles (``Bold'', ``Italic'', and the like) using a single font file. When a user-installed distortable font is found, each style that a previously discovered font provided will no longer be used. In addition, any previously installed distortable fonts with the same family name are also disregarded, provided that the new distortable font supplies a superset of the styles furnished by the previously installed font. When a conventional font is found, any previous conventional font with the same style and family will be removed; distortable fonts with the same family will no longer be used to provide that style. @cindex default font families, Android @vindex sfnt-default-family-alist Emacs generally assumes the presence of font families named @samp{Monospace}, @samp{Monospace Serif}, @samp{Sans Serif}, and @samp{DejaVu Serif}. Since Android does not provide any fonts by these names, Emacs modifies requests for them to request one of a corresponding set of font families distributed with Android. To change either the set of font families subject to replacement, or that by which they are replaced, modify the variable @code{sfnt-default-family-alist}; then, restart Emacs. Bear in mind that this is usually unwarranted, with customizations to the default or @code{variable-pitch} faces better made through modifying their definitions (@pxref{Face Customization}). @node Android Troubleshooting @section Troubleshooting Startup Problems on Android @cindex troubleshooting, android @cindex emacs -Q, android @cindex emacs --debug-init, android Since Android has no command line, there is normally no way to specify command-line arguments when starting Emacs. This is very nasty when you make a mistake in your Emacs initialization files that prevents Emacs from starting up at all, as the system generally prohibits other programs from accessing Emacs's home directory. @xref{Initial Options}. However, Emacs can be started with the equivalent of either the option @code{--quick}, or @code{--debug-init} through a special preferences screen. Under Android 7.0 and later, this can be accessed through the Emacs ``app info'' page in the system settings program; on older systems, this is displayed as a separate icon on the desktop labeled ``Emacs options''. Consult the manufacturer of your device for more details, as how to do this varies by device. @cindex dumping, android The first time any given copy of Emacs starts on a device, it spends a while loading the preloaded Lisp files which normally come with Emacs. This produces a ``dump file'' (@pxref{Initial Options}) in the files directory, containing an identifier unique to that copy of Emacs. The next time that same copy of Emacs starts up, it simply loads the data contained in that dump file, greatly reducing start up time. If by some unforeseen circumstance the dump file is corrupted, Emacs can crash. If that happens, the dump file stored in the Emacs files directory can be erased through the preferences screen described above. @cindex accessing Emacs directories, Android Emacs supports an alternative method of rescuing broken Emacs installations on Android 4.4 and later: Emacs exports a ``documents provider'' which accesses the contents of Emacs's home directory, that can then be accessed by any file manager program. If you can find out how to open that documents provider in the file manager that comes with your device, you can rename, delete, or edit your initialization or dump files from there instead. @node Android Software @section Installing Extra Software on Android @cindex installing extra software on Android @cindex installing Unix software on Android An exceptionally limited set of Unix-like command line tools is distributed alongside default installations of Android. Several projects exist to augment this selection, providing options that range from improved reproductions of Unix command-line utilities to package repositories providing extensive collections of free GNU and Unix software. @uref{https://busybox.net, Busybox} provides Unix utilities and limited replicas of certain popular GNU programs such as @command{wget} in a single statically-linked Linux binary, which is capable of running under Android. @uref{https://termux.dev, Termux} provides a package manager based on the Debian project's @command{dpkg} system and a set of package repositories containing substantial amounts of free software for Unix systems, including compilers, debuggers, and runtimes for languages such as C, C++, Java, Python and Common Lisp. These packages are customarily installed from within a purpose-built terminal emulator application, but access is also granted to Emacs when it is built with the same application signing key, and its ``shared user ID'' is set to the same package name, as that of the terminal emulator program. The file @file{java/INSTALL} within the Emacs distribution illustrates how to build Emacs in this fashion. @uref{https://github.com/termux/termux-packages, termux-packages} provides the package definitions used by Termux to generate their package repositories, which may also be independently compiled for installation within Emacs's home directory. In addition to the projects mentioned above, statically linked binaries for most Linux kernel-based systems can also be run on Android.