Android
使用适配你设备的 USB 数据线将手机连接到电脑。请确保该 USB 线支持数据传输(并非所有线都支持)。
在智能手机上,你应该会看到充电图标。如果有,请下拉通知栏,滚动到底部,找到提示手机正处于“充电模式”的通知。
点击该通知,然后将其设置为“文件传输模式”、“MTP”或类似选项。
现在,大多数桌面环境应该都能识别到你的手机。
同步
有多种应用程序可以用来传输文件、同步通知等。
一体化解决方案
- KDE Connect (kdeconnect) – 将你的 Android 设备与 KDE 或 GNOME 桌面集成(支持同步通知和剪贴板、多媒体控制以及文件/网址共享)。
通知同步
- a2lnAUR – 提供基于局域网的通知同步,支持身份验证、加密等。
传输文件
- USB 线缆
- 现代 Android 设备使用媒体传输协议 (MTP)。
- 旧设备使用USB 大容量存储。
- Android 调试桥
- 特殊 U 盘 / 带适配器的普通 U 盘。
- 蓝牙
- 具有 Android 对应端的 Arch Linux 软件
应用开发
官方支持的 Android 应用构建方式是使用 #Android Studio。[1]
Android Studio
Android Studio 是基于 IntelliJ IDEA 的官方 Android 开发环境。它提供了用于开发和调试的集成化 Android 开发工具。
你可以通过 android-studioAUR 软件包进行安装。如需测试版,请安装 android-studio-betaAUR 软件包;如需开发版(Canary),请安装 android-studio-canaryAUR 软件包。
Android Studio 会在用户主目录下创建一个 .android 目录。如需重置 Android Studio,可以删除此目录。
- 请确保正确设置 Java 环境,否则 android-studio 将无法启动。不过,较新版本已默认包含 Java,因此不必手动配置;请参阅 #Java Development Kit。
- 如果 Android Studio 显示为空白窗口,请尝试导出
_JAVA_AWT_WM_NONREPARENTING=1,详情请见问题 #57675。
Android Studio 设置向导会安装所需的 #SDK 软件包,并将 SDK 默认放置在 ~/Android/Sdk 中。
若要从命令行构建应用(例如使用 ./gradlew assembleDebug),请将 ANDROID_HOME 环境变量设置为你的 SDK 位置。
Android Studio 自 2024.2 版本起对 Wayland 提供实验性支持。你可以通过前往“菜单 > 帮助 > 编辑自定义 VM 选项”,并添加 -Dawt.toolkit.name=WLToolkit 参数来启用它。
SDK 软件包
Android SDK 软件包可以直接使用 #Android Studio 中的 SDK 管理器或 sdkmanager 命令行工具(属于 Android SDK 工具的一部分)从上游安装。部分 Android SDK 软件包也作为 AUR 软件包提供,它们通常安装到 /opt/android-sdk/。
所需的 SDK 软件包包括:
| Android SDK 软件包 | SDK 路径 | AUR 软件包 | AUR 虚拟包 | 命令行工具 |
|---|---|---|---|---|
| 命令行工具 (Command-Line Tools) | tools | android-sdk-cmdline-tools-latestAUR | android-sdk-cmdline-tools-latest-dummyAUR | apkanalyzer, avdmanager, lint, retrace, screenshot2, sdkmanager |
| SDK 构建工具 (SDK Build-Tools) | build-tools;版本 | android-sdk-build-toolsAUR | android-sdk-build-tools-dummyAUR | aapt, aapt2, aidl, apksigner, bcc_compat, d8, dexdump, dx, lld, llvm-rs-cc, mainDexClasses, split-select, zipalign |
| SDK 平台工具 (SDK Platform-Tools) | platform-tools | android-sdk-platform-toolsAUR | android-sdk-platform-tools-dummyAUR | adb, dmtracedump, e2fsdroid, etc1tool, #fastboot, hprof-conv, make_f2fs, make_f2fs_casefold, mke2fs, sload_f2fs, sqlite3, systrace |
| SDK 平台 (SDK Platform) | platforms;android-级别 | android-platformAUR, 旧版本 | android-platform-dummyAUR (不必要) |
android-tools 软件包提供了来自 SDK 平台工具的 adb、#fastboot、e2fsdroid 和 mke2fs.android,以及 mkbootimg 和 ext2simg。
- 由于 Android SDK 包含 32 位二进制文件,你必须启用 multilib 软件库。否则,你会收到
error: target not found: lib32-*错误信息。 - 如果你选择直接从上游安装 SDK 软件包,请安装“AUR 虚拟包”列中的 AUR 软件包以拉取所需的依赖项。
- 如果你在运行
sdkmanager时遇到java.lang.NoClassDefFoundError异常,请临时使用 OpenJDK 8 的 JRE,方法是安装 jre8-openjdk 并切换 Java 环境。参见 Failed to run sdkmanager --list with Java 9。
Android 模拟器
Android 模拟器以 emulator SDK 软件包、android-emulatorAUR 软件包的形式提供,也有对应的虚拟包:android-emulator-dummyAUR。
要运行 Android 模拟器,你需要一个 Intel 或 ARM 系统镜像。你可以通过 AUR、使用 sdkmanager 或 Android Studio 的 AVD 管理器来安装它们。
如果使用 Wayland,请务必阅读 Wayland#Qt,因为模拟器可能会提示关于 Wayland 的问题。
AUR 中的其他 SDK 软件包
Android 支持库现可通过 Google 的 Maven 仓库在线获取。你也可以通过 extras;android;m2repository SDK 软件包离线安装(也可作为 android-support-repositoryAUR 使用)。
使用写时复制(CoW)将 /opt/android-sdk 挂载为只读
AUR 软件包将 SDK 安装在 /opt/android-sdk/。该目录属于 root 用户权限,因此要让普通用户使用,你应该准备另一个具有写权限的目录。
为此,你可以使用 fuse-overlayfs,这是一个基于 overlayfs 的 FUSE 软件包。这将允许访问只读的 /opt/android-sdk/ 目录,并能在无需复制数据的情况下写入修改(写时复制概念)。
首先,创建用于托管 overlay 的目录。
$ LOWER=/opt/android-sdk $ UPPER="$HOME/.local/android/.sdk/upper" $ WORK="$HOME/.local/android/.sdk/work" $ ANDROID_HOME="$HOME/.local/android/sdk" $ mkdir -p "$UPPER" "$WORK" "$ANDROID_HOME"
然后挂载你的 overlay 并导出 Android 主变量。
$ fuse-overlayfs -o squash_to_uid=$(id -u),squash_to_gid=$(id -g),lowerdir=$LOWER,upperdir=$UPPER,workdir=$WORK $ANDROID_HOME $ export ANDROID_HOME
现在你可以使用任何 Android 工具(例如 `sdk-manager`)配合你的写时复制设置了。
你可以像卸载其他 FUSE 文件系统一样卸载它。
$ fusermount -u $ANDROID_HOME
其他 IDE
Android Studio 是基于 IntelliJ IDEA 的官方 Android 开发环境。或者,你也可以使用带有 NBAndroid-V2 的 Netbeans。以下说明各方案。
Netbeans
如果你更喜欢使用 Netbeans 作为 IDE 并开发 Android 应用,请使用 NBAndroid-V2。
安装 android-sdkAUR 软件包并按照 NBANDROID README 中的说明操作。
Vim / Neovim
可以使用 (Neo)vim 像 IDE 一样编写 Android 和 iOS 的 flutter 应用。使用 Vim 插件管理器安装 coc。同时安装 coc-flutter 扩展以实现自动补全(类似于 Android Studio)并将代码加载到 Android 模拟器中。
Emacs
若要使用 Emacs 开发移动端 flutter 应用,按照 flutter.dev 上的官方指南,安装 lsp-dart。
其他工具
Marvin
Marvin 是一款帮助初学者搭建 Android 开发环境的工具。安装 marvin_dscAUR 可以帮你设置 JDK、Android SDK、IDE 和 AVD。
编译
请注意,这些说明基于官方 AOSP 构建指南。LineageOS 等其他衍生系统通常需要额外步骤。
所需软件包
/etc/pacman.conf 中启用 multilib 仓库。构建 AOSP 13 需要安装 TTF 字体(例如 ttf-dejavu)以及 aosp-develAUR 元软件包的依赖项。
此外,LineageOS(以及 ArrowOS、PixelExperience 等许多 Android 发行版)还需要 lineageos-develAUR 元软件包的依赖项。
Java 开发工具包
所需的 JDK 版本取决于你正在构建的 Android 版本。
- 对于 Android 9 (Pie) 及以上版本,Java 已包含在 Android 源码中,无需单独安装。
- 对于 Android 7 和 8 (Nougat 和 Oreo),需要 OpenJDK 8,可通过 jdk8-openjdk 软件包获取。
/usr/lib/jvm/java-版本-openjdk-amd64。设置 JAVA_HOME 以避免此要求并匹配 Arch Linux 的安装路径。示例:
$ export JAVA_HOME=/usr/lib/jvm/java-version-openjdk此更改仅在当前终端会话中有效。
搭建构建环境
创建一个构建目录。
$ mkdir ~/android $ cd ~/android
下载源代码
这将克隆仓库。你仅在首次构建 Android 时,或者需要切换分支时才需要执行此操作。
repo拥有一个与make中类似的-j开关。由于它控制并发下载数量,你应该根据下游网络带宽调整该值。
- 你需要指定一个分支(分支列表),并使用
-b开关检出。如果省略该开关,你将得到所谓的主分支 (master branch)。
$ repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest $ repo sync -j4
repo 命令使用 -c 开关,如下所示:$ repo sync -j8 -c
-c 开关将仅同步清单中指定的分支,该分支由 -b 开关确定,若未指定则默认为仓库维护者设定的分支。
同步需要很长时间。仅未编译的源代码,连同用于追踪的 .repo 和 .git 目录,体积就非常巨大。截至 Android 10,要求至少 250 GB 的剩余磁盘空间。
$ repo sync
构建代码
对于 AOSP,这应该就是你需要执行的操作:
$ source build/envsetup.sh $ lunch full-eng $ make -j4
如果你在没有参数的情况下运行 lunch,它会询问你想创建什么构建。使用 -j 并带上 CPU 核心数/线程数 1 到 2 倍的数值。
构建过程耗时极长。
- 请确保你有足够的 RAM。Android 会大量使用
/tmp目录。默认情况下,/tmp的大小是 RAM 的一半。如果空间耗尽,构建将失败。建议使用 4 GiB 或更多的 RAM。如果/tmp不够大,你可以增加其大小。确保你有足够的 RAM 和交换空间。或者,你也可以完全从 fstab 中移除 tmpfs。 - 摘自 Android 构建与运行指南:
- GNU make 可以通过
-jN参数处理并行任务,通常 N 的取值为所用计算机硬件线程数的 1 到 2 倍。例如,在一台双 E5520 机器(2 个 CPU,每个 CPU 4 核,每核 2 线程)上,make -j16到make -j32之间构建速度最快。
- GNU make 可以通过
测试构建结果
构建完成后,运行/测试最终的镜像。
$ emulator
创建可刷入的镜像
要创建可刷入的镜像,需要:
make -j8 updatepackage
这将会在 out/target/product/hammerhead(hammerhead 为设备名称)下创建一个可刷入的 zip 镜像。
刷写
在某些情况下,如果你在 Android 设备上刷入了第三方 ROM,可能想要恢复到出厂 Android 系统。关于你设备的刷机说明,请查看 XDA 论坛。
Fastboot
Fastboot(以及 adb)包含在 android-tools 软件包中。
- 使用
fastboot恢复固件可能比较棘手,但你可以浏览 XDA 开发者论坛寻找官方固件,通常是一个*.zip文件,内部包含固件文件和flash-all.sh脚本。例如,Google Nexus 固件包含flash-all.sh脚本;另一个例子是 OnePlus One - XDA 帖子,那里可以找到带有flash-all.sh脚本的固件。 - 如果你遇到
no permissions错误,或者执行时卡在< waiting for any device >,你需要以 root 用户身份运行fastboot。或者,你可以安装 android-udev 或 AUR 软件包 android-udev-gitAUR,然后重新连接你的设备。
三星设备
三星设备无法使用 Fastboot 工具刷机。替代方案是使用 Heimdall 或 Odin(通过 Windows 和 VirtualBox)。
samloader
若要下载原厂三星固件,可以使用一个平台无关的脚本 samloader。
Heimdall
heimdall 是一套跨平台的开源工具,用于将固件(ROM)刷入三星移动设备,它是 Odin 的一种替代方案。
刷机指南可在 Heimdall 的 GitHub 仓库或 XDA 论坛上找到。
Odin (Virtualbox)
也可以使用 Odin 在 VirtualBox 内部恢复三星设备的 固件 (Android)。
Arch Linux (宿主机) 准备工作
- 安装 VirtualBox 及其 扩展包和 增强功能 (Guest additions)。
- 在 VirtualBox 中,将你偏好且与 Odin 兼容的 Windows 操作系统(包含 VirtualBox 增强功能)安装到虚拟硬盘中。
- 打开 Windows 操作系统的 VirtualBox 设置,导航至 USB,然后勾选(或确保已勾选)启用 USB 2.0 (EHCI) 控制器。
- 在运行中的 Windows 虚拟机菜单栏中,点击 设备 > USB 设备,然后从列表中点击连接到你计算机的 USB 三星移动设备。
Windows (虚拟机) 准备工作
- 安装 三星驱动程序。
- 安装 Odin。
- 下载适用于你手机型号的 三星固件 (Android)。
检查配置是否正常工作
- 将你的设备进入下载模式并连接到 Linux 机器。
- 在虚拟机工具栏中,选择 设备 > USB > ...三星... 设备。
- 打开 Odin。左下角名为 Message 的白色大框应该会打印类似以下的一行:
<ID:0/003> Added!!
这意味着 Odin 和 Windows 操作系统已识别到设备,可以进行刷机。
在 Arch Linux 上运行 Android 应用
有多种项目和方法支持在 Arch Linux(或其他发行版)上运行 Android。如下所示:
- 基于容器 (Container-based) 的解决方案往往是最受欢迎的。它们是在非 Android Linux 内核上原生运行 Android 应用最接近的方式。它们往往与系统集成度最高,性能也很好。主要包括:
- Waydroid 是 Anbox 的分支,正日益普及。它的性能更好,因为它运行得更接近硬件。它基于较新的 LineageOS 20.0 (Android 13) 镜像,并提供安装 Google Play 商店和其他 Open Gapps 的选项。除了在独立窗口中运行应用外,它还可以运行完整的 Android UI。
- 也有一些 Chromium 扩展可以运行 Android 应用:
- Arc Welder 是 Google 用来测试应用在 Chrome OS 上运行情况的扩展,但现已停止更新。
- ARChon 是一款已不再维护的开源扩展,用于在 Chromium 内核浏览器上运行 Android 应用。截至 2023 年 7 月,示例应用无法工作,因为 “旧版 Chrome 应用在 2022 年后将无法在 Linux 设备上打开”。
- 当然,运行一个完整的 Android 模拟器也是可以的。其优点是可以在 x86 上运行 ARM 应用,缺点是性能较差。示例有:
- Android Studio 内置的模拟器,如前文所述。
- Genymotion 是一款付费的 Android 模拟/测试套件。
- 还有基于 Android 的 x86_64 兼容 OS 镜像,它们可以在普通虚拟机(包括带有 VirtIO GPU 的 KVM)或物理机上运行。
- Bliss OS 是一款基于 Android 的开源操作系统,结合了许多优化和功能,预置了 KernelSU。同时也包含 ARM 模拟功能。
- 对于较旧的 Android 版本,请参见 Android-x86。
故障排除
Android Studio: Android 虚拟设备提示“failed to load”(加载失败)。
确保你已如 #Android Studio 中所述导出了 ANDROID_HOME 变量。
Android Studio: 'failed to create the SD card'(无法创建 SD 卡)
如果你尝试在 x86_64 Arch 上运行 AVD (Android 虚拟设备) 并收到上述错误,请从 multilib 仓库安装 lib32-gcc-libs 软件包。
Eclipse: 调试时出现“Source not found”(找不到源)
很可能是调试器想要单步进入 Java 代码。由于 Android 源码不随 Android SDK 提供,这会导致错误。最佳解决方案是使用步进过滤器 (step filters) 以避免跳转到 Java 源码中。步进过滤器默认未激活。要激活它们:Window > Preferences > Java > Debug > Step Filtering。考虑将它们全部勾选。如果合适,你可以添加 android.* 包。参见 使用步进过滤器。
ValueError: unsupported pickle protocol(不支持的 pickle 协议)
一种修复方法是执行:
$ rm ~/.repopickle_.gitconfig
如果不起作用,请尝试:
$ find /path/to/android-root -name .repopickle_config -delete
libGL error: failed to load driver: swrast(加载驱动失败)或者 AVD 无法加载且无报错信息
有时,加载 AVD 会导致显示类似上述的错误信息,或者加载过程看起来已完成但未加载 AVD 且无报错信息。
AVD 加载了错误版本的 libstdc++,你可以从 ~/.android-sdk/emulator/lib64(64 位)或 ~/.android-sdk/emulator/lib(32 位)中删除 libstdc++ 文件夹,例如:
$ rm -r ~/.android-sdk/emulator/lib64/libstdc++
注意,在 Android Studio 3.0 之前的版本中,该目录位于不同的位置。
$ rm -r ~/Android/Sdk/emulator/lib64/libstdc++
或者,你可以在 ~/.profile 中设置并导出 ANDROID_EMULATOR_USE_SYSTEM_LIBS:
export ANDROID_EMULATOR_USE_SYSTEM_LIBS=1
对于 .desktop 文件,可以通过使用 env 命令在 Exec 行前添加来修复,参见 桌面条目#修改环境变量。
env ANDROID_EMULATOR_USE_SYSTEM_LIBS=1
sh: glxinfo: command not found(找不到命令)
完整错误如下:
Cannot launch AVD in emulator. Output: sh: glxinfo: command not found sh: glxinfo: command not found libGL error: unable to load driver: swrast_dri.so libGL error: failed to load driver: swrast X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 154 (GLX) Minor opcode of failed request: 24 (X_GLXCreateNewContext) Value in failed request: 0x0 Serial number of failed request: 32 Current serial number in output stream: 33 QObject::~QObject: Timers cannot be stopped from another thread
你可以尝试安装 glxinfo (mesa-utils),但如果你的电脑性能足够,可以直接使用软件渲染图形。为此,进入 Tools > Android > AVD Manager,编辑 AVD(点击铅笔图标),然后为 Emulated Performance > Graphics 选择 Software - GLES 2.0。
Android 模拟器:在 xfwm4 中无键盘输入
在 xfwm4 中,模拟器右侧的垂直工具栏按钮窗口会抢占焦点并消耗键盘事件。(错误报告)
你可以使用 [2] 中描述的变通方案:
- 打开 xfwm4 设置。
- 切换到 Focus(焦点)标签页。
- 将 Focus Model(焦点模型)更改为“Focus follow mouse”(鼠标跟随焦点)。
- 禁用下方的 Automatically raise windows when they receive focus(窗口获取焦点时自动置顶)选项。
Android 模拟器:在平铺窗口管理器模式下窗口抖动和闪烁
当使用像 dwm 这样的平铺窗口管理器时,Android 模拟器会抖动和闪烁。你可以使用 krohnkite 问题 72 中描述的变通方案(在 dwm 中使用 Alt+f 设置窗口浮动)。
Android 模拟器:段错误 (Segmentation fault)
使用 Nouveau 驱动时,尝试禁用 GPU 硬件加速。
在某些设备上,只能通过编辑 $HOME/.avd/设备名.avd/config.ini 来实现。[3]
- 设置
hw.gpu.enabled=no - 设置
hw.gpu.mode=off
Android 模拟器:无法启动 / qemu-system: address resolution failed(地址解析失败)
在 Android Studio 启动虚拟设备后没有模拟器窗口出现。如果遇到这种情况,请从控制台启动模拟器并检查其输出:
$ emulator -avd $(emulator -list-avds)
如果某一行出现了类似以下的内容:
qemu-system-x86_64 : address resolution failed for ::1:46189: Name or service not known
你可以尝试禁用 IPv6。
$ sysctl net.ipv6.conf.all.disable_ipv6=1
如果这解决了问题且虚拟设备在 Android Studio 中出现,你可以考虑永久更改设置。
/etc/sysctl.d/99-sysctl.conf
net.ipv6.conf.all.disable_ipv6=1
Android 模拟器:模拟器异常终止,退出代码 134
如果运行 Wayland,像 The emulator process for AVD Pixel_4_API_33 has terminated 这样的图形错误可以通过使用 QT_QPA_PLATFORM=xcb 强制使用 X11 来规避。
adb: sideload connection failed: insufficient permissions for device(设备权限不足)
如果你收到以下错误:
adb: sideload connection failed: insufficient permissions for device See [https://developer.android.com.cn/tools/device.html] for more information
或者
adb: trying pre-KitKat sideload method... adb: pre-KitKat sideload connection failed: insufficient permissions for device See [https://developer.android.com.cn/tools/device.html] for more information
你可以尝试重启 adb 服务器来解决:
$ adb kill-server # adb start-server
或者,确保安装了 Android udev 规则。参见 #Fastboot。
License not accepted(未接受许可协议)
由于 AUR 中的 SDK 软件包安装在 /opt/android-sdk,而该目录属于 root,因此接受许可协议的 sdkmanager --licenses 命令也必须以 root 身份运行。如果该脚本不是以 root 运行,接受许可协议的操作会静默失败。
你可以通过检查 /opt/android-sdk/licenses 目录下是否存在相应文件来确认协议已成功接受。
构建 Lineageos 报错:module manifest_input.classifier-service does not exist
此错误出现在在运行 breakfast 之前需要填充 vendor 目录的设备上,如警告部分所述。提取专有二进制文件 (blobs) 后继续。
构建 Lineageos common.mk 报错:missing libthermalclient(或其他库文件丢失)
(hardware/qcom/sm7250/display/composer/../common.mk: error: "vendor.qti.hardware.display.composer-service (EXECUTABLES android-arm64) missing libthermalclient (SHARED_LIBRARIES andr oid-arm64)" 如果这是故意的,可以在环境中设置 ALLOW_MISSING_DEPENDENCIES=true,但这可能会将真正的问题推迟到构建后期。)
你要么没有提取专有二进制文件,要么从中提取的镜像本身不完整,或者是提取脚本工作不正常。尝试寻找其他镜像提取二进制文件,使用其他提取脚本,或从 themuppets 获取。
构建 Lineageos 报错:AssertionError: Failed to execute: out/soong/host/linux-x86/bin/mke2fs -O ^has_journal...
e2fsprogs 在 1.47.0 版本中禁用了 orphan_file,因此要么必须降级以使旧命令成功,要么应从构建机器的 /etc/mke2fs.conf 中删除 orphan_file 选项,因为捆绑的 mke2fs 会读取宿主机的配置文件。
降级方式:Arch Linux 归档中的 e2fsprogs 1.46.0
构建 Lineageos 报错:ExternalError: Failed to run command '['brillo_update_payload
如果你往上翻一点,会看到:Sum of sizes in google_dynamic_partitions_partition_list is 4883337216, which is greater than google_dynamic_partitions_size (4873781248) [0224/122117.280262:FATAL:generate_delta_main.cc(619)] Check failed: payload_config.target.ValidateDynamicPartitionMetadata()。
一些用户通过设置选项 export WITH_GMS=true 成功解决,GMS 即 Google Mobile Services,通常称为 GApps。此选项可能不适合你的需求。有些人强烈不建议将此选项用作解决该错误的方法。
问题似乎源于某些变更导致文件体积增大。为了给分区留出更多空间,建议减少参数 BOARD_SYSTEMIMAGE_PARTITION_RESERVED_SIZE := 17523507,减少的量至少相当于错误中数值的差额。此选项设置在 makefile 中,例如在 lineage/device/google/blueline/BoardConfigLineage.mk,如果那里没有,则在它包含的文件中,例如 Google 设备在 device/google/redbull/BoardConfigLineage.mk 中有通用参数。