diff options
Diffstat (limited to 'build/android/pylib/utils/emulator.py')
-rwxr-xr-x | build/android/pylib/utils/emulator.py | 81 |
1 files changed, 39 insertions, 42 deletions
diff --git a/build/android/pylib/utils/emulator.py b/build/android/pylib/utils/emulator.py index 70afffb..df77c52 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: |