有没有人成功编译了android内核并在Android模拟器中测试了它,如果是的话,有什么特别需要做的吗?

SDK 的文档非常好,但是我很难找到编译内核和在模拟器中设置自定义机器的文档。

有帮助吗?

解决方案

自 2009 年 8 月以来,内核不再是按照说明下载 Android 开源项目源代码时获得的标准存储库清单的一部分。在模拟器上成功下载、构建和运行特定内核所需的步骤如下:

  • 通过将 Android 内核添加到您的存储库清单或通过运行手动获取 Android 内核:
    git clone https://android.googlesource.com/kernel/goldfish.git
  • 检查使用模拟器的正确分支,即金鱼:
    git checkout -t origin/android-goldfish-2.6.29 -b goldfish
  • 生成模拟器配置(qemu模拟器运行arm代码,即手臂配置):
    make ARCH=arm goldfish_defconfig
    • 如果这不起作用,请尝试 make ARCH=arm goldfish_armv7_defconfig
  • 现在使用随开源项目分发的交叉编译工具构建内核:
    make ARCH=arm CROSS_COMPILE=mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
  • 以这种方式构建的内核应该最终位于内核树的 arch/arm/boot 文件夹中(您可以在其中放置来自 git clone 的代码)
  • 要使用您的内核运行模拟器,有两种选择:将其复制到开源项目的预构建内核文件夹中以替换标准内核。另一个选项是使用内核选项集启动模拟器:
    emulator -kernel mydroid/kernel/common/arch/arm/boot/zImage

请注意,我在上面的描述中使用了默认路径,您需要将它们更改为适用于您的设置的路径。自从我上次测试这个以来已经有一段时间了,但我认为它应该有效。

一些额外信息:在标准 Android 开源发行版中,内核作为预构建的二进制文件分发在 mydroid/prebuilt/android-arm/kernel 文件夹和源代码不包括在内。据我所知,内核源代码被从默认清单中删除有两个原因。一是大多数人不会经常使用的平台组件需要大量带宽和磁盘空间。另一个原因是,由于内核是使用内核构建系统构建的,而不是作为 aosp 构建系统的一部分,因此将其分开是有意义的。内核的公共分支是模拟器使用的分支。还有实验、msm(高通平台)和 Omap(TI 平台)等分支。如果您想将 Android 内核与硬件一起使用,这些对您来说可能更有趣。

其他提示

只是纠正 BMB 帖子中的一些内容(这对我来说非常有用,它拯救了我的项目):

  • git clone git://android.git.kernel.org/kernel/common.git ( 核心 错过了);
  • git checkout -t origin/android-goldfish-2.6.29 -b goldfish (相同);
  • make ARCH=arm goldfish_defconfig (同上) ;
  • 使 ARCH=arm CROSS_COMPILE=mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- (同上)
  • emulator -avd my_avd -kernel mydroid/kernel/common/arch/arm/boot/zImage (这里我添加了一个 AVD 在命令中,如果没有我,它就不起作用)。

这是BMB和Arnaud LM答案的更新。
从2011/03/03开始,金鱼品牌似乎发生了变化。 在查看金鱼分支时,请使用:

git checkout -t origin/archive/android-gldfish-2.6.29 -b goldfish 

请注意android-gldfish-2.6.29中缺少的“o”!

希望这为某人节省时间。

截至2012年,在source.google.com上详细记录了下载内核,但是我发现编译它需要几次尝试。以下是我用于为ARM仿真器构建内核的命令:

cd /kernel/source/root
make mrproper
adb pull /proc/config.gz # from the emulator
gunzip config
mv config .config  # now you have a (perhaps slightly outdated kernel .config)
make ARCH=arm silentoldconfig # update the .config - take the defaults if prompted
make ARCH=arm menuconfig # make any further changes
time make -j4 ARCH=arm CROSS_COMPILE=/path/to/android/source/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- 2>&1 | tee ../../logs/$(date +%Y%m%d-%H%M)-make-kernel.log
emulator -kernel /kernel/source/root/kernel/goldfish/arch/arm/boot/zImage -avd myAVD &

感谢所有回答此问题的人 - 我能够通过这个答案中的点点滴滴做到这一点。 Amaund的'你需要AVD'是最后一件给我带来麻烦的作品。

Ubuntu 17.10 主机上的全自动 Android 8.1 来宾

