有没有人成功编译了Android内核并在Android模拟器中对其进行了测试,如果有的话还有什么特别需要做的吗?
SDK的文档非常好,但是我很难找到用于编译内核和在模拟器中设置自定义机器的文档。
答案 0 :(得分:55)
自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构建系统的一部分构建,因此将它保持分离是有意义的。内核的公共分支是模拟器使用的分支。还有实验,msm(高通平台)和Omap(TI平台)的分支机构,可能还有更多。如果你想将Android内核与硬件一起使用,这些对你来说可能会更有趣。
答案 1 :(得分:19)
只是为了纠正BMB帖子中的一些内容(这对我来说非常有用,它保存了我的项目):
答案 2 :(得分:8)
这是BMB和Arnaud LM答案的更新 从2011/03/03开始,金鱼品牌似乎发生了变化。 在查看金鱼分支时,请使用:
git checkout -t origin/archive/android-gldfish-2.6.29 -b goldfish
请注意android-gldfish-2.6.29中缺少的“o”!
希望这为某人节省时间。
答案 3 :(得分: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 &
感谢所有回答此问题的人 - 我能够用这个答案中的点点滴滴做到这一点。 Amaund的'你需要AVD'是最后一件给我带来麻烦的作品。
答案 4 :(得分:8)
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是闭门开发,代码掉线。因此,Google和OEM开发人员已经在公众" master"之上拥有大量的缓存,并且已经解决了这个问题。
出于同样的原因,尝试在master上报告任何构建错误可能毫无用处:它们已经被报告并修复了。另外,我敢于找到合适的官方地点报告构建失败。
repo sync
只是拉出所有650 git repos的最新版本组成AOSP的给定分支,而不像子模块那样同步它们。因此,没有什么能保证它们兼容。然而,标签会获取所有回购的特定标签。
--depth 1
和sync -c --no-tags --no-clone-bundle
试图让痛苦缓慢的克隆更快。不确定它有多成功。另见:AOSP repo sync takes too long
我们使用lunch aosp_x86_64-eng
而不是ARM,因为它由于主机x86虚拟化扩展而运行得更快。
要构建ARM版本,只需使用lunch aosp_arm-eng
。
此外,ARM图像有问题,可能是因为速度慢?当GUI启动时(如果幸运的话),它显示"系统UI没有响应"。另见:Process system isn't responding in android emulator
-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
答案 5 :(得分: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。
答案 6 :(得分:4)
截至2012年5月,我发现您无法使用'goldfish_defconfig'来编译内核。你需要使用goldfish_armv7_defconfig'。这可以解释为什么JonnyLambada从模拟器(对于预构建的内核)中提取配置的方法是有效的,并且是必要的。
goldfish_defconfig将内核配置为在ARM 926处理器上运行,但仿真器配置为作为Coretex A8(ARM V7 CPU)运行。因此,如果您希望它能够工作(或从模拟器中提取配置),您需要使用较新的defconfig。
仅供参考。
答案 7 :(得分:1)
我能够启动我编译的AOSP rom的方法是将编译的system.img复制到〜/ .android / avd / Froyo.avd / 但是,当我解压缩system.img并添加su和busybox的root版本时,然后重新制作system.img,模拟器无法启动。我还在努力想出那个部分:S