从源代码构建Android后运行模拟器

28

我可以将最新的Android源代码下载到Ubuntu虚拟机32位中(主机为Windows 7 64位),并且编译没有任何错误。

然后我尝试按照这些说明操作,里面提到我应该在我的源代码根目录下运行模拟器。但是,当我尝试这样做时,我收到一个错误消息,指出这个命令未找到。

因此,我进入文件夹out/host/linux-x86/bin,发现有几个与模拟器相关的文件:

  • emulator
  • emulator-arm
  • emulator_renderer
  • emulator-ui
  • emulator-x86

当我在这里输入emulatoremulator-x86时,它也无法正常工作。下面是我得到的错误:

xxxx/out/host/linux-x86/bin$ ./emulator-x86
emulator: ERROR: You did not specify a virtual device name, and the system
directory could not be found.

If you are an Android SDK user, please use '@<name>' or '-avd <name>'
to start a given virtual device (see -help-avd for details).

Otherwise, follow the instructions in -help-disk-images to start the emulator

当我运行./emulator-x86 -help-disk-images时,我看到以下内容:
If you are building from the Android build system, you should
have ANDROID_PRODUCT_OUT defined in your environment, and the
emulator shall be able to pick-up the right image files automatically.
See -help-build-images for more details.

我自己构建了这个,所以我认为我的环境变量中已经设置了 ANDROID_PRODUCT_OUT ,但是我没有看到它。所以我认为我应该运行一些其他的 shell 脚本来设置它。
我查看了 img 文件,在位置 out/target/product/generic 看到了几个文件。
  • ramdisk.img
  • system.img
  • userdata.img

有人能为我解惑并协助我下一步该做什么吗?我是 Android 方面的新手,我对此进行了一些研究,但我没有找到任何类似的问题。


可能是Android内核编译和使用Android模拟器测试的重复问题。 - Ciro Santilli OurBigBook.com
10个回答

29

我不知道您是为哪个产品构建的,但要运行模拟器,您可以使用以下命令:

out/host/linux-x86/bin/emulator -sysdir out/target/product/generic/ -system out/target/product/generic/system.img -ramdisk out/target/product/generic/ramdisk.img -data out/target/product/generic/userdata.img -kernel prebuilt/android-arm/kernel/kernel-qemu -sdcard sdcard.img -skindir sdk/emulator/skins -skin WVGA800 -scale 0.7 -memory 512 -partition-size 1024

只需将其复制到名为“.sh”的文件中,放置在Android源代码文件夹的根目录下,并运行该文件即可。或者您也可以直接运行此命令,但首先应该切换到Android源代码文件夹的根目录。

并不要忘记使用“mksdcard”命令在根文件夹中创建SD卡映像。


3
谢谢。我遵循了你的指示,得到了这个结果:模拟器:警告:无法加载皮肤文件'sdk/emulator/skins/WVGA800/layout',正在使用内置的皮肤。模拟器:错误:无效或缺失的内核映像文件:prebuilt/android-arm/kernel/kernel-qemu。 在prebuilt/android-arm/下没有kernel文件夹(只有gdbserver文件夹)。 - windfly2006
我刚刚使用了“repo sync”命令来拉取所有源代码,你有什么想法可以获取预构建的内核吗? - windfly2006
1
如果您在开发机器上将ANDROID_PRODUCT_OUT变量设置为<source rootdir>/out/target/product/generic,模拟器将知道在哪里查找所有系统映像,因此您无需直接指定它们。更好的方法是运行位于Android源代码构建文件夹中的envsetup.sh脚本,然后运行setpaths(由该脚本提供)。这将处理为您的项目设置所有路径和变量,使您可以在构建完成后只需在命令行中键入emulator即可。 - BMB
实际上我先运行了envsetup.sh,然后运行了setpaths,再运行了模拟器,现在它可以找到模拟器了,但我仍然收到错误提示:您没有指定虚拟设备名称,也无法找到系统目录。使用Yury的命令,我可以运行模拟器。不过启动后模拟器屏幕是黑色的,我猜这是一个新问题。 - windfly2006
7
非常感谢,大家。显然我还需要运行设置环境的set_stuff_for_environment,它是从envsetup.sh定义的。在我运行了它之后,现在一切看起来都很好。说明页面上根本没有提到这一点。 - windfly2006
显示剩余4条评论

28

经过长时间的思考和遇到了许多相同的问题后,我找到了一种在新环境下使所有东西正常工作的方法。

环境

首先,请确保您按照安卓建议的更改设置了您的环境,包括更改~/.bashrc 这样推荐

export USE_CCACHE=1
ccache -M 10G

如果您还没有这样做,请按照下载Android源代码的步骤进行操作。
然后为环境设置一些函数:
$ . build/envsetup.sh

您现在应该执行其中一个函数,以便正确设置路径(正如Pingzhong Li所指出的,这在Android构建说明中没有提到!):

$ set_stuff_for_environment

首次构建

开始构建吧!例如:

$ lunch full-eng
$ make -j4

(这里,我的机器最适合使用4个线程。根据需要进行更改。)
构建完成后,只需启动模拟器即可:
$ emulator

后续构建

我发现要重新构建 system.img,需要删除以下文件/目录:

out/target/product/generic/obj/PACKAGING/
out/target/product/generic/system.img

然后简单地重复:
$ make -j4
$ emulator

