Friday, January 4, 2013

How to launch Windows Phone 8 emulator on virtual machine


One of most remarkable events at 2012 was Windows roll-out: desktop Windows 8, tablet Windows RT and mobile Windows Phone 8 (here and after, WP8). Personally I'm a bit of Windows Phone evangelist and Windows Phone 8 launch, even delayed for few months, was a big interest for me, so I was eager to try it.
After WP8 SDK installation attempt, I learned that my Windows 7 workplace is obsolete. Almost no surprise here: if you need Win7 instead of old good WinXP to do WP7 development, why don't you need to upgrade your PC to Win8 before starting with WP8? Anyway, it was no reason (and no time, as usual) to re-settle my working environment from Win7 to Win8 just to try the new technology. The answer was stright-forward: let use virtual machine! So, the toolchain was obvious from the first glance: Win7 as a host, Win8 as a guest on virtual machine, then WP8 emulator to try the new SDK. After a long-enough time installing all the staff, the toolchain just failed on very last step. WP8 emulator been failed to launch, accompanied with incomprehensible error messages (very famous Microsoft-style, you can say).
Finally, if you're looking just for working solution, I can redirect you to one of proven ways to fix the problem: http://stackoverflow.com/questions/13148828/unable-to-create-the-virtual-machine. But if you're interested to take a deeper look, welcome to this note...

What did Shaman say?

Search engines do a big favor: they give us a recipe with lightning speed. So what's the problem, you can ask. The problem is: do you understand that recipe? Really understand in details, do you? This is why I did following research on Christmas days to understand why the StackOverflow topic does the trick.

Getting started

So, to repeat the picture step-by-step, you'll need the following:

  • VmWare Player 5, which is free for non-commercial use (you can use VmWare Workstation 9 if you have licenses bought)
  • Windows 8
  • virtual machine - ask your admins to help you (you can spend a lot of time if bake it by yourself)
  • WP8 SDK, as Web installer or full ISO (let me encourage you to do ISO download so you can mount it to virtual machines as a DVD drive then)
The rest of the process is trivial but time-consuimg: start the virtual machine, install the SDK, create hello-world empty project, compile and run... should I say "try to run"? What obstacles you may face along the way?

Hardware requirements

First possible pitfall is... your CPU! In short, you passed this step if you have Intel i3/i5/i7 processor as they all do Second Level Address Translation (SLAT) capability. Otherwise, you should check this brilliant wiki for extended description.
OK, let assume you have capable CPU. Let investigate in details what happens if you try to launch WP8 emulator then.

Where is my virtualization, dude?

While you're trying to first-launch your WP8 hello-world project, the following popup appears:

Windows Phone Emulator
You don't have permission to modify internal Hyper-V network adapter settings required to run the emulator
Click "Retry" to run the emulator in elevated mode.
[Retry] [Close]

Clicking on [Retry] button, emulator window appears saying it launching the OS... and after a couple of minutes, "Generic failure" popup terminates that pity show.
To resolve this, let take a look at VmWare virtualization settings. You can edit virtual machine settings and make sure that "Processor" device has "Virtualize Intel VT-x/EPT or AMD-V/RVI" flag as ticked on. Alternatively, you can manually edit VMX file of your virtual machine image and set this option as true:

vhv.enable = "TRUE"
Both ways, you have to switch the virtual machine off before, make changes, then start the virtual machine again. Try again to launch your WP8 hello-world project. You see? Same failure, again.

VmWare hidden treasure

Rumor has it. VmWare Workstation 9, the latest "mature" product of VmWare Inc will let WP8 emulator working as a charm if virtualization flag (see previous chapter) is on. In my case, I have only Player edition, but the same rumor (namely StackOverflow.com, see URL above) says you can manage non-official keys at VMX file, and following addendum will do the trick:

vhv.enable = "TRUE"
hypervisor.cpuid.v0 = "FALSE"
See the last line? That's it, shaman said you have to set this to false. And it works! The only popup you can face now is
Windows Phone Emulator
Do you want to configure the emulator to connect to the Internet?
Your PC may lose its network connectivity while the changes are applied. This may affect any network operations in progress.
[Yes] [No]

Clicking [Yes] you will see very short delay and then, ta-da, your emulator is fully operational! Shaman said, set this to false. Shaman doesn't explain. Follow the word of Shaman, do you?

Disobey the word

Feeling some contradiction sense, I tried to flip the non-documented settings to true, expecting the punishment from Heavens. But nothing has been changed! Finally I cropped the cpuid line to empty value:

vhv.enable = "TRUE"
hypervisor.cpuid.v0 = ""

Again, emulator still working as a charm! Switching off the virtual machine, rebuilding the project - still operational. Just the cpuid key presence is a "key to success" for WP8 emulator. True, false, empty value - everything suits us. Hmmm, that's interesting!

Failure ahead!

Thanks to the same contradiction sense, I did the following tweak at VMX file:

