Build Android X86 By Sources(translate)

2025/01/07 共 5414 字,约 16 分钟
= =

原文地址:https://www.android-x86.org/source.html

从源码开始编译Android-x86内核

本页面描述了如何为x86平台构建Android的最新信息。要浏览我们的源代码,请参阅…

从我们的git仓库中编译Android到x86平台是很容易的。编译出来的镜像应该能够在真实的x86设备以及虚拟机(比如qemu或virtual box)上良好运行。只需按照以下指示进行操作。不需要额外的补丁。

在Android-x86的版本库中,存在多个分支

由于Android Open Source Project(AOSP)发展得非常迅速,我们已经创建了不同的分支来对应AOSP的不同版本发布。

  • r-x86: 基于 Android 11.0 版本,代号为 R.
  • q-x86: 基于 Android 10.0 版本,代号为 Q.
  • pie-x86: 基于 Android 9.0 版本,代号为 Pie,且为 Pie QPR2 版本.
  • oreo-x86: 基于 Android 8.1 版本,代号为 Oreo,且为 Oreo MR1 版本.
  • nougat-x86: 基于 Android 7.1 版本,代号为 Nougat,且为 Nougat MR2 版本.
  • marshmallow-x86: 基于 Android 6.0 版本,代号为 Marshmallow.
  • lollipop-x86: 基于 Android 5.1 版本,代号为 Lollipop.
  • kitkat-x86: 基于 Android 4.4 版本,代号为 KitKat.
  • jb-x86: 基于 Android 4.3 版本,代号为 Jelly Bean.
  • ics-x86: 基于 Android 4.0 版本,代号为 Ice Cream Sandwich.
  • honeycomb-x86: 基于 Android 3.2 版本,代号为 Honeycomb.
  • gingerbread-x86: 基于 Android 2.3 版本,代号为 Gingerbread.
  • froyo-x86: 基于 Android 2.2 版本,代号为 Froyo.
  • eclair-x86: 基于 Android 2.1 版本,代号为 Eclair.
  • donut-x86: 基于 Android 1.6 版本,代号为 Donut.
  • cupcake-x86 (aka android-x86-b0.9): 基于 Android 1.5 版本,代号为 Cupcake,也被称为 android-x86-b0.9.

获取 Android-x86 的源代码

首先,查看AOSP页面“建立构建环境”以配置你的构建环境。对于Ubuntu 18.04,请安装以下所需的软件包:

$ sudo apt -y install git gcc curl make repo libxml2-utils flex m4
$ sudo apt -y install openjdk-8-jdk lib32stdc++6 libelf-dev mtools
$ sudo apt -y install libssl-dev python-enum34 python-mako syslinux-utils

然后,将Android-x86的源代码库下载到你的工作目录中,方法是:

$ mkdir android-x86
$ cd android-x86
$ repo init -u git://git.osdn.net/gitroot/android-x86/manifest -b $branch
$ repo sync --no-tags --no-clone-bundle

其中$branch是上一节中描述的分支名称之一。请注意,由 android-x86 创建或修改的项目是从我们的 Git 服务器获取的。所有其他项目仍从 AOSP(Android 开源项目)的代码库下载。

如果你在使用 Git 协议进行同步时遇到问题,可以尝试使用替代的 HTTP 协议来进行同步:

$ repo init -u http://scm.osdn.net/gitroot/android-x86/manifest -b $branch
$ repo sync --no-tags --no-clone-bundle

如果你希望继续将你的代码库与 Android-x86 仓库保持同步,只需执行 repo sync 命令即可,无需再次执行 repo init 命令。然而,有时在执行 repo sync 时可能会遇到冲突。请参阅“如何解决冲突”部分,了解如何解决这种情况。

注意:Android-x86 的代码库非常大(例如 oreo-x86 的版本就超过了 20GB)。如果你在同步(sync)这个代码库时遇到了问题,那么很可能是网络问题或者我们的服务器太忙了。你应该反复运行 repo sync 命令,直到它能够成功完成同步且没有任何错误为止。不要因为同步过程中遇到的任何问题来打扰我们。

