release-request-d8901a87-7dd0-4cc8-a44e-d04982e429da-for-git_oc-mr1-release-4198291 snap-temp-L50900000084068812

Change-Id: I6f6766eb1ded306d4f6a7c1a00ea192eacb8579b
diff --git a/src/vogar/target/ClassPathScanner.java b/src/vogar/target/ClassPathScanner.java
index af079e5..8bad54e 100644
--- a/src/vogar/target/ClassPathScanner.java
+++ b/src/vogar/target/ClassPathScanner.java
@@ -21,7 +21,9 @@
 import java.io.IOException;
 import java.util.Comparator;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.regex.Pattern;
@@ -47,10 +49,27 @@
     private final String[] classPath;
     private final ClassFinder classFinder;
 
+    private static Map<String, DexFile> createDexFiles(String[] classPath) {
+        Map<String, DexFile> result = new HashMap<String, DexFile>();
+        for (String entry : classPath) {
+            File classPathEntry = new File(entry);
+            if (!classPathEntry.exists() || classPathEntry.isDirectory()) {
+                continue;
+            }
+
+            try {
+                result.put(classPathEntry.getName(), new DexFile(classPathEntry));
+            } catch (IOException ignore) {
+                // okay, presumably the dex file didn't contain any classes
+            }
+        }
+        return result;
+    }
+
     ClassPathScanner() {
         classPath = getClassPath();
         if ("Dalvik".equals(System.getProperty("java.vm.name"))) {
-            classFinder = new ApkClassFinder();
+            classFinder = new ApkClassFinder(createDexFiles(classPath));
         } else {
             // When running vogar tests under an IDE the classes are not held in a .jar file.
             // This system properties can be set to make it possible to run the vogar tests from an
@@ -209,41 +228,38 @@
      * to load on non-Android VMs.
      */
     private static class ApkClassFinder implements ClassFinder {
+        private final Map<String, DexFile> dexFiles;
+
+        ApkClassFinder(Map<String, DexFile> dexFiles) {
+            this.dexFiles = dexFiles;
+        }
+
         public void find(File classPathEntry, String pathPrefix, String packageName,
                 Set<String> classNames, Set<String> subpackageNames) {
             if (classPathEntry.isDirectory()) {
                 return;
             }
 
-            DexFile dexFile = null;
-            try {
-                dexFile = new DexFile(classPathEntry);
-                Enumeration<String> apkClassNames = dexFile.entries();
-                while (apkClassNames.hasMoreElements()) {
-                    String className = apkClassNames.nextElement();
-                    if (!className.startsWith(packageName)) {
-                        continue;
-                    }
-
-                    String subPackageName = packageName;
-                    int lastPackageSeparator = className.lastIndexOf('.');
-                    if (lastPackageSeparator > 0) {
-                        subPackageName = className.substring(0, lastPackageSeparator);
-                    }
-                    if (subPackageName.length() > packageName.length()) {
-                        subpackageNames.add(subPackageName);
-                    } else if (isToplevelClass(className)) {
-                        classNames.add(className);
-                    }
+            DexFile dexFile = dexFiles.get(classPathEntry.getName());
+            if (dexFile == null) {
+                return;
+            }
+            Enumeration<String> apkClassNames = dexFile.entries();
+            while (apkClassNames.hasMoreElements()) {
+                String className = apkClassNames.nextElement();
+                if (!className.startsWith(packageName)) {
+                    continue;
                 }
-            } catch (IOException ignore) {
-                // okay, presumably the dex file didn't contain any classes
-            } finally {
-                if (dexFile != null) {
-                    try {
-                        dexFile.close();
-                    } catch (IOException ignore) {
-                    }
+
+                String subPackageName = packageName;
+                int lastPackageSeparator = className.lastIndexOf('.');
+                if (lastPackageSeparator > 0) {
+                    subPackageName = className.substring(0, lastPackageSeparator);
+                }
+                if (subPackageName.length() > packageName.length()) {
+                    subpackageNames.add(subPackageName);
+                } else if (isToplevelClass(className)) {
+                    classNames.add(className);
                 }
             }
         }