【问题标题】:Running emulator after building Android from source从源代码构建 Android 后运行模拟器
【发布时间】:2012-02-19 19:40:33
【问题描述】:

我能够将最新的 android 源代码下载到 32 位 Ubuntu 虚拟机中(主机:Windows 7 64 位)。构建完成,没有任何错误。

然后我尝试关注these instructions,其中提到我应该在源代码的根目录上运行模拟器。但是,当我尝试这样做时,我收到一条错误消息,指出找不到此命令。

所以我去了out/host/linux-x86/bin文件夹,发现emulator*有几个文件:

  • 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-emulator linux-kernel


【解决方案1】:

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

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-尺寸 1024

只需将其复制到 Android 源文件夹根目录下的 .sh 文件中并运行此文件。或者你可以直接运行它,但你应该首先 chdir 到你的 Android 源文件夹根目录。

并且不要忘记使用命令mksdcard在根文件夹中创建一个sdcard图像。

【讨论】:

  • 谢谢。我按照你的指示,我得到了这个:模拟器:警告:无法加载皮肤文件'sdk/emulator/skins/WVGA800/layout',使用内置的一个模拟器:错误:无效或缺少内核映像文件:prebuilt/android-手臂/内核/内核-qemu。 prebuilt/android-arm/ 下没有内核文件夹(我只有 gdbserver 文件夹)
  • 我只是使用“repo sync”来拉取所有源代码,知道如何获取预构建的内核吗?
  • 我已经检查了我所有的来源。他们都有这个目录和这个文件。我认为您的 repo sync 命令没有正确完成。但是,在构建之后,您可以检查是否一切正常,只需运行命令模拟器。
  • 如果您将开发机器上的 ANDROID_PRODUCT_OUT 变量设置为 /out/target/product/generic,模拟器将知道在哪里查找所有系统映像,这样您就不需要直接指定它们。更好的方法是运行位于 android 源代码的 build 文件夹中的脚本 envsetup.sh,然后运行 ​​setpaths(由该脚本提供)。这将负责为您的项目设置所有路径和变量,允许您在构建完成后在命令行上键入 emulator。
  • 非常感谢,伙计们。显然我还需要运行从 envsetup.sh 定义的 set_stuff_for_environment。在我运行之后,现在一切看起来都很好。说明页面根本没有提到这一点。
【解决方案2】:

如果您的机器上有“android sdk”,则可以从那里获取“模拟器”而不是 /out/.... 目录。 当您想使用“自己的”模拟器时,可以重命名“android sdk”目录。然后你的“模拟器”就会被捡起来。

希望对您有所帮助!

问候 萨摩

【讨论】:

    【解决方案3】:

    只需在你的 shell 上输入 emulator ,它就会启动最新版本的模拟器,因为它的路径设置为你 shell 的 PATH 变量。

    【讨论】:

      【解决方案4】:

      在经历了许多令人费解并遇到了许多相同的问题之后,我找到了一种方法来让一切都在新环境中正常工作。

      环境

      首先,确保您将环境设置为 ~/.bashrc that Android recommends 的更改,包括:

      export USE_CCACHE=1
      ccache -M 10G
      

      如果您还没有这样做,请按照 downloading the Android source 的步骤操作。

      然后为环境设置一些功能:

      $ . build/envsetup.sh
      

      您现在应该实际执行其中一个函数来正确设置路径(正如李平中指出的,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
      

      【讨论】:

      • 我做了一些杂乱无章的步骤,但它奏效了。我的out 目录位于不同的位置。我envsetup.shed 没有set_stuff_for_environment 并且在成功构建后我无法运行模拟器。但随后set_stuff_for_environment 没有反抗,它启动了具有最新构建系统的模拟器。谢谢。
      【解决方案5】:
      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"
      

      在我的机器上

      【讨论】:

        【解决方案6】:
        #!/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
        

        【讨论】:

          【解决方案7】:

          在 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。

          【讨论】:

            【解决方案8】:

            仅供参考,我遇到了类似的问题,在尝试了不同的方法后,我发现解决方案正在运行lunch(在运行 envsetup.sh 之后)并在这种情况下选择目标aosp_arm-eng。每次启动新 shell 时都必须这样做,因为它设置了模拟器运行 avd 所需的某些环境变量。前提是您已经构建了目标。

            【讨论】:

              【解决方案9】:

              如何运行模拟器的分步指南。 在下载的 android AOSP 源代码中运行模拟器如下:-

              • 第 1 步 如果您已经在当前运行的终端(Ubuntu)中正确地完成了构建并生成了系统映像,那么它就是向前的。只需在终端中输入以下命令:- 模拟器

              • 第 2 步 如果您之前生成了系统映像并且您已经启动了一个新的终端(Ubuntu),那么请一一运行以下命令:-

                1. source build/envsetup.sh
                2. lunch 1 这里 1 是我的午餐类型,你可以用你的喜欢(7、8 等)替换它,最后
                3. emulator

              就是这样,它会正确地为您的模拟器提供午餐。 谢谢伙计们快乐编码!!!!

              【讨论】:

              • 很好的解释。我挣扎了好几个小时。非常感谢
              【解决方案10】:

              我是这样做的

              我修改了./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 \
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-05-26
                • 1970-01-01
                • 2014-07-14
                • 2012-05-21
                • 2021-01-17
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多