如何编译Android AOSP内核并使用Android Emulator进行测试?

Zyr*_*eam 52 android emulation android-emulator android-source

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

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

BMB*_*BMB 55

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

  • 通过将Android内核添加到您的repo清单中或通过运行以下方式手动获取Android内核:
    git clone https://android.googlesource.com/kernel/goldfish.git
  • 查看正确的分支以使用模拟器,即金鱼:
    git checkout -t origin/android-goldfish-2.6.29 -b goldfish
  • 生成模拟器配置(qemu模拟器运行arm代码,即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内核与硬件一起使用,这些对您来说可能更有趣.

  • 感谢您提供更多信息!由于大多数Android文档都是以谷歌小组讨论的形式出现的,所以此类帖子非常有用. (2认同)

小智 19

只是为了纠正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(idem);
  • make ARCH = arm CROSS_COMPILE = mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-(idem)
  • 模拟器-avd my_avd -kernel mydroid/kernel/common/arch/arm/boot/zImage(这里我在命令中添加了一个avd,它没有为我工作).

  • 感谢您的额外信息.我编辑了我的帖子以包含正确的内核路径,sry. (2认同)

Cir*_*四事件 12

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
Run Code Online (Sandbox Code Playgroud)

out/构建目录大约占用90GB,和树有关的40Gb,排除CCACHE的其余部分.

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

如果您在Android主机终端上按Enter键,则会在主机终端上的Android系统上获得一个shell:

在此输入图像描述

笔记:

  • ./repo init -b 必须指向一个标签.master分支总是坏的,分支也是如此-release.

    标签列表可以在以下网址找到:https://android.googlesource.com/platform/manifest或克隆该回购.

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

    • Android是闭门开发而代码掉落的.因此谷歌和OEM开发人员已经在公众"大师"之上拥有大量的缓存,并且已经解决了这个问题.

      出于同样的原因,尝试报告master上的任何构建错误可能毫无用处:它们已经被报告并修复过.我敢说你甚至找到合适的官方地点来报告构建失败.

    • repo sync在一个分支上简单地拉出所有650 git repos的最新版本构成给定分支的AOSP,而不像子模块那样同步它们.因此,没有什么能保证它们兼容.然而,标签会获取所有仓库的特定标签.

  • --depth 1sync -c --no-tags --no-clone-bundle试图让痛苦缓慢的克隆更快.不确定它有多成功.另请参阅:AOSP repo sync需要太长时间

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

    要改为构建ARM版本,请lunch aosp_arm-eng改用.

    此外,ARM图像有问题,可能是因为速度慢?当GUI启动时(如果幸运的话),它显示"系统UI没有响应".另请参阅:进程系统在Android模拟器中没有响应

  • -show-kernel 将终端链接到一个串口,即你看到引导消息,并在最后得到一个shell,这对调试事情非常有用.

  • type emulator表明它只是emulator没有任何参数的别名.在Android Emulator上运行自定义ROM会询问如何传递一些参数以明确选择您的ROM.

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

    emulator -help
    emulator -help-build-images
    emulator -help-disk-images
    
    Run Code Online (Sandbox Code Playgroud)

    您可以确定给出的确切QEMU命令行参数:

    emulator -verbose | grep 'emulator: argv'
    
    Run Code Online (Sandbox Code Playgroud)

    如上所述:如何在启动Android模拟器时显示传递给QEMU的选项?

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


hop*_*pia 8

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

git checkout -t origin/archive/android-gldfish-2.6.29 -b goldfish 
Run Code Online (Sandbox Code Playgroud)

注意android-gldfish-2.6.29中缺少'o'!

希望这为某人节省时间.


Joh*_*ada 8

截至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 &
Run Code Online (Sandbox Code Playgroud)

感谢所有回答此问题的人 - 我能够从这个答案中得到点点滴滴.Amaund的'你需要AVD'是最后一件让我麻烦的作品.


Mos*_*afa 6

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

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

  • 如上所述,我们不打算编译模拟器的源代码.正在寻找编译ANDROID KERNEL(http://android.git.kernel.org/) (2认同)