Android之Qemu和Goldfish

本文介绍了Google开发的Android模拟器中使用的Goldfish处理器和QEMU模拟器的基本概念及其工作原理。详细讲解了如何下载、编译Goldfish内核源码,并在Android模拟器中加载新编译的内核。

一. Goldfish和qemu介绍

Google在开发Android系统的同时,使用qemu开发了针对每个版本的一个模拟器,这大大降低了开发人员的开发成本,便于Android技术的推广。qemu是一个开源的模拟处理器软件,而Google使用qemu模拟的是ARM926ej-S的Goldfish处理器,如果开发人员在没有目标开发板的情况下,要对硬件进行操作的话,必然要去操作Android底层的驱动,我们可以使用模拟器的内核源码。

Android模拟器所对应的源代码主要在external/qemu目录下。

Goldfish是一种虚拟的ARM处理器,在Android的仿真环境中使用。Android模拟器通过运行它来运行arm926t指令集(arm926t属于armv5构架,goldfish处理器有ARMv5和ARMv7两个版本,在一般情况下,使用ARMv5的版本即可)。

在linux的内核中,Goldfish作为ARM体系结构的一种“mach”,它的核心内容存放在:arch/arm/mach-goldfish。

goldfish_defconfig 位置:kernel/arch/arm/configs

在android的发展过程中,Goldfish内核的版本也进行了升级,.这个处理器的linux内核和标准的linux内核的差别有以下几方面:

 1. goldfish机器的移植。

 2. goldfish一些虚拟设备的驱动程序。

 3. android中特有的驱动程序和组件。

Android模拟器被命名为goldfish,用来模拟包括下面一些功能的ARM SoC:
·  ARM926ej-S CPU
·  Thumb support
·  MMC
·  RTC
·  Keyboard
·  USB Gadget
·  Framebuffer
·  TTY driver
·  NAND FLASH

编译生成的linux内核镜像在android的模拟器中使用。启动模拟器时,Linux Kernel镜像默认使用:prebuilt/android-arm/kernel目录下的kernel-qemu文件。

二. 下载Goldfish内核源码

首先进入到Android的源码目录,创建源码目录kernel:
        $ cd WORKING_DIRECTORY
        $ mkdir kernel
        从Android的远程源码仓库下载源码:
        $git clone http://android.googlesource.com/kernel/goldfish.git
        当然,如果你要编译指定目标平台的kernel的话,也可以从指定的仓库里下载,官方给出了下列处理器的kernel:
        $ git clone https://android.googlesource.com/kernel/common.git
        $ git clone https://android.googlesource.com/kernel/exynos.git
        $ git clone https://android.googlesource.com/kernel/goldfish.git
        $ git clone https://android.googlesource.com/kernel/msm.git
        $ git clone https://android.googlesource.com/kernel/omap.git
        $ git clone https://android.googlesource.com/kernel/samsung.git
        $ git clone https://android.googlesource.com/kernel/tegra.git

经过一段时间之后,在kernel目录下生成了一个goldfish目录.

       $ cd goldfish

       $ git branch 

        * master
可以看到我们的本地存在的分支是主线.

       $ git branch -a 列出本地分支和远程分支
         * master
         remotes/origin/HEAD -> origin/master
         remotes/origin/android-3.10
         remotes/origin/android-goldfish-2.6.29
         remotes/origin/android-goldfish-3.10
         remotes/origin/android-goldfish-3.4
         remotes/origin/linux-goldfish-3.0-wip
         remotes/origin/master

我们选择android-goldfish-3.4

      $ git checkout remotes/origin/android-goldfish-3.4

完成后,我们发现goldfish目录下有了源码文件.

三. 编译Goldfish内核

$ export PATH=~/源码路径/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH
$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-

$ make goldfish_armv7_defconfig # 如果是android4.0之前的版本,使用make goldfish_defconfig,主要是因为ieArm体系结构不同

这个过程会生成.config文件