1
我有些步骤是无序的,但它们起作用了。我的 out 目录在不同的位置。我没有使用 set_stuff_for_environment 进行 envsetup.sh,成功构建后我无法运行模拟器。但是在没有重新构建的情况下使用 set_stuff_for_environment,它使用最新的构建系统启动了模拟器。谢谢。 - Fredrick Gauss

8

如何逐步运行模拟器指南。 在下载的Android AOSP源代码中运行模拟器的步骤如下:

  • 步骤1 如果您已经完成构建并在当前正在运行的终端(Ubuntu)中正确生成了系统映像,则很简单。只需在终端中键入以下命令: emulator

  • 步骤2 如果您之前已经生成了系统映像,并且您已经启动了一个新的终端(Ubuntu),则按照以下命令逐个运行:

    1. source build/envsetup.sh
    2. lunch 1 这里的1是我的午餐类型,您可以用自己的替换它,比如(7,8等)然后最后一步
    3. emulator

这样就可以正确启动模拟器了。 感谢大家,祝编码愉快!


非常好的解释。我苦苦挣扎了几个小时,谢谢你! - Muhammad Adeel Shoukat

4

仅供参考,我曾遇到类似问题,试过多种方法后发现解决方案是在运行envsetup.sh后运行lunch并选择目标,此处目标为aosp_arm-eng。每次启动新的shell都需要这样做,因为它设置了某些环境变量,使模拟器能够运行avd。前提是你已经构建了目标。


3
#!/usr/bin/env bash

ANDROID_BUILD_OUT=/path/to/android/build/output/
ANDROID_SDK_LINUX=/path/to/android/sdk
ANDROID_BUILD=${ANDROID_BUILD_OUT}/android/target/product/generic

${ANDROID_SDK_LINUX}/tools/emulator \
    -sysdir ${ANDROID_BUILD} \
    -system ${ANDROID_BUILD}/system.img \
    -ramdisk ${ANDROID_BUILD}/ramdisk.img \
    -data ${ANDROID_BUILD}/userdata.img \
    -kernel ${ANDROID_SDK_LINUX}/system-images/android-18/armeabi-v7a/kernel-qemu \
    -skindir ${ANDROID_SDK_LINUX}/platforms/android-18/skins \
    -skin WVGA800 \
    -scale 0.7 \
    -memory 512 \
    -partition-size 1024

3
在Mac上,您可以将以下行添加到您的~/.bash_profile文件中。根据需要更改磁盘映像和src文件夹。
# start emulator
function startEmulator { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android;
                         cd /Volumes/android/AndroidSrc;
                         source build/envsetup.sh;
                         lunch aosp_arm-eng;
                         /Volumes/android/AndroidSrc/out/host/darwin-x86/bin/emulator;  }

接下来,请创建一个新的终端并输入以下命令:

startEmulator

您可以启动模拟器。这适用于Mac系统。


1
只需在您的 shell 中键入“emulator”,它将启动最新构建的模拟器,因为其路径已设置为 shell 的 PATH 变量。

0
如果您的计算机上安装了“Android SDK”,则可以从那里选择您的“模拟器”,而不是 /out/.... 目录。 当您想要使用自己的模拟器时,可以将“Android SDK”目录重命名。然后会选中您的“模拟器”。 希望这可以帮助您! 问候, Sammoh

0
export MY_PWD=/work/ABC/Google_Android
export ANDROID_BUILD_TOP=/work/ABC/Google_Android
export PATH=$PATH:$MY_PWD/prebuilts/gcc/linux
export ANDROID_PRODUCT_OUT=$MY_PWD/out/target/product/generic

以上是我的环境设置。 ANDROID_BUILD_TOP已解决

"emulator: ERROR: You did not specify a virtual device name, and the system
directory could not be found"

在我的电脑上


0

我是这样做的

我修改了./build/envsetup.sh文件,只改变了set_stuff_for_environment

function set_stuff_for_environment()
{
    setpaths
    set_sequence_number

    export ANDROID_BUILD_TOP=$(gettop)
    # With this environment variable new GCC can apply colors to warnings/errors
    export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
    export ASAN_OPTIONS=detect_leaks=0

    export ANDROID_PRODUCT_OUT=/var/www/android/out/target/product/generic_x86_64
    echo $ANDROID_PRODUCT_OUT
}

在该项目的根目录下,我创建了一个名为start.sh的文件。
#!/usr/bin/env bash

ANDROID_BUILD_OUT=/var/www/android/out
ANDROID_SDK_LINUX=/opt/android-studio/sdk
ANDROID_BUILD=${ANDROID_BUILD_OUT}/target/product/generic_x86_64

sudo chmod -R 777 /dev/kvm

source build/envsetup.sh

set_stuff_for_environment

./prebuilts/android-emulator/linux-x86_64/emulator \
    -debug-init -logcat '*:v' -verbose \
    -sysdir ${ANDROID_BUILD} \
    -system ${ANDROID_BUILD}/system.img \
    -ramdisk ${ANDROID_BUILD}/ramdisk.img \
    -skindir ${ANDROID_SDK_LINUX}/platforms/android-28/skins \
    -skin WVGA800 \
    -partition-size 2000
    -scale 0.7 \
    -memory 2000 \
    -data ${ANDROID_BUILD}/userdata.img \

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接