跳转至内容

Android

来自 ArchWiki

使用适配你设备的 USB 数据线将手机连接到电脑。请确保该 USB 线支持数据传输(并非所有线都支持)。

在智能手机上,你应该会看到充电图标。如果有,请下拉通知栏,滚动到底部,找到提示手机正处于“充电模式”的通知。

点击该通知,然后将其设置为“文件传输模式”、“MTP”或类似选项。

现在,大多数桌面环境应该都能识别到你的手机。

同步

有多种应用程序可以用来传输文件、同步通知等。

一体化解决方案

  • KDE Connect (kdeconnect) – 将你的 Android 设备与 KDE 或 GNOME 桌面集成(支持同步通知和剪贴板、多媒体控制以及文件/网址共享)。

通知同步

  • a2lnAUR – 提供基于局域网的通知同步,支持身份验证、加密等。

传输文件

应用开发

官方支持的 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#fastboote2fsdroidmke2fs.android,以及 mkbootimgext2simg

  • 由于 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,这是一个基于 overlayfsFUSE 软件包。这将允许访问只读的 /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 软件包获取。
注意 对于未包含 Java 的旧 Android 版本,Java 需位于 /usr/lib/jvm/java-版本-openjdk-amd64

设置 JAVA_HOME 以避免此要求并匹配 Arch Linux 的安装路径。示例:

$ export JAVA_HOME=/usr/lib/jvm/java-version-openjdk
此更改仅在当前终端会话中有效。

搭建构建环境

安装 repo 软件包。

创建一个构建目录。

$ 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 的剩余磁盘空间。

注意 如果日后想要更新本地的 Android 源代码副本,只需进入构建目录,加载虚拟环境并重新同步即可。
$ 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 -j16make -j32 之间构建速度最快。

测试构建结果

构建完成后,运行/测试最终的镜像。

$ 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 工具刷机。替代方案是使用 HeimdallOdin(通过 Windows 和 VirtualBox)。

samloader

若要下载原厂三星固件,可以使用一个平台无关的脚本 samloader

Heimdall

heimdall 是一套跨平台的开源工具,用于将固件(ROM)刷入三星移动设备,它是 Odin 的一种替代方案。

刷机指南可在 Heimdall 的 GitHub 仓库XDA 论坛上找到。

Odin (Virtualbox)

注意 本节仅涵盖准备工作,不包括刷机指南。请搜索 XDA 开发者论坛查找特定设备的刷机指南。例如,三星 Galaxy S4

也可以使用 OdinVirtualBox 内部恢复三星设备的 固件 (Android)

Arch Linux (宿主机) 准备工作

  1. 安装 VirtualBox 及其 扩展包增强功能 (Guest additions)
  2. 在 VirtualBox 中,将你偏好且与 Odin 兼容的 Windows 操作系统(包含 VirtualBox 增强功能)安装到虚拟硬盘中。
  3. 打开 Windows 操作系统的 VirtualBox 设置,导航至 USB,然后勾选(或确保已勾选)启用 USB 2.0 (EHCI) 控制器
  4. 在运行中的 Windows 虚拟机菜单栏中,点击 设备 > USB 设备,然后从列表中点击连接到你计算机的 USB 三星移动设备。

Windows (虚拟机) 准备工作

  1. 安装 三星驱动程序
  2. 安装 Odin
  3. 下载适用于你手机型号的 三星固件 (Android)

检查配置是否正常工作

  1. 将你的设备进入下载模式并连接到 Linux 机器。
  2. 在虚拟机工具栏中,选择 设备 > USB > ...三星... 设备。
  3. 打开 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 应用:
  • 当然,运行一个完整的 Android 模拟器也是可以的。其优点是可以在 x86 上运行 ARM 应用,缺点是性能较差。示例有:
  • 还有基于 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

参考:Android Studio 用户指南

对于 .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] 中描述的变通方案:

  1. 打开 xfwm4 设置。
  2. 切换到 Focus(焦点)标签页。
  3. 将 Focus Model(焦点模型)更改为“Focus follow mouse”(鼠标跟随焦点)。
  4. 禁用下方的 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]

  1. 设置 hw.gpu.enabled=no
  2. 设置 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 中有通用参数。

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.