【问题标题】:How to compile the Android AOSP kernel and test it with the Android Emulator?如何编译 Android AOSP 内核并使用 Android Emulator 对其进行测试?
【发布时间】:2010-12-21 01:17:35
【问题描述】:

有没有人成功编译安卓内核并在安卓模拟器中测试过,如果有,有什么特别需要做的吗?

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

【问题讨论】:

    标签: android android-emulator emulation android-source


    【解决方案1】:

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

    • 通过将 Android 内核添加到您的存储库清单或通过运行手动获取 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 构建系统的一部分,因此将其分开是有意义的。内核的公共分支是模拟器使用的分支。还有experimental、msm(Qualcomm 平台)和Omap(TI 平台)等分支。如果您想将 Android 内核与硬件一起使用,您可能会更感兴趣。

    【讨论】:

    • 感谢您提供更多信息!由于大多数 Android 文档都是以 google 群组讨论的形式出现的,因此此类帖子非常有帮助。
    • 当我尝试下载内核源代码时,它给了我以下错误:“android.git.kernel.org[0: 149.20.4.77]: errno=Connection denied fatal: unable to connect a socket (连接被拒绝”你能建议我下载源的替代路径吗?
    • 在 kernel.org 宕机后,模拟器内核的位置随着迁移到 android.googlesource.com 而改变。我已将帖子更新为正确。
    【解决方案2】:

    只是为了更正 BMB 帖子中的一些内容(这对我非常有用,它保存了我的项目):

    • git clone git://android.git.kernel.org/kernel/common.git(kernel 错过了);
    • git checkout -t origin/android-goldfish-2.6.29 -b goldfish(同);
    • 使 ARCH=arm goldfish_defconfig (idem) ;
    • 使 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,没有我就无法工作)。

    【讨论】:

    • 感谢您提供额外信息。我编辑了我的帖子以包含正确的内核路径,对不起。
    • 如何使用 prebuilts/devtools/tools/android 脚本添加多个 AVD?它给出错误“ava.lang.ClassNotFoundException:com.android.sdklib.repository.SdkRepoConstants”
    【解决方案3】:

    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:

    注意事项:

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

      标签列表可在:https://android.googlesource.com/platform/manifest 或通过克隆该 repo 找到。

      分支总是断掉的原因可能有两个:

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

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

      • repo sync 在一个分支上只是拉取所有 650 个 git 存储库的最新版本构成给定分支的 AOSP,而不像子模块一样同步它们。因此,没有任何东西可以保证它们是兼容的。但是标签会获取所有 repos 的特定标签。

    • --depth 1 和 sync -c --no-tags --no-clone-bundle 试图让慢得令人痛苦的克隆更快。不知道它有多成功。另见:AOSP repo sync takes too long

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

      要改为构建 ARM 版本,只需改用 lunch aosp_arm-eng。

      此外,ARM 映像有问题,可能是因为速度慢?当 GUI 启动时(如果幸运的话),它会显示“系统 UI 没有响应”。另见:Process system isn't responding in android emulator

      理论上,您在 Java / C++ 原生 API 中所做的所有“通常的高级操作”在 x86 和 ARM 上都应该同样有效,因此除非您有足够的核心来手动接触某些程序集,否则这无关紧要。

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

    • type emulator 表明它只是emulator 的别名,没有任何参数。 Run custom ROM on Android Emulator 询问如何传递一些参数来显式选择您的 ROM。

      模拟器-help 目标的洞察力令人惊讶:

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

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

      emulator -verbose | grep 'emulator: argv'
      

      如提及:How to show which options are passed to QEMU when launching the android emulator?

      这显示了一些自定义选项,例如-android-hw,所以他们一定是分叉了 QEMU:QEMU vs Android emulator: command line options 源显然每 5 分钟移动一次位置:Modifying Android emulator source code

    【讨论】:

    • 无法运行模拟器,它显示“模拟器:错误:未指定 AVD”。从我的角度来看,它应该拍摄并构建图像,这就是为什么您没有在命令中指出任何 avd 的原因。你有什么想法吗?
    • @Gleichmut 嗯,我记得 emulator 别名刚刚起作用,我认为它指向所有必需的图像。我稍后会仔细检查,如果你发现了什么,请告诉我。
    • 顺便说一句,在我的机器上,我也遇到了一个问题,该问题已通过 export LC_ALL=C 这一行解决。将来可能对某人有用。
    • @Gleichmut 我刚刚确认 emulator 在我的构建中工作,模拟器 GUI 出现了。在运行emulator 之前,您是否在shell 上同时运行了. build/envsetup.sh 和lunch aosp_x86_64-eng?
    • “下载源代码。需要几分钟”,镜像在我的家庭连接上花了将近 2880 分钟 :-)
    【解决方案4】:

    这是 BMB 和 Arnaud LM 答案的更新。
    自 2011/03/03 起,金鱼的分支名称似乎已更改。 检查金鱼分支时,使用这个:

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

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

    希望这可以为某人节省时间。

    【讨论】:

      【解决方案5】:

      截至 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”是给我带来麻烦的最后一首。

      【讨论】:

      • 帮助很大,谢谢。不过,您的代码中有一个小错字。不是make ARCM=arm menuconfig,而是make ARCH=arm menuconfig。发现通过盲目复制和粘贴并以 x86 内核结束 ;-)
      【解决方案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 内核并获取编译后的映像并在模拟器中运行它。
      • 这就是运行编译好的Android源码镜像的方式。我每天都这样做。您只需编译 Android 源代码,您就会有一个模拟器来运行它。
      • 正如我们上面所说,我们并不打算为模拟器编译源代码。正在寻找编译 ANDROID KERNEL (android.git.kernel.org)
      • 这个答案对我有帮助:)
      【解决方案7】:

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

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

      仅供参考。

      【讨论】:

        【解决方案8】:

        我能够启动我编译的 AOSP rom 的方法是将编译后的 system.img 复制到 ~/.android/avd/Froyo.avd/ 但是,当我提取 system.img 并添加 su 和 busybox 的 root 版本,然后重新制作 system.img 时,模拟器无法启动。我仍在试图弄清楚那部分:S

        【讨论】:

          猜你喜欢
          • 2020-03-02
          • 2014-12-30
          • 1970-01-01
          • 2015-05-22
          • 2013-08-21
          • 2011-06-23
          • 2017-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多