vhv.enable = "FALSE"
hypervisor.cpuid.v0 = ""

Namely, I switched off the virtualization support but keep that non-documented cpuid setting active. Restarting the virtual machine, I was expecting the failure. But I was really surprised with new (and very clear) popup:

Windows Phone Emulator
Can't start the Windows Phone Emulator
The Windows Phone Emulator requires Hyper-V. Your PC is missing the following pre-requisites required to run Hyper-V:

- Second Level Address Translation

More information

[Close]
You see? It complains about SLAT support feature, like we don't have capable CPU! But host CPU is Intel i7-930, with SLAT feature onboard. So, with virtualization off AND with cpuid on, guest OS will provide exact error message instead of abstract "lack of permission".
Note: Don't forget to re-enable virtualization support back to operational state!

Other reasons to fail

To be fair, there are more ways to get WP8 emulator failed to run. Let me name two more (if you know another reason, just post a comment here, big thanks in advance):

  1. Insufficient CPU cores
  2. Not enough memory

Reason 1: WP8 as a platform intends at least two CPU cores available. So if you allocate single core for your virtual machine, emulator will fail with following message:

Windows Phone Emulator
The Windows Phone Emulator wasn't able to ensure the virtual machine was running:

Something happened while starting a virtual machine: 'Emulator WVGA 512MB.user' could not initialize. (Virtual machine ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)

The processor topology specified for the virtual machine cannot be supported by this host. For instance, this can happen when the virtual processor or socket count for the virtual machine exceeds the logical processor or socket count for the host.

[Close]

Reason 2 : memory, RAM size. In old good days it was a useful habit to allocate not more than 1 gig of RAM to any virtual machine, otherwise your host OS may nearly die. For WP8 development, it's not true anymore. With 1Gb RAM limit, WP8 emulator will unable to get 512Mb of free RAM. Popup message is clear:

Windows Phone Emulator
The Windows Phone Emulator wasn't able to ensure the virtual machine was running:

Something happened while starting a virtual machine: 'Emulator WVGA 512MB.user' could not initialize. (Virtual machine ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)

Not enough memory in the system to start the virtual machine Emulator WVGA 512MB.user with ram size 512 megabytes. (Virtual machine ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)

[Close]
So, it's nice to allocate at least 1.5Gb RAM for our virtual machine. And even that case, you can't launch WP8 emulators other than simplest 512Mb mode. Bye-bye, WVGA/WXGA/720p emulators, you're too memory-hungry!

Update 1: one more issue with Windows Phone 8 emulator is adderssed here: http://www.timmykokke.com/2013/01/windows-phone-emulator-hyper-v-error

Update 2: Comment from Hank User "I found that SLAT capabilities will not be properly detected, if the VMWare Tools are missing from the machine. You may want to consider that, if you try this at home."

Recap

Despite the two-level virtuality (WP8 emulator is a Hyper-V virtual machine which launched on Win8 guest OS under VmWare running on Win7 host), the toolchain is stable and performs with almost no delays. This contradicts with my previous experience of double-virtualization while launching Meego on Qemu running at Linux guest at Windows host (terrible delays up to 20-30 seconds on each mouse movement).
So, everything is fine. The only requirements are:

  • SLAT-capable CPU (any of Intel i-series, plus some others)
  • virtualization enabled at BIOS level
  • "non-documented" key hypervisor.cpuid.v0 = "" at VMX file
  • virtual machine with enabled virtualization as vhv.enable = "TRUE"
  • at least two CPU cores for the virtual machine
  • at least 1.5Gb RAM for the virtual machine, 4Gb recommended (if you plan to launch any WP8 emulator), which naturally leads to 64-bit host OS, with at least 8Gb RAM onboard

3 comments:

  1. Thanks for sharing this.

    But..

    I have tried everything mentioned above and getting the same error stil...Could you please assist me...?

    The Windows Phone Emulator wasn't ablt to create the virtual mchine:

    Generic Failure

    with "Invalid Pointer" build error.




    I have Win8 VM (Player ) on my Windows 7 machine


    Host machine
    RAM 8GB

    VM
    RAM allocated :L 4GB
    No. of Processor cores: 2
    Set the following .vmx file
    vhv.enable = "TRUE"
    hypervisor.cpuid.v0 = ""

    when i try to run the emulator EMULATOR WVGA 512MB (through sample sdkWEatherForcecastCS vs solution)



    ReplyDelete
    Replies
    1. Couple of questions:
      1) What version of VmWare Player do you use?
      2) Do you see the same error if shutdown the guest OS, close the Player and then re-launch them back?
      3) Do you see the same error if creating standalone WP8 application via Visual Studio Wizard?
      4) What is your CPU model?
      5) In Win8, could you run Hyper-V Manager and try to create new virtual machine inside? (right pane -> Actions -> New -> Virtual Machine, then click Next sequentially with everything set to default)

      Delete
  2. Thanks, it totally worked for me ;3

    ReplyDelete