| Index: build/android/pylib/utils/emulator.py
|
| diff --git a/build/android/pylib/utils/emulator.py b/build/android/pylib/utils/emulator.py
|
| index 70afffb2efc2cbe011bb36b21ff3680c6f5c9f6f..df77c52e64654731aa735640700ff520382851a4 100755
|
| --- a/build/android/pylib/utils/emulator.py
|
| +++ b/build/android/pylib/utils/emulator.py
|
| @@ -23,14 +23,15 @@ import time_profile
|
| # TODO(craigdh): Move these pylib dependencies to pylib/utils/.
|
| from pylib import android_commands
|
| from pylib import cmd_helper
|
| +from pylib import constants
|
|
|
| -# adb_interface.py is under ../../third_party/android_testrunner/
|
| -sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..',
|
| - '..', 'third_party', 'android_testrunner'))
|
| -import adb_interface
|
| import errors
|
| import run_command
|
|
|
| +# Android API level
|
| +API_TARGET = 'android-%s' % constants.ANDROID_SDK_VERSION
|
| +
|
| +
|
| class EmulatorLaunchException(Exception):
|
| """Emulator failed to launch."""
|
| pass
|
| @@ -101,11 +102,13 @@ def _GetAvailablePort():
|
| return port
|
|
|
|
|
| -def LaunchEmulators(emulator_count, wait_for_boot=True):
|
| +def LaunchEmulators(emulator_count, abi, wait_for_boot=True):
|
| """Launch multiple emulators and wait for them to boot.
|
|
|
| Args:
|
| emulator_count: number of emulators to launch.
|
| + abi: the emulator target platform
|
| + wait_for_boot: whether or not to wait for emulators to boot up
|
|
|
| Returns:
|
| List of emulators.
|
| @@ -113,12 +116,10 @@ def LaunchEmulators(emulator_count, wait_for_boot=True):
|
| emulators = []
|
| for n in xrange(emulator_count):
|
| t = time_profile.TimeProfile('Emulator launch %d' % n)
|
| - avd_name = None
|
| - if n > 0:
|
| - # Creates a temporary AVD for the extra emulators.
|
| - avd_name = 'run_tests_avd_%d' % n
|
| + # Creates a temporary AVD.
|
| + avd_name = 'run_tests_avd_%d' % n
|
| logging.info('Emulator launch %d with avd_name=%s', n, avd_name)
|
| - emulator = Emulator(avd_name)
|
| + emulator = Emulator(avd_name, abi)
|
| emulator.Launch(kill_all_emulators=n == 0)
|
| t.Stop()
|
| emulators.append(emulator)
|
| @@ -159,38 +160,29 @@ class Emulator(object):
|
| # Time to wait for a "wait for boot complete" (property set on device).
|
| _WAITFORBOOT_TIMEOUT = 300
|
|
|
| - def __init__(self, new_avd_name):
|
| + def __init__(self, avd_name, abi='x86'):
|
| """Init an Emulator.
|
|
|
| Args:
|
| - nwe_avd_name: If set, will create a new temporary AVD.
|
| + avd_name: name of the AVD to create
|
| + abi: target platform for emulator being created
|
| """
|
| - try:
|
| - android_sdk_root = os.environ['ANDROID_SDK_ROOT']
|
| - except KeyError:
|
| - logging.critical('The ANDROID_SDK_ROOT must be set to run the test on '
|
| - 'emulator.')
|
| - raise
|
| + android_sdk_root = os.path.join(constants.EMULATOR_SDK_ROOT,
|
| + 'android_tools', 'sdk')
|
| self.emulator = os.path.join(android_sdk_root, 'tools', 'emulator')
|
| self.android = os.path.join(android_sdk_root, 'tools', 'android')
|
| self.popen = None
|
| self.device = None
|
| - self.default_avd = True
|
| - self.abi = 'armeabi-v7a'
|
| - self.avd = 'avd_armeabi'
|
| - if 'x86' in os.environ.get('TARGET_PRODUCT', ''):
|
| - self.abi = 'x86'
|
| - self.avd = 'avd_x86'
|
| - if new_avd_name:
|
| - self.default_avd = False
|
| - self.avd = self._CreateAVD(new_avd_name)
|
| + self.abi = abi
|
| + self.avd_name = avd_name
|
| + self._CreateAVD()
|
|
|
| def _DeviceName(self):
|
| """Return our device name."""
|
| port = _GetAvailablePort()
|
| return ('emulator-%d' % port, port)
|
|
|
| - def _CreateAVD(self, avd_name):
|
| + def _CreateAVD(self):
|
| """Creates an AVD with the given name.
|
|
|
| Return avd_name.
|
| @@ -199,9 +191,9 @@ class Emulator(object):
|
| self.android,
|
| '--silent',
|
| 'create', 'avd',
|
| - '--name', avd_name,
|
| + '--name', self.avd_name,
|
| '--abi', self.abi,
|
| - '--target', 'android-16',
|
| + '--target', API_TARGET,
|
| '-c', '128M',
|
| '--force',
|
| ]
|
| @@ -212,7 +204,7 @@ class Emulator(object):
|
| avd_process.stdin.write('no\n')
|
| avd_process.wait()
|
| logging.info('Create AVD command: %s', ' '.join(avd_command))
|
| - return avd_name
|
| + return self.avd_name
|
|
|
| def _DeleteAVD(self):
|
| """Delete the AVD of this emulator."""
|
| @@ -246,17 +238,23 @@ class Emulator(object):
|
| # The default /data size is 64M.
|
| # That's not enough for 8 unit test bundles and their data.
|
| '-partition-size', '512',
|
| - # Enable GPU by default.
|
| - '-gpu', 'on',
|
| # Use a familiar name and port.
|
| - '-avd', self.avd,
|
| - '-port', str(port)]
|
| - emulator_command.extend([
|
| - # Wipe the data. We've seen cases where an emulator
|
| - # gets 'stuck' if we don't do this (every thousand runs or
|
| - # so).
|
| + '-avd', self.avd_name,
|
| + '-port', str(port),
|
| + # Wipe the data. We've seen cases where an emulator gets 'stuck' if we
|
| + # don't do this (every thousand runs or so).
|
| '-wipe-data',
|
| - ])
|
| + # Enable GPU by default.
|
| + '-gpu', 'on',
|
| + '-qemu', '-m', '1024',
|
| + ]
|
| + if self.abi == 'x86':
|
| + emulator_command.extend([
|
| + # For x86 emulator --enable-kvm will fail early, avoiding accidental
|
| + # runs in a slow mode (i.e. without hardware virtualization support).
|
| + '--enable-kvm',
|
| + ])
|
| +
|
| logging.info('Emulator launch command: %s', ' '.join(emulator_command))
|
| self.popen = subprocess.Popen(args=emulator_command,
|
| stderr=subprocess.STDOUT)
|
| @@ -317,8 +315,7 @@ class Emulator(object):
|
|
|
| def Shutdown(self):
|
| """Shuts down the process started by launch."""
|
| - if not self.default_avd:
|
| - self._DeleteAVD()
|
| + self._DeleteAVD()
|
| if self.popen:
|
| self.popen.poll()
|
| if self.popen.returncode == None:
|
|
|