install_emulator_deps.py revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#!/usr/bin/env python
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Copyright (c) 2013 The Chromium Authors. All rights reserved.
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# found in the LICENSE file.
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)"""Installs deps for using SDK emulator for testing.
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)The script will download the SDK and system images, if they are not present, and
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)install and enable KVM, if virtualization has been enabled in the BIOS.
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)"""
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import logging
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import os
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import shutil
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import sys
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from pylib import cmd_helper
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from pylib import constants
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from pylib.utils import run_tests_helper
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# From the Android Developer's website.
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SDK_BASE_URL = 'http://dl.google.com/android/adt'
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SDK_ZIP = 'adt-bundle-linux-x86_64-20130219.zip'
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Android x86 system image from the Intel website:
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# http://software.intel.com/en-us/articles/intel-eula-x86-android-4-2-jelly-bean-bin
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)X86_IMG_URL = 'http://download-software.intel.com/sites/landingpage/android/sysimg_x86-17_r01.zip'
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Android API level
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)API_TARGET = 'android-%s' % constants.ANDROID_SDK_VERSION
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def CheckSDK():
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """Check if SDK is already installed.
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Returns:
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    True if android_tools directory exists in current directory.
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return os.path.exists(os.path.join(constants.EMULATOR_SDK_ROOT,
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     'android_tools'))
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def CheckX86Image():
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """Check if Android system images have been installed.
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Returns:
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    True if android_tools/sdk/system-images directory exists.
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return os.path.exists(os.path.join(constants.EMULATOR_SDK_ROOT,
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     'android_tools', 'sdk', 'system-images',
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     API_TARGET, 'x86'))
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def CheckKVM():
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """Check if KVM is enabled.
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Returns:
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    True if kvm-ok returns 0 (already enabled)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  try:
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return not cmd_helper.RunCmd(['kvm-ok'])
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  except OSError:
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    logging.info('kvm-ok not installed')
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return False
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def GetSDK():
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """Download the SDK and unzip in android_tools directory."""
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  logging.info('Download Android SDK.')
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sdk_url = '%s/%s' % (SDK_BASE_URL, SDK_ZIP)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  try:
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cmd_helper.RunCmd(['curl', '-o', '/tmp/sdk.zip', sdk_url])
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    print 'curled unzipping...'
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    rc = cmd_helper.RunCmd(['unzip', '-o', '/tmp/sdk.zip', '-d', '/tmp/'])
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if rc:
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      logging.critical('ERROR: could not download/unzip Android SDK.')
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      raise
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # Get the name of the sub-directory that everything will be extracted to.
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dirname, _ = os.path.splitext(SDK_ZIP)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    zip_dir = '/tmp/%s' % dirname
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # Move the extracted directory to EMULATOR_SDK_ROOT
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dst = os.path.join(constants.EMULATOR_SDK_ROOT, 'android_tools')
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    shutil.move(zip_dir, dst)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  finally:
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    os.unlink('/tmp/sdk.zip')
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def InstallKVM():
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """Installs KVM packages."""
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rc = cmd_helper.RunCmd(['sudo', 'apt-get', 'install', 'kvm'])
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if rc:
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    logging.critical('ERROR: Did not install KVM. Make sure hardware '
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     'virtualization is enabled in BIOS (i.e. Intel VT-x or '
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     'AMD SVM).')
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # TODO(navabi): Use modprobe kvm-amd on AMD processors.
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rc = cmd_helper.RunCmd(['sudo', 'modprobe', 'kvm-intel'])
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if rc:
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    logging.critical('ERROR: Did not add KVM module to Linux Kernal. Make sure '
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     'hardware virtualization is enabled in BIOS.')
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # Now check to ensure KVM acceleration can be used.
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  rc = cmd_helper.RunCmd(['kvm-ok'])
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if rc:
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    logging.critical('ERROR: Can not use KVM acceleration. Make sure hardware '
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     'virtualization is enabled in BIOS (i.e. Intel VT-x or '
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     'AMD SVM).')
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def GetX86Image():
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  """Download x86 system image from Intel's website."""
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  logging.info('Download x86 system image directory into sdk directory.')
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  try:
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cmd_helper.RunCmd(['curl', '-o', '/tmp/x86_img.zip', X86_IMG_URL])
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    rc = cmd_helper.RunCmd(['unzip', '-o', '/tmp/x86_img.zip', '-d', '/tmp/'])
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if rc:
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      logging.critical('ERROR: Could not download/unzip image zip.')
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      raise
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    sys_imgs = os.path.join(constants.EMULATOR_SDK_ROOT, 'android_tools', 'sdk',
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            'system-images', API_TARGET, 'x86')
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    shutil.move('/tmp/x86', sys_imgs)
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  finally:
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    os.unlink('/tmp/x86_img.zip')
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def main(argv):
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  logging.basicConfig(level=logging.INFO,
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      format='# %(asctime)-15s: %(message)s')
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  run_tests_helper.SetLogLevel(verbose_count=1)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # Calls below will download emulator SDK and/or system images only if needed.
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if CheckSDK():
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    logging.info('android_tools directory already exists (not downloading).')
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else:
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetSDK()
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  logging.info('Emulator deps for ARM emulator complete.')
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if CheckX86Image():
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    logging.info('system-images directory already exists.')
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else:
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GetX86Image()
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # Make sure KVM packages are installed and enabled.
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if CheckKVM():
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    logging.info('KVM already installed and enabled.')
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else:
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    InstallKVM()
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)if __name__ == '__main__':
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sys.exit(main(sys.argv))
152