获取LineageOS for x86源代码

要获取LineageOS(前CyanogenMod)移植到Android-x86的源代码,请在初始化仓库时通过额外的选项 -m cm.xml 指定清单文件:

$ repo init -u git://git.osdn.net/gitroot/android-x86/manifest -m cm.xml -b $branch
$ repo sync --no-tags --no-clone-bundle

目前,LineageOS移植仅在nougat-x86(cm 14.1)和marshmallow-x86(cm 13.0)分支中可用。

编译镜像

当代码库同步完成后,你可以构建一个CDROM ISO镜像文件。构建kitkat-x86版本之前(包括kitkat-x86)的分支时,你需要Oracle Java 1.6(OpenJDK可能不适用)。自lollipop-x86版本起,需要Java 1.7,并且支持OpenJDK。自nougat-x86版本起,需要OpenJDK 1.8。

注意: 在Froyo-x86版本(包括Froyo-x86)之前,你可以在32位或64位的主机上进行构建。从Gingerbread-x86版本开始,推荐使用64位的构建环境。

选择一个目标

你需要为你要使用或测试的x86设备选择一个目标。我们为不同的分支提供了几个目标:

Lollipop-x86 及以后版本

  • android_x86_64: 适用于 64 位 x86_64 平台。
  • android_x86: 适用于 32 位 x86 平台。

KitKat-x86 / Jelly Bean-x86

  • android_x86: 适用于 x86 平台。

Ice Cream Sandwich-x86 / Honeycomb-x86

  • generic_x86: 适用于通用的 x86 PC/笔记本电脑.
  • amd_brazos: 适用于 AMD Brazos 平台.
  • eeepc: 仅适用于 ASUS EeePC 系列.
  • asus_laptop: 适用于某些 ASUS 笔记本电脑.
  • tegav2: 适用于 Tegatech Tegav2(可能也适用于其他基于 Atom N45x 的平板电脑).

Gingerbread-x86 / Froyo-x86

  • generic_x86: 适用于通用的 x86 PC/笔记本电脑.
  • eeepc: 仅适用于 ASUS EeePC 系列.
  • asus_laptop: 适用于某些 ASUS 笔记本电脑.
  • tegav2: 适用于 Tegatech Tegav2(可能也适用于其他基于 Atom N45x 的平板电脑).
  • sparta: 适用于 Dell Inspiron Mini Duo 平台.
  • vm: 适用于虚拟机(Virtual Box、QEMU、VMware).
  • motion_m1400: 适用于 Motion M1400(基于 Intel Centrino M,配备 Intel PRO/Wireless).

Eclair-x86

  • generic_x86: 适用于通用的 x86 PC/笔记本电脑.
  • eeepc: 仅适用于 ASUS EeePC 系列.
  • q1u: 适用于 Samsung Q1U.
  • s5: 适用于 Viliv S5.

Donut-x86

  • eeepc: 仅适用于 ASUS EeePC 系列.
  • q1u: 适用于 Samsung Q1U.
  • s5: 适用于 Viliv S5.

LineageOS for x86

  • cm_android_x86_64: 适用于 64 位 x86_64 平台.
  • cm_android_x86: 适用于 32 位 x86 平台.

如果你不是在构建一个非常古老的Android分支(比如较新的版本),你应该使用android_x86_64作为64位目标设备,或者使用android_x86作为32位目标设备。这两个目标是为所有x86设备设计的通用目标,适用于大多数情况。

在较早的Android版本中(从Eclair-x86到ICS-x86分支),通常建议使用generic_x86作为目标设备。然而,这个目标可能没有针对特定设备进行优化,也就是说它可能无法充分发挥特定硬件的性能。对于更早的版本(如Donut-x86分支或之前的版本),如果你没有特定设备的支持目标,可以使用eeepc作为通用的x86目标设备。