# Download the source. Takes several minutes.
curl https://storage.googleapis.com/git-repo-downloads/repo >repo
chmod a+x repo
./repo init -b android-8.1.0_r1 --depth 1 -u https://android.googlesource.com/platform/manifest
./repo sync -c  -j $(($(nproc) - 2)) --no-tags --no-clone-bundle

# Do the actual build. Takes minutes / hours.
. build/envsetup.sh
lunch aosp_x86_64-eng
USE_CCACHE=1 CCACHE_DIR=ccache make -j $(($(nproc) - 2))

# Run the emulator.
emulator -show-kernel

out/ 构建目录占用约 90Gb,树的其余部分约占 40Gb,不包括 CCACHE。

启动模拟器后大约1-2分钟,主屏幕显示:

如果您在启动 Android 的主机终端上按 Enter 键,您将在主机终端上获得 Android 系统的 shell:

enter image description here

笔记:

  • ./repo init -b 必须指向一个标签. master 树枝总是折断的,所以 -release 分支机构。

    标签列表可以在以下位置找到: https://android.googlesource.com/platform/manifest 或者通过克隆该存储库。

    分支总是被破坏可能有两个原因:

    • Android 是闭门开发的,代码被丢弃。因此,谷歌和 OEM 开发人员已经在公共“master”之上拥有了大量的补丁,并且已经解决了这个问题。

      出于同样的原因,尝试报告 master 上的任何构建错误可能是没有用的:它们已经被报告并修复。另外,我敢说您甚至可以找到正确的官方位置来报告构建失败。

    • repo sync 在分支上只需拉取所有 650 个 git 存储库的最新版本即可构成给定分支的 AOSP,而无需像子模块那样同步它们。因此,没有什么可以保证它们是兼容的。然而,标签会获取所有存储库的特定标签。

  • --depth 1sync -c --no-tags --no-clone-bundle 我们试图让极其缓慢的克隆变得更快。不确定它有多成功。也可以看看: AOSP 存储库同步时间太长

  • 我们用 lunch aosp_x86_64-eng 而不是 ARM,因为由于主机 x86 虚拟化扩展,它运行速度更快。

    要构建 ARM 版本,只需使用 lunch aosp_arm-eng 反而。

    此外,ARM 映像有错误,可能是因为速度慢?当 GUI 启动时(如果幸运的话),它会显示“系统 UI 没有响应”。也可以看看: Android 模拟器中的进程系统没有响应

  • -show-kernel 将终端链接到串行,即你会看到启动消息,并在最后得到一个 shell,这对于调试非常有用。

  • type emulator 表明它只是一个别名 emulator 没有任何争论。 在 Android 模拟器上运行自定义 ROM 询问如何传递一些参数来显式选择您的 ROM。

    模拟器 -help 目标具有惊人的洞察力:

    emulator -help
    emulator -help-build-images
    emulator -help-disk-images
    

    您可以通过以下方式确定给出的确切 QEMU 命令行参数:

    emulator -verbose | grep 'emulator: argv'
    

    如所述: 如何显示启动 android 模拟器时哪些选项传递给 QEMU?

    这显示了一些自定义选项,例如 -android-hw, ,所以他们一定已经分叉了 QEMU: QEMU 与 Android 模拟器:命令行选项 来源显然每 5 分钟移动一次位置: 修改Android模拟器源码

这很容易。按照 http://source.android.com/download 上的说明获取和编译源代码整个机器人。这需要一段时间,但并不复杂。

通过构建它,您将在<android>/out目录中输出。除了ROM映像之外,这还包括一堆工具,包括模拟器。我的模拟器在<android>/out/host/linux-x86/bin/emulator。只需将名为ANDROID_PRODUCT_OUT的环境变量设置为<android>/out/target/product/generic,然后运行不带任何选项的模拟器将运行已编译的ROM。

截至2012年5月,我发现您无法使用'goldfish_defconfig'来编译内核。你需要使用goldfish_armv7_defconfig'。这可以解释为什么JonnyLambada从模拟器(对于预构建的内核)中提取配置的方法是有效的,并且是必要的。

goldfish_defconfig将内核配置为在ARM 926处理器上运行,但仿真器配置为作为Coretex A8(ARM V7 CPU)运行。因此,如果您希望它能够工作(或从模拟器中提取配置),您需要使用较新的defconfig。

仅供参考。

我能够启动我编译的AOSP rom的方法是将编译的system.img复制到〜/ .android / avd / Froyo.avd / 但是,当我解压缩system.img并添加su和busybox的root版本时,然后重新制作system.img,模拟器无法启动。我还在努力想出那个部分:S

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top