Android

来自 ArchWiki
(重定向自 Android Studio

使用适用于您设备的 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 在 home 目录下创建一个 .android 目录。要重置 Android Studio,可以删除此目录。

注意
  • 确保您正确设置 Java 环境,否则 android-studio 将无法启动。但是,在较新版本中,Java 默认包含在内,因此无需这样做;请参阅#Java 开发工具包
  • 如果 Android Studio 显示为空白窗口,请尝试导出 _JAVA_AWT_WM_NONREPARENTING=1,请参阅issue #57675

Android Studio 设置向导会安装所需的 #SDK 软件包,并将 SDK 默认放置在 ~/Android/Sdk 中。

要从命令行构建应用(例如,使用 ./gradlew assembleDebug),请将 ANDROID_HOME 环境变量 设置为您的 SDK 位置。

Android Studio 自 2024.2 版本以来 具有实验性的 Wayland 支持,您可以通过转到 Menu -> Help -> Edit Custom VM Options 并添加 -Dawt.toolkit.name=WLToolkit 作为参数来启用它。

SDK 软件包

Android SDK 软件包可以直接从上游安装,使用 #Android StudioSDK 管理器sdkmanager 命令行工具(Android SDK 工具的一部分)。一些 Android SDK 软件包也可以作为 AUR 软件包使用,它们通常安装到 /opt/android-sdk/

所需的 SDK 软件包

Android SDK 软件包 SDK 风格路径 AUR 软件包 AUR dummy CLI 工具
命令行工具 tools android-sdk-cmdline-tools-latestAUR android-sdk-cmdline-tools-latest-dummyAUR apkanalyzer, avdmanager, lint, retrace, screenshot2, sdkmanager
SDK 构建工具 build-tools;版本号 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-级别 android-platformAUR, 旧版本 android-platform-dummyAUR (非必需)

android-tools 软件包提供了来自 SDK 平台工具的 adb#fastboote2fsdroidmke2fs.android,以及 mkbootimgext2simg

注意
  • 由于 Android SDK 包含 32 位二进制文件,因此您必须启用 multilib 仓库。否则,您将收到 error: target not found: lib32-* 错误消息。
  • 如果您选择直接从上游安装 SDK 软件包,请安装 AUR dummy 列的 AUR 软件包以拉取所需的依赖项。
  • 如果您在尝试运行 sdkmanager 时收到 java.lang.NoClassDefFoundError 异常,请临时使用 OpenJDK 8 的 JRE,方法是安装 jre8-openjdk 软件包并切换 Java 环境。请参阅 Failed to run sdkmanager --list with Java 9

Android Emulator

Android Emulatoremulator SDK 软件包、android-emulatorAUR 软件包的形式提供,并且还有一个用于它的 dummy 软件包:android-emulator-dummyAUR

要运行 Android Emulator,您需要 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 开关。如果您忽略此开关,您将获得所谓的主分支
$ 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 的可用磁盘空间 required

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

构建代码

这应该可以满足您对 AOSP 的需求

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

如果您在不带参数的情况下运行 lunch,它将询问您要创建哪个构建。使用 -j,数字介于内核/线程数的 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 镜像,可以刷写。

刷写

在某些情况下,您希望在将自定义 ROM 刷入 Android 移动设备后返回到原厂 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 安装,但是,它已不再维护:一个积极维护的分支可以作为 heimdall-grimler-gitAUR 安装。

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

Odin (Virtualbox)

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

也可以使用 Odin 在三星设备上恢复 固件 (Android),但在 VirtualBox 内部。

Arch Linux(主机)准备

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

Windows(虚拟机)准备

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

检查配置是否正常工作

  1. 将您的设备置于下载模式并连接到您的 Linux 机器。
  2. 在虚拟机工具栏中,选择设备 > USB > ...Samsung... 设备。
  3. 打开 Odin。“消息”的白色框(左下角的大框)应打印类似于以下内容的一行
<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 扩展程序可以运行 android 应用
  • 当然,也可以运行完整的 android 模拟器。这样做的一个优点是您可以在 x86 上运行 arm 应用程序。缺点是性能较差。示例包括
  • 还有基于 Android 的 x86_64 兼容操作系统镜像,可以在常见的虚拟机(包括带有 VirtIO GPU 的 KVM)或裸机上运行。
    • Bliss OS 是一款基于 Android 的开源操作系统,它集成了许多优化和功能,并预装了 KernelSU root。还包括 ARM 模拟。
    • 对于较旧的 Android 版本,请参阅 Android-x86

故障排除

Android Studio:Android 虚拟机显示 “failed to load”。

确保您已按照 #Android Studio 中的说明导出变量 ANDROID_HOME

Android Studio:“failed to create the SD card”

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

Eclipse:调试期间 “Source not found”

很可能调试器想要步入 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 does not load and no error message displayed

有时,开始加载 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 行添加 Desktop entries#修改环境变量

env ANDROID_EMULATOR_USE_SYSTEM_LIBS=1

sh: glxinfo: 命令未找到

以下是完整错误信息

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 上运行,类似 AVD Pixel_4_API_33 的模拟器进程已终止 的图形错误可以通过使用 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