emulator启动Android时can't load ramdisk.img的解决办法

本文解决了在Ubuntu 11.10环境下编译Android 4.2源码后遇到的模拟器启动问题。通过设置正确的环境变量ANDROID_BUILD_TOP指向源码目录,实现了模拟器在多终端间的正常启动。

操作系统:ubuntu11.10
Android Source Code: 4.2
问题描述:下载编译完源码,SDK和内核后,在同一个终端启用emulator可以正常运行android的模拟器,但是打开新的终端后运行emulator后就会出现找不到系统镜像这样的错误,在用-kernel -ramdisk等选项指定镜像文件的位置后又会出现can't load ramdisk错误。
解决办法:根据问题直观判断是两个终端的环境变量设置不同,在源码编译的过程中会设置很多环境变量,用export命令导出两个终端的环境变量后,逐个对比发现原终端中的ANDROID_BUILD_TOP变量是整个问题的关键。设置ANDROID_BUILD_TOP为android源码所
在目录即可。
总结:真他妈坑爹


### Linux 系统中 ramdisk.img 的源码分析 在 Linux 系统中,`ramdisk.img` 是一个临文件系统镜像,通常用于引导阶段。它包含了一些必要的文件和脚本,以便内核启动可以加载并运行初始环境。以下是关于 `ramdisk.img` 源码的详细说明: #### 1. 文件格式与解压过程 `ramdisk.img` 通常是经过压缩的 CPIO 归档文件。可以通过以下命令查看其格式并解压: ```bash file ramdisk.img ``` 如果输出为 `gzip compressed data, from Unix`,则表示该文件是一个 gzip 压缩包[^1]。 解压命令如下: ```bash gunzip -S .img ramdisk.img ``` 这将生成一个名为 `ramdisk` 的文件,该文件是未压缩的 CPIO 归档文件[^1]。 #### 2. CPIO 归档内容 使用 `cpio` 工具可以提取归档中的内容: ```bash mkdir rootfs; cd rootfs; cpio -i -F ../ramdisk ``` 此命令会将归档中的文件解压到 `rootfs` 目录中。常见的文件包括: - `init`:初始化脚本,负责启动系统的初始进程。 - `sbin`:包含系统二进制文件。 - `system`:系统相关的配置文件和目录[^1]。 #### 3. 源码生成过程 `ramdisk.img` 的源码通常由以下步骤生成: 1. **创建 CPIO 包**:通过 `find` 和 `cpio` 命令生成 CPIO 包。 ```bash find . | cpio -o -H newc > ../ramdisk ``` 2. **压缩 CPIO 包**:使用 `gzip` 将 CPIO 包压缩为 `.img` 文件。 ```bash gzip -c ramdisk > ramdisk.img ``` 这些步骤可以在 Linux 内核源码的构建过程中找到。例如,在 OpenHarmony 或 Android 的构建脚本中,`ramdisk.img` 的生成逻辑可能被封装在特定的工具或脚本中[^2]。 #### 4. 示例:OpenHarmony 中的 `ramdisk.img` 构建 在 OpenHarmony 的构建过程中,可能会遇到类似以下的问题:当编译不同平台(如从 RK3568 切换到 Hi3516),`ramdisk.img` 的生成可能会报错。解决方法是修改 `build/ohos/images/mkimage/ramdisk_resource_config.ini` 文件,注释掉最后四行代码[^2]。 #### 5. 示例:AOSP 中的 `ramdisk.img` 使用 在 Android 开源项目(AOSP)中,`ramdisk.img` 可以通过以下命令加载到模拟器中: ```bash /AOSP/out/host/linux-x86/bin/./emulator \ -kernel /AOSP/prebuilts/qemu-kernel/arm/kernel-qemu-armv7 \ -sysdir /AOSP/out/target/product/generic/ \ -system system.img \ -data userdata.img \ -ramdisk /AOSP/out/target/product/generic/ramdisk.img \ -skindir skins/ \ -skin HVGA \ -partition-size 768 ``` 此命令指定了 `ramdisk.img` 的路径,并将其作为参数传递给模拟器[^3]。 #### 6. 示例:RK356X 平台的 `recovery.img` 构建 对于 RK356X 平台,`recovery.img` 的生成可以通过以下命令完成: ```bash ./build.sh recovery ``` 生成的 `recovery.img` 文件通常位于 `../buildroot/output/rockchip_rk356x_recovery/images/recovery.img`[^4]。 #### 7. 解决 Linux 5.15 编译不生成 `boot.img` 的问题 在某些情况下,Linux 5.15 内核编译可能不会生成 `boot.img`。解决方案是在 Makefile 中添加以下规则: ```makefile %.img: ifeq ("$(CONFIG_MODULES)$(MAKE_MODULES)$(srctree)","yy$(objtree)") $(Q)$(MAKE) rockchip/$*.dtb Image.lz4 modules else $(Q)$(MAKE) rockchip/$*.dtb Image.lz4 endif $(Q)$(srctree)/scripts/mkimg --dtb $*.dtb ``` 此规则确保了 `boot.img` 的正确生成[^5]。 ### 总结 `ramdisk.img` 的源码通常由一系列脚本和工具生成,涉及 CPIO 归档、gzip 压缩以及特定平台的构建脚本。通过分析上述引用内容,可以深入了解其生成和使用的具体细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值