$ make

 编译成功后,可看到下面几行:
  LD      vmlinux
  SYSMAP  System.map
  SYSMAP  .tmp_System.map
  OBJCOPY arch/arm/boot/Image
  Kernel: arch/arm/boot/Image is ready
  AS      arch/arm/boot/compressed/head.o
  GZIP    arch/arm/boot/compressed/piggy.gzip
  AS      arch/arm/boot/compressed/piggy.gzip.o
  CC      arch/arm/boot/compressed/misc.o
  CC      arch/arm/boot/compressed/decompress.o
  CC      arch/arm/boot/compressed/string.o
  SHIPPED arch/arm/boot/compressed/lib1funcs.S
  AS      arch/arm/boot/compressed/lib1funcs.o
  SHIPPED arch/arm/boot/compressed/ashldi3.S
  AS      arch/arm/boot/compressed/ashldi3.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is read

在执行make命令前,你也可以执行make menuconfig先配置一下编译选项

vmlinux是linux进行编译和连接之后生成的Elf格式的文件,Image是未经过压缩的二进制文件,piggy是一个解压缩程序,zImage是解压缩程序和压缩内核的组合。
 在android源代码的根目录中vmlinux和zImage分别对应android代码prebuilt中的预编译的arm内核。

在goldfish处理器的各个配置选项中,体系结构和goldfish的虚拟驱动程序基于标准linux的内容的驱动程序框架,但是这些设备在不同的硬件平台的移植方式不同;android专用的驱动程序是android中特有的内容,非linux标准,但是和硬件平台无关。

四. 启动模拟器并加载新编译的内核

$ emulator -kernel ~/源码路径/kernel/goldfish/arch/arm/boot/zImage &

### 3.1 Android 模拟器音频错误的原因分析 在 Android 模拟器启动时出现 `audio: Failed to create voice 'goldfish_audio_in'` 错误,通常与音频驱动或系统配置有关。模拟器依赖于宿主机的音频子系统来创建虚拟音频设备,若宿主机的音频驱动不兼容或配置不当,会导致模拟器无法正确初始化音频接口。此类问题在 Windows 系统中尤为常见,尤其是在音频服务被占用或音频驱动版本不兼容的情况下[^2]。 此外,该错误可能伴随 `qemu-system-i386.exe: warning: opening audio input failed` 的警告信息,表明 QEMU 模拟器核心在尝试访问音频输入设备时失败。该问题与音频输入输出设备的访问权限、音频服务状态密切相关[^2]。 ### 3.2 解决方案与配置建议 为了解决 `Failed to create voice 'goldfish_audio_in'` 的问题,可以采取以下措施: - **禁用音频重定向**:如果不需要使用模拟器的音频功能,可以通过在启动命令中添加 `-noaudio` 参数来禁用音频支持,从而绕过音频设备初始化过程: ```bash emulator -avd My_x86_AVD -noaudio ``` 该方法适用于仅需测试 UI 或逻辑功能而不涉及音频播放的场景。 - **更新音频驱动**:确保宿主机的音频驱动为最新版本,尤其是使用 Realtek 或 Conexant 声卡的设备,可能需要手动更新驱动以提升兼容性。 - **检查音频服务状态**:确保 Windows 系统中的音频服务(Windows Audio)处于运行状态。可以通过“服务”管理器(`services.msc`)检查该服务的状态并设为“自动启动”。 - **更改音频输出设备**:在系统设置中更改默认音频输出设备,确保模拟器使用的音频设备未被其他程序占用。例如,可以尝试切换至 USB 音频设备或 HDMI 音频输出。 - **禁用 Hyper-V 与 Windows 沙盒**:如果系统中启用了 Hyper-V 或 Windows 沙盒功能,可能会影响模拟器的音频子系统运行。建议通过以下命令禁用 Hyper-V: ```cmd bcdedit /set hypervisorlaunchtype off ``` 执行该命令后需重启系统,以确保 HAXM 模拟器正常运行[^3]。 ### 3.3 验证与调试建议 在修改配置后,可使用以下命令验证音频子系统是否正常加载: ```bash emulator -list-avds emulator -avd My_x86_AVD -verbose ``` 在 `-verbose` 模式下,模拟器会输出详细的启动日志,便于定位音频初始化失败的具体原因。若仍出现 `Failed to create voice` 错误,建议尝试更换 AVD 的系统镜像或使用更高版本的 Android SDK 工具。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值