Merge "Use jdk.GetJavaExecutable() in tools."
diff --git a/tools/api_sample_coverage.py b/tools/api_sample_coverage.py
index b14ad1a..4eea8c7 100755
--- a/tools/api_sample_coverage.py
+++ b/tools/api_sample_coverage.py
@@ -8,6 +8,7 @@
 '''
 
 import argparse
+import jdk
 import os
 import subprocess
 import utils
@@ -23,16 +24,17 @@
   if output_dir is None:
     output_dir = ''
 
+  javaExecutable = jdk.GetJavaExecutable()
   printseeds_path = os.path.join(output_dir, 'keep-seeds.txt')
   printseeds_args = [
-    'java', '-jar', utils.R8_JAR, 'printseeds',
+    javaExecutable, '-jar', utils.R8_JAR, 'printseeds',
     utils.RT_JAR, utils.R8_JAR, utils.R8LIB_KEEP_RULES,
   ]
   write_sorted_lines(printseeds_args, printseeds_path)
 
   printuses_path = os.path.join(output_dir, 'sample-uses.txt')
   printuses_args = [
-    'java', '-jar', utils.R8_JAR, 'printuses',
+    javaExecutable, '-jar', utils.R8_JAR, 'printuses',
     utils.RT_JAR, utils.R8_JAR, API_SAMPLE_JAR,
   ]
   write_sorted_lines(printuses_args, printuses_path)
diff --git a/tools/archive.py b/tools/archive.py
index d8fb4d0..9de199c 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -5,6 +5,7 @@
 
 import create_maven_release
 import gradle
+import jdk
 import optparse
 import os
 import shutil
@@ -25,7 +26,9 @@
   return result.parse_args()
 
 def GetToolVersion(jar_path):
-  output = subprocess.check_output(['java', '-jar', jar_path, '--version'])
+  output = subprocess.check_output([
+    jdk.GetJavaExecutable(), '-jar', jar_path, '--version'
+  ])
   return output.splitlines()[0].strip()
 
 def GetVersion():
diff --git a/tools/asmifier.py b/tools/asmifier.py
index 280c6f1..3080378 100755
--- a/tools/asmifier.py
+++ b/tools/asmifier.py
@@ -4,6 +4,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 import gradle
+import jdk
 import os
 import subprocess
 import sys
@@ -13,7 +14,7 @@
   if build:
     gradle.RunGradle(['copyMavenDeps'])
   cmd = []
-  cmd.append('java')
+  cmd.append(jdk.GetJavaExecutable())
   cp = ":".join([os.path.join(utils.REPO_ROOT, 'build/deps/asm-6.2.1.jar'),
                  os.path.join(utils.REPO_ROOT, 'build/deps/asm-util-6.2.1.jar')])
   cmd.extend(['-cp', cp])
diff --git a/tools/build_r8lib.py b/tools/build_r8lib.py
index 5368f6f..980715e 100755
--- a/tools/build_r8lib.py
+++ b/tools/build_r8lib.py
@@ -10,6 +10,7 @@
 
 import argparse
 import gradle
+import jdk
 import os
 import subprocess
 import toolhelper
@@ -76,7 +77,8 @@
 
 def test_d8sample(paths):
   with utils.TempDir() as path:
-    args = ['java', '-cp', '%s:%s' % (SAMPLE_JAR, ":".join(paths)),
+    args = [jdk.GetJavaExecutable(),
+            '-cp', '%s:%s' % (SAMPLE_JAR, ":".join(paths)),
             'com.android.tools.apiusagesample.D8ApiUsageSample',
             '--output', path,
             '--min-api', str(API_LEVEL),
@@ -94,7 +96,8 @@
     # R8CommandParser should have been minified in LIB_JAR.
     # Just in case R8CommandParser is also present in LIB_JAR, we put
     # SAMPLE_JAR first on the classpath to use its version of R8CommandParser.
-    args = ['java', '-cp', '%s:%s' % (SAMPLE_JAR, ":".join(paths)),
+    args = [jdk.GetJavaExecutable(),
+            '-cp', '%s:%s' % (SAMPLE_JAR, ":".join(paths)),
             'com.android.tools.r8.R8CommandParser',
             '--output', path + "/output.zip",
             '--min-api', str(API_LEVEL),
@@ -111,7 +114,8 @@
     # R8CommandParser should have been minified in LIB_JAR.
     # Just in case R8CommandParser is also present in LIB_JAR, we put
     # SAMPLE_JAR first on the classpath to use its version of R8CommandParser.
-    args = ['java', '-cp', '%s:%s' % (SAMPLE_JAR, ":".join(paths)),
+    args = [jdk.GetJavaExecutable(),
+            '-cp', '%s:%s' % (SAMPLE_JAR, ":".join(paths)),
             'com.android.tools.r8.R8CommandParser',
             '--classfile',
             '--output', path + "/output.jar",
diff --git a/tools/build_sample_apk.py b/tools/build_sample_apk.py
index 9053e23..29f7459 100755
--- a/tools/build_sample_apk.py
+++ b/tools/build_sample_apk.py
@@ -8,6 +8,7 @@
 import apk_utils
 import fnmatch
 import glob
+import jdk
 import optparse
 import os
 import shutil
@@ -21,7 +22,7 @@
 DEFAULT_AAPT = 'aapt' # Assume in path.
 DEFAULT_D8 = os.path.join(utils.REPO_ROOT, 'tools', 'd8.py')
 DEFAULT_DEXSPLITTER = os.path.join(utils.REPO_ROOT, 'tools', 'dexsplitter.py')
-DEFAULT_JAVAC = 'javac'
+DEFAULT_JAVAC = jdk.GetJavacExecutable()
 SRC_LOCATION = 'src/com/android/tools/r8/sample/{app}/*.java'
 DEFAULT_KEYSTORE = os.path.join(os.getenv('HOME'), '.android', 'debug.keystore')
 PACKAGE_PREFIX = 'com.android.tools.r8.sample'
diff --git a/tools/gradle.py b/tools/gradle.py
index 374f885..232e96d 100755
--- a/tools/gradle.py
+++ b/tools/gradle.py
@@ -44,9 +44,15 @@
   utils.EnsureDepFromGoogleCloudStorage(
     GRADLE, GRADLE_TGZ, GRADLE_SHA1, 'Gradle binary')
 
+def EnsureJdk():
+  jdkHome = jdk.GetJdkHome()
+  jdkTgz = jdkHome + '.tar.gz'
+  jdkSha1 = jdkTgz + '.sha1'
+  utils.EnsureDepFromGoogleCloudStorage(jdkHome, jdkTgz, jdkSha1, 'JDK')
+
 def EnsureDeps():
   EnsureGradle()
-  jdk.EnsureJdk()
+  EnsureJdk()
 
 def RunGradleIn(gradleCmd, args, cwd, throw_on_failure=True, env=None):
   EnsureDeps()
diff --git a/tools/jdk.py b/tools/jdk.py
index 5a20901..5791e50 100755
--- a/tools/jdk.py
+++ b/tools/jdk.py
@@ -3,40 +3,33 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+import defines
 import os
 import sys
-import utils
 
-JDK_DIR = os.path.join(utils.REPO_ROOT, 'third_party', 'openjdk')
+JDK_DIR = os.path.join(defines.THIRD_PARTY, 'openjdk')
 
 def GetJdkHome():
   root = os.path.join(JDK_DIR, 'openjdk-9.0.4')
-  if utils.IsLinux():
+  if defines.IsLinux():
     return os.path.join(root, 'linux')
-  elif utils.IsOsX():
+  elif defines.IsOsX():
     return os.path.join(root, 'osx')
-  elif utils.IsWindows():
+  elif defines.IsWindows():
     return os.path.join(root, 'windows')
   else:
     return os.environ['JAVA_HOME']
-  return jdkHome
 
 def GetJavaExecutable(jdkHome=None):
   jdkHome = jdkHome if jdkHome else GetJdkHome()
-  executable = 'java.exe' if utils.IsWindows() else 'java'
+  executable = 'java.exe' if defines.IsWindows() else 'java'
   return os.path.join(jdkHome, 'bin', executable) if jdkHome else executable
 
 def GetJavacExecutable(jdkHome=None):
   jdkHome = jdkHome if jdkHome else GetJdkHome()
-  executable = 'javac.exe' if utils.IsWindows() else 'javac'
+  executable = 'javac.exe' if defines.IsWindows() else 'javac'
   return os.path.join(jdkHome, 'bin', executable) if jdkHome else executable
 
-def EnsureJdk():
-  jdkHome = GetJdkHome()
-  jdkTgz = jdkHome + '.tar.gz'
-  jdkSha1 = jdkTgz + '.sha1'
-  utils.EnsureDepFromGoogleCloudStorage(jdkHome, jdkTgz, jdkSha1, 'JDK')
-
 def Main():
   print GetJdkHome()
 
diff --git a/tools/proguard.py b/tools/proguard.py
index 640094f..b1bde54 100755
--- a/tools/proguard.py
+++ b/tools/proguard.py
@@ -6,6 +6,7 @@
 # Run ProGuard, Google's internal version
 
 from __future__ import print_function
+import jdk
 import os
 import subprocess
 import sys
@@ -19,7 +20,7 @@
   cmd = []
   if track_memory_file:
     cmd.extend(['tools/track_memory.sh', track_memory_file])
-  cmd.extend(['java', '-jar', PROGUARD_JAR])
+  cmd.extend([jdk.GetJavaExecutable(), '-jar', PROGUARD_JAR])
   cmd.extend(args)
   utils.PrintCmd(cmd)
   subprocess.call(cmd, stdout=stdout, stderr=stderr)
diff --git a/tools/retrace.py b/tools/retrace.py
index 1b77e9a..44120f2 100755
--- a/tools/retrace.py
+++ b/tools/retrace.py
@@ -5,6 +5,7 @@
 
 import archive
 import argparse
+import jdk
 import subprocess
 import sys
 import tempfile
@@ -49,7 +50,9 @@
       print('Could not find map file from argument: %s.' % hashOrVersion)
       return 1
 
-  retrace_args = ['java', '-jar', utils.RETRACE_JAR, r8lib_map_path]
+  retrace_args = [
+    jdk.GetJavaExecutable(), '-jar', utils.RETRACE_JAR, r8lib_map_path
+  ]
   if args.stacktrace:
     retrace_args.append(args.stacktrace)
 
diff --git a/tools/run_on_as_app.py b/tools/run_on_as_app.py
index 2889d74..506c583 100755
--- a/tools/run_on_as_app.py
+++ b/tools/run_on_as_app.py
@@ -7,6 +7,7 @@
 import apk_utils
 import golem
 import gradle
+import jdk
 import os
 import optparse
 import shutil
@@ -177,7 +178,7 @@
 
   # Use the copy of r8.jar if it is there.
   if os.path.isfile(r8_jar):
-    cmd = ['java', '-ea', '-jar', r8_jar, 'extractmarker', apk]
+    cmd = [jdk.GetJavaExecutable(), '-ea', '-jar', r8_jar, 'extractmarker', apk]
   else:
     script = os.path.join(utils.TOOLS_DIR, 'extractmarker.py')
     cmd = ['python', script, apk]
@@ -493,7 +494,7 @@
   # is 'r8'.
   entry_point = 'com.android.tools.r8.R8'
 
-  cmd = ['java', '-ea:com.android.tools.r8...', '-cp', r8_jar, entry_point,
+  cmd = [jdk.GetJavaExecutable(), '-ea:com.android.tools.r8...', '-cp', r8_jar, entry_point,
       '--release', '--min-api', str(min_sdk), '--pg-conf', proguard_config_file,
       '--lib', android_jar, '--output', zip_dest, apk]
 
diff --git a/tools/run_proguard_dx_on_app.py b/tools/run_proguard_dx_on_app.py
index e78d5d1..4e408ff 100755
--- a/tools/run_proguard_dx_on_app.py
+++ b/tools/run_proguard_dx_on_app.py
@@ -13,6 +13,7 @@
 import argparse
 import fnmatch
 import gmscore_data
+import jdk
 import os
 import stat
 import sys
@@ -140,7 +141,7 @@
     if options.print_memoryuse:
       track_memory_file = join(temp, utils.MEMORY_USE_TMP_FILE)
       cmd.extend(['tools/track_memory.sh', track_memory_file])
-    cmd.extend(['java', '-jar', jar, '--multi-dex',
+    cmd.extend([jdk.GetJavaExecutable(), '-jar', jar, '--multi-dex',
         '--output=' + outdir])
     if 'min-api' in values_proguarded:
       cmd.append('--min-sdk-version=' + values_proguarded['min-api'])
diff --git a/tools/test_aosp_jar.py b/tools/test_aosp_jar.py
index bf12045..6f7e8f5 100755
--- a/tools/test_aosp_jar.py
+++ b/tools/test_aosp_jar.py
@@ -10,6 +10,7 @@
 from itertools import chain
 from os.path import join
 import argparse
+import jdk
 import os
 import subprocess
 import sys
@@ -36,7 +37,7 @@
   if not args.no_build:
     gradle.RunGradle(['CompatDx'])
 
-  cmd = [REPLAY_SCRIPT, 'java', '-jar', utils.COMPATDX_JAR]
+  cmd = [REPLAY_SCRIPT, jdk.GetJavaExecutable(), '-jar', utils.COMPATDX_JAR]
   utils.PrintCmd(cmd)
   subprocess.check_call(cmd)
 
diff --git a/tools/test_framework.py b/tools/test_framework.py
index 7400541..f30d7d9 100755
--- a/tools/test_framework.py
+++ b/tools/test_framework.py
@@ -21,6 +21,7 @@
 from glob import glob
 import argparse
 import golem
+import jdk
 import os
 import re
 import subprocess
@@ -96,7 +97,7 @@
 
     if tool_file.endswith('.jar'):
       assert xmx is not None
-      cmd.extend(['java', xmx, '-jar'])
+      cmd.extend([jdk.GetJavaExecutable(), xmx, '-jar'])
 
     cmd.extend([tool_file] + tool_args + [FRAMEWORK_JAR])
 
diff --git a/tools/test_self_retrace.py b/tools/test_self_retrace.py
index 6e48aa6..46cb1d9 100755
--- a/tools/test_self_retrace.py
+++ b/tools/test_self_retrace.py
@@ -7,6 +7,7 @@
 from __future__ import division
 from __future__ import print_function
 import gradle
+import jdk
 import os
 import subprocess
 import sys
@@ -37,7 +38,9 @@
     raise Exception("Only one argument is allowed, see '--help'.")
 
   # Run 'r8 --help' which throws an exception.
-  cmd = ['java','-cp', r8lib, 'com.android.tools.r8.R8', '--help']
+  cmd = [
+    jdk.GetJavaExecutable(),'-cp', r8lib, 'com.android.tools.r8.R8', '--help'
+  ]
   os.environ["R8_THROW_EXCEPTION_FOR_TESTING_RETRACE"] = "1"
   utils.PrintCmd(cmd)
   p = subprocess.Popen(cmd, stderr=subprocess.PIPE)
@@ -48,7 +51,7 @@
   assert('SelfRetraceTest' not in stacktrace)
 
   # Run the retrace tool.
-  cmd = ['java', '-jar', utils.RETRACE_JAR, r8lib + ".map"]
+  cmd = [jdk.GetJavaExecutable(), '-jar', utils.RETRACE_JAR, r8lib + ".map"]
   utils.PrintCmd(cmd)
   p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
   retrace_stdout, _ = p.communicate(stacktrace)
diff --git a/tools/toolhelper.py b/tools/toolhelper.py
index 9371fb9..10da97d 100644
--- a/tools/toolhelper.py
+++ b/tools/toolhelper.py
@@ -4,7 +4,7 @@
 
 import glob
 import gradle
-import os
+import jdk
 import subprocess
 from threading import Timer
 import utils
@@ -19,7 +19,7 @@
   cmd = []
   if track_memory_file:
     cmd.extend(['tools/track_memory.sh', track_memory_file])
-  cmd.append('java')
+  cmd.append(jdk.GetJavaExecutable())
   if extra_args:
     cmd.extend(extra_args)
   if debug:
@@ -61,7 +61,7 @@
       'compileTestJava',
     ])
   cmd = []
-  cmd.append('java')
+  cmd.append(jdk.GetJavaExecutable())
   if extra_args:
     cmd.extend(extra_args)
   if debug:
diff --git a/tools/utils.py b/tools/utils.py
index 20d7bc7..892fe7d 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -4,7 +4,9 @@
 
 # Different utility functions used accross scripts
 
+import defines
 import hashlib
+import jdk
 import os
 import re
 import shutil
@@ -16,9 +18,9 @@
 
 ANDROID_JAR_DIR = 'third_party/android_jar/lib-v{api}'
 ANDROID_JAR = os.path.join(ANDROID_JAR_DIR, 'android.jar')
-TOOLS_DIR = os.path.abspath(os.path.normpath(os.path.join(__file__, '..')))
-REPO_ROOT = os.path.realpath(os.path.join(TOOLS_DIR, '..'))
-THIRD_PARTY = os.path.join(REPO_ROOT, 'third_party')
+TOOLS_DIR = defines.TOOLS_DIR
+REPO_ROOT = defines.REPO_ROOT
+THIRD_PARTY = defines.THIRD_PARTY
 MEMORY_USE_TMP_FILE = 'memory_use.tmp'
 DEX_SEGMENTS_RESULT_PATTERN = re.compile('- ([^:]+): ([0-9]+)')
 BUILD = os.path.join(REPO_ROOT, 'build')
@@ -156,13 +158,13 @@
       return stdout
 
 def IsWindows():
-  return sys.platform.startswith('win')
+  return defines.IsWindows()
 
 def IsLinux():
-  return sys.platform.startswith('linux')
+  return defines.IsLinux()
 
 def IsOsX():
-  return sys.platform.startswith('darwin')
+  return defines.IsOsX()
 
 def EnsureDepFromGoogleCloudStorage(dep, tgz, sha1, msg):
   if not os.path.exists(dep) or os.path.getmtime(tgz) < os.path.getmtime(sha1):
@@ -385,7 +387,7 @@
 # Return a dictionary: {segment_name -> segments_size}
 def getDexSegmentSizes(dex_files):
   assert len(dex_files) > 0
-  cmd = ['java', '-jar', R8_JAR, 'dexsegments']
+  cmd = [jdk.GetJavaExecutable(), '-jar', R8_JAR, 'dexsegments']
   cmd.extend(dex_files)
   PrintCmd(cmd)
   output = subprocess.check_output(cmd)
@@ -405,7 +407,7 @@
 
 # Return a dictionary: {segment_name -> segments_size}
 def getCfSegmentSizes(cfFile):
-  cmd = ['java',
+  cmd = [jdk.GetJavaExecutable(),
          '-cp',
          CF_SEGMENTS_TOOL,
          'com.android.tools.r8.cf_segments.MeasureLib',
@@ -443,7 +445,7 @@
 
 # Ensure that we are not benchmarking with a google jvm.
 def check_java_version():
-  cmd= ['java', '-version']
+  cmd= [jdk.GetJavaExecutable(), '-version']
   output = subprocess.check_output(cmd, stderr = subprocess.STDOUT)
   m = re.search('openjdk version "([^"]*)"', output)
   if m is None: