Android

出自 ArchWiki

将您的手机通过 USB 数据线连接到电脑。确保此 USB 数据线具有数据线(并非所有数据线都有)。

在您的智能手机上,您应该看到充电图标。如果是这种情况,请转到您的通知栏,向下滚动直到您看到通知显示您的手机已连接在充电模式

点击通知,然后将其设置为文件传输模式MTP 或类似模式。

您现在应该看到您的手机被大多数桌面环境检测到。

同步

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

一体化

  • KDE Connect (kdeconnect) – 将您的 Android 设备与 KDE 或 Gnome 桌面集成(具有同步通知和剪贴板、多媒体控制以及文件/URL 共享功能)。

同步通知

  • a2lnAUR – 通过 LAN 提供通知同步,具有身份验证、加密等功能

传输文件

应用开发

构建 Android 应用的官方支持方式是使用 #Android Studio[1]

Android Studio

Android Studio 是基于 IntelliJ IDEA 的官方 Android 开发环境。它为开发和调试提供了集成的 Android 开发工具。

您可以使用 android-studioAUR 软件包安装它。对于 Beta 分支,安装 android-studio-betaAUR 软件包。对于 Canary 分支,安装 android-studio-canaryAUR 软件包。

Android Studio 在主目录中创建一个 .android 目录。要重置 Android Studio,可以删除此目录。

注意
  • 确保您正确设置 Java 环境,否则 android-studio 将无法启动。但是,在新版本中,Java 默认包含,因此无需这样做;请参阅#Java 开发工具包
  • 如果 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 StudioSDK 管理器sdkmanager 命令行工具(Android SDK 工具的一部分)安装。一些 Android SDK 软件包也可以作为 AUR 软件包使用,它们通常安装到 /opt/android-sdk/

必需的 SDK 软件包

Android SDK 软件包 SDK 风格路径 AUR 软件包 AUR 占位包 CLI 工具
命令行工具 tools android-sdk-cmdline-tools-latestAUR android-sdk-cmdline-tools-latest-dummyAUR apkanalyzer、avdmanager、lint、retrace、screenshot2、sdkmanager
SDK 构建工具 build-tools;version android-sdk-build-toolsAUR android-sdk-build-tools-dummyAUR aapt、aapt2、aidl、apksigner、bcc_compat、d8、dexdump、dx、lld、llvm-rs-cc、mainDexClases、split-select、zipalign
SDK 平台工具 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 平台 platforms;android-level 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 环境。请参阅使用 Java 9 运行 sdkmanager --list 失败

Android 模拟器

Android 模拟器作为 emulator SDK 软件包、android-emulatorAUR 软件包提供,并且还有一个用于它的占位软件包:android-emulator-dummyAUR

要运行 Android 模拟器,您需要 Intel 或 ARM 系统镜像。您可以通过 AUR、使用 sdkmanager 或使用 Android Studio 的 AVD 管理器安装它们。

如果使用 Wayland,请务必阅读 Wayland#Qt,因为模拟器可能会抱怨 Wayland。

AUR 中的其他 SDK 软件包

Android Support Library 现在可以从 Google 的 Maven 仓库在线获取。您也可以通过 extras;android;m2repository SDK 软件包离线安装它(也可作为 android-support-repositoryAUR 使用)。

使 /opt/android-sdk 组可写

本文或章节的事实准确性存在争议。

原因: 不要这样做。使用另一个软件包管理器 (Android SDK 管理器) 来管理 pacman 安装的文件是一个坏主意。这会使软件包管理器失效。(在 Talk:Android 中讨论)

AUR 软件包将 SDK 安装在 /opt/android-sdk/ 中。此目录具有 root 权限,因此请记住以 root 身份运行 sdk 管理器。如果您打算以普通用户身份使用它,请创建 android-sdk 用户组,添加您的用户。

# groupadd android-sdk
# gpasswd -a <user> android-sdk

设置访问控制列表以允许新创建的组的成员写入 android-sdk 文件夹。由于运行 sdkmanager 也会创建新文件,因此将 ACL 设置为默认 ACL。默认组条目中的 X 表示 “如果所有者(或任何其他人)可执行,则允许执行”

# setfacl -R -m g:android-sdk:rwx /opt/android-sdk
# setfacl -d -m g:android-sdk:rwX /opt/android-sdk  

重新登录或以 <user> 身份将您的终端登录到新创建的组

$ newgrp android-sdk

其他 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 构建说明。其他 Android 衍生系统(如 LineageOS)通常需要额外的步骤。

本文或章节已过时。

原因: 上游 envsetup.sh 脚本使用 python3,而不是本节中描述的 python2。(在 Talk:Android 中讨论)

所需软件包

注意: 在执行以下步骤之前,必须在 /etc/pacman.conf 中启用 multilib 软件仓库。

要构建 AOSP 13,您需要安装 TTF 字体(例如 ttf-dejavu)以及 aosp-develAUR 元软件包的依赖项。

此外,LineageOS(以及许多其他 Android 发行版,如 ArrowOS、PixelExperience 等)需要 lineageos-develAUR 元软件包的以下依赖项。

Java 开发工具包

所需的 JDK 版本取决于您正在构建的 Android 版本

  • 对于 Android 9 (Pie) 及更高版本,Java 已包含在 Android 源代码中,无需单独安装。
  • 对于 Android 7 和 8(Nougat 和 Oreo),需要 OpenJDK 8,它可以通过 jdk8-openjdk 软件包获得。
注意: 对于较旧的 Android 版本,其中未包含 Java,Java 预计位于 /usr/lib/jvm/java-version-openjdk-amd64 中。

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

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

设置构建环境

安装 repo 软件包。

创建一个目录来构建。

$ mkdir ~/android
$ cd ~/android
注意: 不要在您没有读/写访问权限的目录下构建。

下载源代码

这将克隆存储库。您只需在第一次构建 Android 时执行此操作,或者如果您想切换分支。

  • repo 有一个 -j 开关,其操作类似于 make 使用的开关。由于它控制并发下载的数量,因此您应该根据下游网络带宽调整该值。
  • 您需要指定一个分支 (分支列表) 以使用 -b 开关检出。如果您省略该开关,您将获得所谓的 master 分支
$ repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
$ repo sync -j4
注意: 为了进一步减少同步时间,您可以将 -c 开关与 repo 命令一起使用,如下所示
$ repo sync -j8 -c

-c 开关将仅同步清单中指定的分支,而清单又由 -b 开关指定的分支或存储库维护者设置的默认分支决定。

等待很长时间。仅未编译的源代码,以及用于跟踪它的 .repo.git 目录就非常大。截至 Android 10,至少需要 250 GB 的可用磁盘空间

注意: 如果您想稍后更新 Android 源代码的本地副本,只需进入构建目录,加载 Virtualenv,然后重新同步
$ repo sync

构建代码

这应该可以满足 AOSP 的需求

$ source build/envsetup.sh
$ lunch full-eng
$ make -j4

如果您在没有参数的情况下运行 lunch,它会询问您要创建哪个构建。将 -j 与一到两倍内核/线程数的数字一起使用。

构建需要很长时间。

注意
  • 确保您有足够的 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 镜像。

刷写

在某些情况下,您希望在将自定义 ROM 刷写到 Android 移动设备后返回到 stock Android。有关您设备的刷写说明,请使用 XDA 论坛

Fastboot

Fastboot(以及 ADB)包含在 android-tools 软件包中。

注意
  • 使用 fastboot 恢复固件可能非常棘手,但您可能需要浏览 XDA 开发者论坛以查找 stock 固件,这通常是一个 *.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 安装,但是,它不再维护:一个积极维护的分支可以作为 heimdall-grimler-gitAUR 安装。

刷写说明可以在 Heimdall 的 GitHub 仓库XDA 论坛上找到。

Odin (Virtualbox)

注意: 本节仅涵盖准备工作,包括刷写说明。搜索 XDA 开发者论坛以查找特定设备的刷写说明。例如,Samsung Galaxy S4

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

Arch Linux(主机)准备

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

Windows(虚拟机)准备

  1. 安装 三星驱动程序
  2. 安装 Odin
  3. 为您的智能手机型号下载所需的 三星固件 (Android)

检查配置是否正常工作

  1. 将您的设备置于下载模式并连接到您的 Linux 机器。
  2. 在虚拟机工具栏中,选择设备 > USB > ...Samsung... 设备
  3. 打开 Odin。名为 Message 的白色框(左下角的一个大框)应打印类似于以下内容的一行