如果你是一名开发者,并且希望为你的设备创建一个自定义的目标设备,你可以基于android_x86来创建。看这篇文章。除非你是一名经验丰富的Android平台开发者,否则不建议这样做,因为这可能需要深入的了解和复杂的操作。

使用lunch命令(推荐)

你可以将文件 build/envsetup.sh 引入到你的 Bash 环境中,以便获得一些帮助构建过程的 shell 函数:

$ source build/envsetup.sh

现在你可以通过使用lunch命令来选择一个目标。

$ lunch $TARGET_PRODUCT-$TARGET_BUILD_VARIANT

其中,$TARGET_PRODUCT 可以是前一节中描述的任何目标,$TARGET_BUILD_VARIANT 的可能值是 eng、user 和 userdebug。 例如,

$ lunch android_x86_64-userdebug

然后你可以通过使用 m 命令来创建一个 ISO 文件:

$ m -jX iso_img

m 命令与 make 命令等效,但你可以在 android-x86 项目的任何子目录中使用它。将 X 替换为你拥有的处理器数量。例如,如果你有一个四核 CPU,则将 X 替换为 4。

$ m -j4 iso_img

从froyo-x86版本开始,我们在lunch命令中也增加了菜单选择功能。只需输入lunch,你就会得到一个可用目标的列表。输入数字来选择一个目标。或者,你也可以直接输入lunch $number来选择目标。

构建一个rpm文件:

$ m -jX rpm

在开始构建之前,你需要安装一个特定的软件包。具体来说: 如果你使用的是基于 Fedora 的 Linux 发行版,你需要安装名为 rpm-build 的软件包。 如果你使用的是基于 Debian 或 Ubuntu 的 Linux 发行版,你需要安装名为 rpm 的软件包。

rpm文件可以直接安装到Linux发行版中。

直接编译

你可以通过设置一个名为 TARGET_PRODUCT 的变量来指定要构建的目标。例如,如果你想为名为 android_x86 的目标构建一个 ISO 镜像,你可以输入相应的命令来实现这一目标:

$ make -jX iso_img TARGET_PRODUCT=android_x86

要为 tegav2 生成一个可启动的 CD-ROM ISO 文件,输入以下命令:

$ make -jX iso_img TARGET_PRODUCT=tegav2

然后你会得到一个 ISO 文件,位于 out/target/product/x86/android_x86.iso,等等。

使用buildspec.mk文件

你可以在你的 android-x86 目录中创建一个名为 buildspec.mk 的文件,以便记住你经常构建的某个特定目标产品:

TARGET_PRODUCT := android_x86_64
TARGET_BUILD_VARIANT := userdebug
TARGET_BUILD_TYPE := release
TARGET_KERNEL_CONFIG := android-x86_64_defconfig

当你在你的 android-x86 工作目录中有 buildspec.mk 文件时,你可以简单地通过某种方式来构建(或编译)项目:

make -jX iso_img

编译更小的镜像

自 Android-x86 的 marshmallow-x86 版本起,默认情况下生成的 Android-x86 核心文件系统将使用 squashfs 进行压缩。在该版本之前,仅当你在宿主机上安装了 squashfs-tools 4.0(旧版本将无法工作)时才会使用 squashfs。使用 squashfs 压缩后生成的 ISO 文件会小很多(大约只有原来的 30-40%)。然而,如果你出于某些原因希望禁用 squashfs 压缩,可以在 make 命令中添加 USE_SQUASHFS=0。你可以将此设置放入 buildspec.mk 文件中:

USE_SQUASHFS := 0

在froyo-x86版本(包括该版本)之前,如果你希望获得一个更小的镜像文件,你可以通过移除调试符号来实现这一点:

TARGET_STRIP := 1

从 gingerbread-x86 版本开始,默认情况下会移除调试符号。因此,相关的选项(可能是用于控制是否移除调试符号的选项)变得没有必要了。

—————-下面的内容相对没那么重要———————————

测试

文档信息

Search

    Table of Contents