有没有人成功编译过android内核并在android模拟器中测试过,如果有,有什么特别需要做的吗?
SDK 的文档非常好,但是我很难找到编译内核和在模拟器中设置自定义机器的文档。
有没有人成功编译过android内核并在android模拟器中测试过,如果有,有什么特别需要做的吗?
SDK 的文档非常好,但是我很难找到编译内核和在模拟器中设置自定义机器的文档。
自 2009 年 8 月起,当您按照说明下载 android 开源项目的源代码时,内核不再是标准 repo 清单的一部分。在模拟器上成功下载、构建和运行特定内核所需的步骤如下:
git clone https://android.googlesource.com/kernel/goldfish.git
git checkout -t origin/android-goldfish-2.6.29 -b goldfish
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-
emulator -kernel mydroid/kernel/common/arch/arm/boot/zImage
请注意,我在上述说明中使用了默认路径,您需要将它们更改为适用于您的设置的路径。自从我上次测试以来已经有一段时间了,但我认为它应该可以工作。
一些额外的信息:在标准的 Android 开源分发中,内核作为mydroid/prebuilt/android-arm/kernel
文件夹中的预构建二进制文件分发,源代码不包括在内。我认为内核源代码已从默认清单中删除,原因有两个。一个是大多数人不会使用的平台组件需要大量带宽和磁盘空间。另一个原因是,由于内核是使用内核构建系统构建的,而不是作为 aosp 构建系统的一部分,因此将其分开是有意义的。内核的公共分支是模拟器使用的分支。还有experimental、msm(Qualcomm 平台)和Omap(TI 平台)等分支。如果您想将 Android 内核与硬件一起使用,这些可能对您来说更有趣。
只是为了更正 BMB 帖子中的一些内容(这对我非常有用,它保存了我的项目):
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或通过克隆该存储库。
分支总是坏的可能有两个原因:
Android是闭门开发的,代码被丢弃了。因此,谷歌和 OEM 开发人员已经在公共“大师”之上拥有了大量的补丁,并且已经解决了这个问题。
出于同样的原因,尝试报告 master 上的任何构建错误可能是无用的:它们已经被报告并修复。此外,我敢于让您找到正确的官方位置来报告构建失败。
repo sync
在一个分支上只需拉取所有 650 个 git repos 的任何最新版本构成给定分支的 AOSP,而不像子模块一样同步它们。因此,没有任何东西可以保证它们是兼容的。但是,标签会获取所有 repos 的特定标签。
--depth 1
并sync -c --no-tags --no-clone-bundle
试图使痛苦缓慢的克隆更快。不知道它有多成功。另请参阅:AOSP 存储库同步时间过长
我们使用lunch aosp_x86_64-eng
而不是 ARM 是因为它运行得更快,因为主机 x86 虚拟化扩展包括KVM。
要改为构建 ARM 版本,只需使用lunch aosp_arm-eng
。
此外,ARM 映像有问题,可能是因为速度慢?当 GUI 启动时(如果幸运的话),它会显示“系统 UI 没有响应”。另请参阅:进程系统在 android 模拟器中没有响应
理论上,您在 Java / C++ 原生 API 中所做的所有“通常的高级操作”都应该在 x86 和 ARM 上同样有效,因此除非您足够硬核,可以手动接触某些程序集,否则这无关紧要。
-show-kernel
将终端链接到串行,即您会看到引导消息,并在最后得到一个外壳,这对于调试非常有用。
type emulator
表明它只是 the 的别名,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 模拟器源代码
这是 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”是给我带来麻烦的最后一首。
这很容易。按照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。
截至 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 的 root 版本时和busybox,然后重新制作system.img,模拟器不启动。我仍在试图弄清楚那部分:S