<ID:0/003> Added!!

这意味着您的设备对 Odin 和 Windows 操作系统可见,并且可以进行刷写。

在 Arch Linux 上运行 Android 应用

有几个项目和方法支持在 Arch Linux(或其他发行版)上运行 Android。如下所列

  • 基于容器的解决方案往往是最流行的。它们是您可以在非 Android Linux 内核上本地运行 Android 应用的最接近方式。它们往往与您的系统集成得最好,并且具有良好的性能。值得注意的有
    • Waydroid 是 Anbox 的一个分支,并且越来越受欢迎。它性能更高,因为它更接近硬件运行。它基于更新的 LineageOS 17.1 (Android 10) 基础镜像,可以选择安装 Google Play 商店和其他 Open Gapps。除了在独立窗口中运行应用程序外,它还可以运行完整的 Android UI。
  • 还有一些 Chromium 扩展程序可以运行安卓应用
  • 当然,也可以运行完整的安卓模拟器。这样做的一个优点是您可以在 x86 上运行 arm 应用。缺点是性能较差。例如:
  • 还有一些基于 Android 的 x86_64 兼容操作系统镜像,可以在常见的虚拟机(包括带有 VirtIO GPU 的 KVM)或裸机上运行。
    • Bliss OS 是一个基于 Android 的开源操作系统,集成了许多优化和功能,预装了 KernelSU root 权限。还包括 ARM 模拟。
    • 对于旧版本的 Android,请参阅 Android-x86

故障排除

Android Studio:Android 虚拟机设备显示“加载失败”。

请确保您已导出变量 ANDROID_HOME,如 #Android Studio 中所述。

Android Studio:“创建 SD 卡失败”

如果您尝试在 x86_64 Arch 下运行 AVD(Android 虚拟机设备)并收到上述错误,请从 multilib 仓库安装 lib32-gcc-libs 软件包。

Eclipse:调试期间“找不到源文件”

很可能是调试器想要步入 Java 代码。由于 Android 的源代码不包含在 Android SDK 中,这会导致错误。最好的解决方案是使用步进过滤器来避免跳入 Java 源代码。步进过滤器默认未激活。要激活它们:窗口 > 首选项 > Java > 调试 > 步进过滤。考虑选择全部。如果合适,您可以添加 android.* 包。请参阅 使用步进过滤器

ValueError: unsupported pickle protocol

一个修复方法是执行

$ rm ~/.repopickle_.gitconfig

如果这不起作用,请尝试这个

$ find /path/to/android-root -name .repopickle_config -delete

libGL error: failed to load driver: swrast OR 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 用户指南

可以通过使用 env 命令来修复 .desktop 文件,在前缀 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),但如果您的计算机性能足够强大,您可以简单地使用软件来渲染图形。为此,请转到工具 > Android > AVD 管理器,编辑 AVD(单击铅笔图标),然后在模拟性能 > 图形中选择软件 - GLES 2.0

Android 模拟器:在 xfwm4 中没有键盘输入

在 xfwm4 中,位于模拟器右侧的垂直工具栏按钮窗口会从模拟器获取焦点并消耗键盘事件。(错误报告

您可以使用 [2] 中描述的解决方法

  1. 打开 xfwm4 设置。
  2. 切换到“焦点”选项卡。
  3. 将焦点模型更改为“焦点跟随鼠标”。
  4. 禁用下面的当窗口接收焦点时自动提升窗口选项。

Android 模拟器:在 WM 平铺模式下使用时窗口抖动和闪烁

当使用平铺窗口管理器(如 dwm)时,Android 模拟器会抖动和闪烁。您可以使用 krohnkite issue 72 中描述的解决方法(窗口浮动由 dwm 中的 Alt+f 触发)。

Android 模拟器:段错误 (核心已转储)

当使用 Nouveau 驱动程序时,请尝试禁用 GPU 硬件加速。

在某些设备中,这只能通过编辑 $HOME/.avd/device_name.avd/config.ini 来完成。[3]

  1. 设置 hw.gpu.enabled=no
  2. 设置 hw.gpu.mode=off

Android 模拟器:无法启动 / qemu-system:地址解析失败

存在一个问题,在 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:侧载连接失败:设备权限不足

如果您收到错误

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