Remove remaining uses of DexFile::GetChecksum.

Remove or replace with DexFile::GetMultiDexChecksums as appropriate.

Bug: 34604632
Test: m test-art-host, added image_space_test to test ValidateOatFile.
Change-Id: I1042e87f29a242046d055f0be374ad9fbce4671a
diff --git a/build/Android.gtest.mk b/build/Android.gtest.mk
index 2c2c1b5..d376f29 100644
--- a/build/Android.gtest.mk
+++ b/build/Android.gtest.mk
@@ -102,6 +102,7 @@
 ART_GTEST_jni_internal_test_DEX_DEPS := AllFields StaticLeafMethods
 ART_GTEST_oat_file_assistant_test_DEX_DEPS := $(ART_GTEST_dex2oat_environment_tests_DEX_DEPS)
 ART_GTEST_dexoptanalyzer_test_DEX_DEPS := $(ART_GTEST_dex2oat_environment_tests_DEX_DEPS)
+ART_GTEST_image_space_test_DEX_DEPS := $(ART_GTEST_dex2oat_environment_tests_DEX_DEPS)
 ART_GTEST_oat_file_test_DEX_DEPS := Main MultiDex
 ART_GTEST_oat_test_DEX_DEPS := Main
 ART_GTEST_object_test_DEX_DEPS := ProtoCompare ProtoCompare2 StaticsFromCode XandY
@@ -146,6 +147,11 @@
   $(ART_GTEST_dex2oat_environment_tests_TARGET_DEPS) \
   dexoptanalyzerd
 
+ART_GTEST_image_space_test_HOST_DEPS := \
+  $(ART_GTEST_dex2oat_environment_tests_HOST_DEPS)
+ART_GTEST_image_space_test_TARGET_DEPS := \
+  $(ART_GTEST_dex2oat_environment_tests_TARGET_DEPS)
+
 ART_GTEST_dex2oat_test_HOST_DEPS := \
   $(ART_GTEST_dex2oat_environment_tests_HOST_DEPS)
 ART_GTEST_dex2oat_test_TARGET_DEPS := \
@@ -627,6 +633,9 @@
 ART_GTEST_dexoptanalyzer_test_DEX_DEPS :=
 ART_GTEST_dexoptanalyzer_test_HOST_DEPS :=
 ART_GTEST_dexoptanalyzer_test_TARGET_DEPS :=
+ART_GTEST_image_space_test_DEX_DEPS :=
+ART_GTEST_image_space_test_HOST_DEPS :=
+ART_GTEST_image_space_test_TARGET_DEPS :=
 ART_GTEST_dex2oat_test_DEX_DEPS :=
 ART_GTEST_dex2oat_test_HOST_DEPS :=
 ART_GTEST_dex2oat_test_TARGET_DEPS :=
diff --git a/runtime/Android.bp b/runtime/Android.bp
index 9585ba2..7febb45 100644
--- a/runtime/Android.bp
+++ b/runtime/Android.bp
@@ -546,6 +546,7 @@
         "gc/reference_queue_test.cc",
         "gc/space/dlmalloc_space_static_test.cc",
         "gc/space/dlmalloc_space_random_test.cc",
+        "gc/space/image_space_test.cc",
         "gc/space/large_object_space_test.cc",
         "gc/space/rosalloc_space_static_test.cc",
         "gc/space/rosalloc_space_random_test.cc",
diff --git a/runtime/dex2oat_environment_test.h b/runtime/dex2oat_environment_test.h
index 8b0c51c..e58c6f5 100644
--- a/runtime/dex2oat_environment_test.h
+++ b/runtime/dex2oat_environment_test.h
@@ -53,7 +53,7 @@
     ASSERT_EQ(0, mkdir(odex_dir_.c_str(), 0700));
 
     // Verify the environment is as we expect
-    uint32_t checksum;
+    std::vector<uint32_t> checksums;
     std::string error_msg;
     ASSERT_TRUE(OS::FileExists(GetSystemImageFile().c_str()))
       << "Expected pre-compiled boot image to be at: " << GetSystemImageFile();
@@ -61,7 +61,7 @@
       << "Expected dex file to be at: " << GetDexSrc1();
     ASSERT_TRUE(OS::FileExists(GetStrippedDexSrc1().c_str()))
       << "Expected stripped dex file to be at: " << GetStrippedDexSrc1();
-    ASSERT_FALSE(DexFile::GetChecksum(GetStrippedDexSrc1().c_str(), &checksum, &error_msg))
+    ASSERT_FALSE(DexFile::GetMultiDexChecksums(GetStrippedDexSrc1().c_str(), &checksums, &error_msg))
       << "Expected stripped dex file to be stripped: " << GetStrippedDexSrc1();
     ASSERT_TRUE(OS::FileExists(GetDexSrc2().c_str()))
       << "Expected dex file to be at: " << GetDexSrc2();
diff --git a/runtime/dex_file.cc b/runtime/dex_file.cc
index 48db7e5..9ad4063 100644
--- a/runtime/dex_file.cc
+++ b/runtime/dex_file.cc
@@ -72,37 +72,6 @@
   uint8_t type_;
 };
 
-bool DexFile::GetChecksum(const char* filename, uint32_t* checksum, std::string* error_msg) {
-  CHECK(checksum != nullptr);
-
-  // Strip ":...", which is the location
-  const char* zip_entry_name = kClassesDex;
-  const char* file_part = filename;
-  std::string file_part_storage;
-
-  if (DexFile::IsMultiDexLocation(filename)) {
-    file_part_storage = GetBaseLocation(filename);
-    file_part = file_part_storage.c_str();
-    zip_entry_name = filename + file_part_storage.size() + 1;
-    DCHECK_EQ(zip_entry_name[-1], kMultiDexSeparator);
-  }
-
-  std::vector<uint32_t> checksums;
-  if (!GetMultiDexChecksums(file_part, &checksums, error_msg)) {
-    return false;
-  }
-
-  for (size_t i = 0; i < checksums.size(); i++) {
-    if (GetMultiDexClassesDexName(i) == std::string(zip_entry_name)) {
-      *checksum = checksums[i];
-      return true;
-    }
-  }
-
-  *error_msg = StringPrintf("Failed to find entry '%s' in '%s'", zip_entry_name, file_part);
-  return false;
-}
-
 bool DexFile::GetMultiDexChecksums(const char* filename,
                                    std::vector<uint32_t>* checksums,
                                    std::string* error_msg) {
diff --git a/runtime/dex_file.h b/runtime/dex_file.h
index 8ad61aa..2101782 100644
--- a/runtime/dex_file.h
+++ b/runtime/dex_file.h
@@ -424,12 +424,6 @@
 
   struct AnnotationValue;
 
-  // Returns the checksum of a file for comparison with GetLocationChecksum().
-  // For .dex files, this is the header checksum.
-  // For zip files, this is the classes.dex zip entry CRC32 checksum.
-  // Return true if the checksum could be found, false otherwise.
-  static bool GetChecksum(const char* filename, uint32_t* checksum, std::string* error_msg);
-
   // Returns the checksums of a file for comparison with GetLocationChecksum().
   // For .dex files, this is the single header checksum.
   // For zip files, this is the zip entry CRC32 checksum for classes.dex and
@@ -439,6 +433,10 @@
                                    std::vector<uint32_t>* checksums,
                                    std::string* error_msg);
 
+  // Check whether a location denotes a multidex dex file. This is a very simple check: returns
+  // whether the string contains the separator character.
+  static bool IsMultiDexLocation(const char* location);
+
   // Opens .dex file, backed by existing memory
   static std::unique_ptr<const DexFile> Open(const uint8_t* base,
                                              size_t size,
@@ -1156,10 +1154,6 @@
   // Initialize section info for sections only found in map. Returns true on success.
   void InitializeSectionsFromMapList();
 
-  // Check whether a location denotes a multidex dex file. This is a very simple check: returns
-  // whether the string contains the separator character.
-  static bool IsMultiDexLocation(const char* location);
-
   // The base address of the memory mapping.
   const uint8_t* const begin_;
 
diff --git a/runtime/dex_file_test.cc b/runtime/dex_file_test.cc
index b6e010c..9131715 100644
--- a/runtime/dex_file_test.cc
+++ b/runtime/dex_file_test.cc
@@ -326,12 +326,13 @@
 }
 
 TEST_F(DexFileTest, GetChecksum) {
-  uint32_t checksum;
+  std::vector<uint32_t> checksums;
   ScopedObjectAccess soa(Thread::Current());
   std::string error_msg;
-  EXPECT_TRUE(DexFile::GetChecksum(GetLibCoreDexFileNames()[0].c_str(), &checksum, &error_msg))
+  EXPECT_TRUE(DexFile::GetMultiDexChecksums(GetLibCoreDexFileNames()[0].c_str(), &checksums, &error_msg))
       << error_msg;
-  EXPECT_EQ(java_lang_dex_file_->GetLocationChecksum(), checksum);
+  ASSERT_EQ(1U, checksums.size());
+  EXPECT_EQ(java_lang_dex_file_->GetLocationChecksum(), checksums[0]);
 }
 
 TEST_F(DexFileTest, GetMultiDexChecksums) {
@@ -342,19 +343,15 @@
                                             &checksums,
                                             &error_msg)) << error_msg;
 
-  uint32_t checksum0 = 0;
-  EXPECT_TRUE(DexFile::GetChecksum(DexFile::GetMultiDexLocation(0, multidex_file.c_str()).c_str(),
-                                   &checksum0,
-                                   &error_msg)) << error_msg;
+  std::vector<std::unique_ptr<const DexFile>> dexes = OpenTestDexFiles("MultiDex");
+  ASSERT_EQ(2U, dexes.size());
+  ASSERT_EQ(2U, checksums.size());
 
-  uint32_t checksum1 = 0;
-  EXPECT_TRUE(DexFile::GetChecksum(DexFile::GetMultiDexLocation(1, multidex_file.c_str()).c_str(),
-                                   &checksum1,
-                                   &error_msg)) << error_msg;
+  EXPECT_EQ(dexes[0]->GetLocation(), DexFile::GetMultiDexLocation(0, multidex_file.c_str()));
+  EXPECT_EQ(dexes[0]->GetLocationChecksum(), checksums[0]);
 
-  ASSERT_EQ(2u, checksums.size());
-  EXPECT_EQ(checksums[0], checksum0);
-  EXPECT_EQ(checksums[1], checksum1);
+  EXPECT_EQ(dexes[1]->GetLocation(), DexFile::GetMultiDexLocation(1, multidex_file.c_str()));
+  EXPECT_EQ(dexes[1]->GetLocationChecksum(), checksums[1]);
 }
 
 TEST_F(DexFileTest, ClassDefs) {
diff --git a/runtime/gc/space/image_space.cc b/runtime/gc/space/image_space.cc
index 442a42e..f4b6f08 100644
--- a/runtime/gc/space/image_space.cc
+++ b/runtime/gc/space/image_space.cc
@@ -692,7 +692,7 @@
     if (validate_oat_file) {
       TimingLogger::ScopedTiming timing("ValidateOatFile", &logger);
       CHECK(space->oat_file_ != nullptr);
-      if (!ValidateOatFile(*space, *space->oat_file_, error_msg)) {
+      if (!ImageSpace::ValidateOatFile(*space->oat_file_, error_msg)) {
         DCHECK(!error_msg->empty());
         return nullptr;
       }
@@ -1379,33 +1379,6 @@
 
     return oat_file;
   }
-
-  static bool ValidateOatFile(const ImageSpace& space,
-                              const OatFile& oat_file,
-                              std::string* error_msg) {
-    for (const OatFile::OatDexFile* oat_dex_file : oat_file.GetOatDexFiles()) {
-      const std::string& dex_file_location = oat_dex_file->GetDexFileLocation();
-      uint32_t dex_file_location_checksum;
-      if (!DexFile::GetChecksum(dex_file_location.c_str(), &dex_file_location_checksum, error_msg)) {
-        *error_msg = StringPrintf("Failed to get checksum of dex file '%s' referenced by image %s: "
-                                  "%s",
-                                  dex_file_location.c_str(),
-                                  space.GetName(),
-                                  error_msg->c_str());
-        return false;
-      }
-      if (dex_file_location_checksum != oat_dex_file->GetDexFileLocationChecksum()) {
-        *error_msg = StringPrintf("ValidateOatFile found checksum mismatch between oat file '%s' and "
-                                  "dex file '%s' (0x%x != 0x%x)",
-                                  oat_file.GetLocation().c_str(),
-                                  dex_file_location.c_str(),
-                                  oat_dex_file->GetDexFileLocationChecksum(),
-                                  dex_file_location_checksum);
-        return false;
-      }
-    }
-    return true;
-  }
 };
 
 static constexpr uint64_t kLowSpaceValue = 50 * MB;
@@ -1782,6 +1755,63 @@
   return bootcp_oss.str();
 }
 
+bool ImageSpace::ValidateOatFile(const OatFile& oat_file, std::string* error_msg) {
+  for (const OatFile::OatDexFile* oat_dex_file : oat_file.GetOatDexFiles()) {
+    const std::string& dex_file_location = oat_dex_file->GetDexFileLocation();
+
+    // Skip multidex locations - These will be checked when we visit their
+    // corresponding primary non-multidex location.
+    if (DexFile::IsMultiDexLocation(dex_file_location.c_str())) {
+      continue;
+    }
+
+    std::vector<uint32_t> checksums;
+    if (!DexFile::GetMultiDexChecksums(dex_file_location.c_str(), &checksums, error_msg)) {
+      *error_msg = StringPrintf("ValidateOatFile failed to get checksums of dex file '%s' "
+                                "referenced by oat file %s: %s",
+                                dex_file_location.c_str(),
+                                oat_file.GetLocation().c_str(),
+                                error_msg->c_str());
+      return false;
+    }
+    CHECK(!checksums.empty());
+    if (checksums[0] != oat_dex_file->GetDexFileLocationChecksum()) {
+      *error_msg = StringPrintf("ValidateOatFile found checksum mismatch between oat file "
+                                "'%s' and dex file '%s' (0x%x != 0x%x)",
+                                oat_file.GetLocation().c_str(),
+                                dex_file_location.c_str(),
+                                oat_dex_file->GetDexFileLocationChecksum(),
+                                checksums[0]);
+      return false;
+    }
+
+    // Verify checksums for any related multidex entries.
+    for (size_t i = 1; i < checksums.size(); i++) {
+      std::string multi_dex_location = DexFile::GetMultiDexLocation(i, dex_file_location.c_str());
+      const OatFile::OatDexFile* multi_dex = oat_file.GetOatDexFile(multi_dex_location.c_str(),
+                                                                    nullptr,
+                                                                    error_msg);
+      if (multi_dex == nullptr) {
+        *error_msg = StringPrintf("ValidateOatFile oat file '%s' is missing entry '%s'",
+                                  oat_file.GetLocation().c_str(),
+                                  multi_dex_location.c_str());
+        return false;
+      }
+
+      if (checksums[i] != multi_dex->GetDexFileLocationChecksum()) {
+        *error_msg = StringPrintf("ValidateOatFile found checksum mismatch between oat file "
+                                  "'%s' and dex file '%s' (0x%x != 0x%x)",
+                                  oat_file.GetLocation().c_str(),
+                                  multi_dex_location.c_str(),
+                                  multi_dex->GetDexFileLocationChecksum(),
+                                  checksums[i]);
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
 void ImageSpace::ExtractMultiImageLocations(const std::string& input_image_file_name,
                                             const std::string& boot_classpath,
                                             std::vector<std::string>* image_file_names) {
diff --git a/runtime/gc/space/image_space.h b/runtime/gc/space/image_space.h
index 489a289..199bbdd 100644
--- a/runtime/gc/space/image_space.h
+++ b/runtime/gc/space/image_space.h
@@ -131,6 +131,17 @@
                                                 const std::vector<const char*>& oat_filenames,
                                                 const std::vector<const char*>& image_filenames);
 
+  // Returns true if the dex checksums in the given oat file match the
+  // checksums of the original dex files on disk. This is intended to be used
+  // to validate the boot image oat file, which may contain dex entries from
+  // multiple different (possibly multidex) dex files on disk. Prefer the
+  // OatFileAssistant for validating regular app oat files because the
+  // OatFileAssistant caches dex checksums that are reused to check both the
+  // oat and odex file.
+  //
+  // This function is exposed for testing purposes.
+  static bool ValidateOatFile(const OatFile& oat_file, std::string* error_msg);
+
   // Return the end of the image which includes non-heap objects such as ArtMethods and ArtFields.
   uint8_t* GetImageEnd() const {
     return Begin() + GetImageHeader().GetImageSize();
diff --git a/runtime/gc/space/image_space_test.cc b/runtime/gc/space/image_space_test.cc
new file mode 100644
index 0000000..7a38074
--- /dev/null
+++ b/runtime/gc/space/image_space_test.cc
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+
+#include "dexopt_test.h"
+
+namespace art {
+namespace gc {
+namespace space {
+
+TEST_F(DexoptTest, ValidateOatFile) {
+  std::string dex1 = GetScratchDir() + "/Dex1.jar";
+  std::string multidex1 = GetScratchDir() + "/MultiDex1.jar";
+  std::string dex2 = GetScratchDir() + "/Dex2.jar";
+  std::string oat_location = GetScratchDir() + "/Oat.oat";
+
+  Copy(GetDexSrc1(), dex1);
+  Copy(GetMultiDexSrc1(), multidex1);
+  Copy(GetDexSrc2(), dex2);
+
+  std::string error_msg;
+  std::vector<std::string> args;
+  args.push_back("--dex-file=" + dex1);
+  args.push_back("--dex-file=" + multidex1);
+  args.push_back("--dex-file=" + dex2);
+  args.push_back("--oat-file=" + oat_location);
+  ASSERT_TRUE(OatFileAssistant::Dex2Oat(args, &error_msg)) << error_msg;
+
+  std::unique_ptr<OatFile> oat(OatFile::Open(oat_location.c_str(),
+                                             oat_location.c_str(),
+                                             nullptr,
+                                             nullptr,
+                                             false,
+                                             /*low_4gb*/false,
+                                             nullptr,
+                                             &error_msg));
+  ASSERT_TRUE(oat != nullptr) << error_msg;
+
+  // Originally all the dex checksums should be up to date.
+  EXPECT_TRUE(ImageSpace::ValidateOatFile(*oat, &error_msg)) << error_msg;
+
+  // Invalidate the dex1 checksum.
+  Copy(GetDexSrc2(), dex1);
+  EXPECT_FALSE(ImageSpace::ValidateOatFile(*oat, &error_msg));
+
+  // Restore the dex1 checksum.
+  Copy(GetDexSrc1(), dex1);
+  EXPECT_TRUE(ImageSpace::ValidateOatFile(*oat, &error_msg)) << error_msg;
+
+  // Invalidate the non-main multidex checksum.
+  Copy(GetMultiDexSrc2(), multidex1);
+  EXPECT_FALSE(ImageSpace::ValidateOatFile(*oat, &error_msg));
+
+  // Restore the multidex checksum.
+  Copy(GetMultiDexSrc1(), multidex1);
+  EXPECT_TRUE(ImageSpace::ValidateOatFile(*oat, &error_msg)) << error_msg;
+
+  // Invalidate the dex2 checksum.
+  Copy(GetDexSrc1(), dex2);
+  EXPECT_FALSE(ImageSpace::ValidateOatFile(*oat, &error_msg));
+
+  // restore the dex2 checksum.
+  Copy(GetDexSrc2(), dex2);
+  EXPECT_TRUE(ImageSpace::ValidateOatFile(*oat, &error_msg)) << error_msg;
+
+  // Replace the multidex file with a non-multidex file.
+  Copy(GetDexSrc1(), multidex1);
+  EXPECT_FALSE(ImageSpace::ValidateOatFile(*oat, &error_msg));
+
+  // Restore the multidex file
+  Copy(GetMultiDexSrc1(), multidex1);
+  EXPECT_TRUE(ImageSpace::ValidateOatFile(*oat, &error_msg)) << error_msg;
+
+  // Replace dex1 with a multidex file.
+  Copy(GetMultiDexSrc1(), dex1);
+  EXPECT_FALSE(ImageSpace::ValidateOatFile(*oat, &error_msg));
+
+  // Restore the dex1 file.
+  Copy(GetDexSrc1(), dex1);
+  EXPECT_TRUE(ImageSpace::ValidateOatFile(*oat, &error_msg)) << error_msg;
+
+  // Remove the dex2 file.
+  EXPECT_EQ(0, unlink(dex2.c_str()));
+  EXPECT_FALSE(ImageSpace::ValidateOatFile(*oat, &error_msg));
+
+  // Restore the dex2 file.
+  Copy(GetDexSrc2(), dex2);
+  EXPECT_TRUE(ImageSpace::ValidateOatFile(*oat, &error_msg)) << error_msg;
+
+  // Remove the multidex file.
+  EXPECT_EQ(0, unlink(multidex1.c_str()));
+  EXPECT_FALSE(ImageSpace::ValidateOatFile(*oat, &error_msg));
+}
+
+}  // namespace space
+}  // namespace gc
+}  // namespace art
diff --git a/runtime/oat_file.cc b/runtime/oat_file.cc
index 31eb1cc..c8396a9 100644
--- a/runtime/oat_file.cc
+++ b/runtime/oat_file.cc
@@ -1468,77 +1468,6 @@
   return out.str();
 }
 
-bool OatFile::CheckStaticDexFileDependencies(const char* dex_dependencies, std::string* msg) {
-  if (dex_dependencies == nullptr || dex_dependencies[0] == 0) {
-    // No dependencies.
-    return true;
-  }
-
-  // Assumption: this is not performance-critical. So it's OK to do this with a std::string and
-  //             Split() instead of manual parsing of the combined char*.
-  std::vector<std::string> split;
-  Split(dex_dependencies, kDexClassPathEncodingSeparator, &split);
-  if (split.size() % 2 != 0) {
-    // Expected pairs of location and checksum.
-    *msg = StringPrintf("Odd number of elements in dependency list %s", dex_dependencies);
-    return false;
-  }
-
-  for (auto it = split.begin(), end = split.end(); it != end; it += 2) {
-    std::string& location = *it;
-    std::string& checksum = *(it + 1);
-    int64_t converted = strtoll(checksum.c_str(), nullptr, 10);
-    if (converted == 0) {
-      // Conversion error.
-      *msg = StringPrintf("Conversion error for %s", checksum.c_str());
-      return false;
-    }
-
-    uint32_t dex_checksum;
-    std::string error_msg;
-    if (DexFile::GetChecksum(DexFile::GetDexCanonicalLocation(location.c_str()).c_str(),
-                             &dex_checksum,
-                             &error_msg)) {
-      if (converted != dex_checksum) {
-        *msg = StringPrintf("Checksums don't match for %s: %" PRId64 " vs %u",
-                            location.c_str(), converted, dex_checksum);
-        return false;
-      }
-    } else {
-      // Problem retrieving checksum.
-      // TODO: odex files?
-      *msg = StringPrintf("Could not retrieve checksum for %s: %s", location.c_str(),
-                          error_msg.c_str());
-      return false;
-    }
-  }
-
-  return true;
-}
-
-bool OatFile::GetDexLocationsFromDependencies(const char* dex_dependencies,
-                                              std::vector<std::string>* locations) {
-  DCHECK(locations != nullptr);
-  if (dex_dependencies == nullptr || dex_dependencies[0] == 0) {
-    return true;
-  }
-
-  // Assumption: this is not performance-critical. So it's OK to do this with a std::string and
-  //             Split() instead of manual parsing of the combined char*.
-  std::vector<std::string> split;
-  Split(dex_dependencies, kDexClassPathEncodingSeparator, &split);
-  if (split.size() % 2 != 0) {
-    // Expected pairs of location and checksum.
-    return false;
-  }
-
-  for (auto it = split.begin(), end = split.end(); it != end; it += 2) {
-    locations->push_back(*it);
-  }
-
-  return true;
-}
-
 OatFile::OatClass OatFile::FindOatClass(const DexFile& dex_file,
                                         uint16_t class_def_idx,
                                         bool* found) {
diff --git a/runtime/oat_file.h b/runtime/oat_file.h
index 111755e..d24283a 100644
--- a/runtime/oat_file.h
+++ b/runtime/oat_file.h
@@ -290,15 +290,6 @@
   // Create a dependency list (dex locations and checksums) for the given dex files.
   static std::string EncodeDexFileDependencies(const std::vector<const DexFile*>& dex_files);
 
-  // Check the given dependency list against their dex files - thus the name "Static," this does
-  // not check the class-loader environment, only whether there have been file updates.
-  static bool CheckStaticDexFileDependencies(const char* dex_dependencies, std::string* msg);
-
-  // Get the dex locations of a dependency list. Note: this is *not* cleaned for synthetic
-  // locations of multidex files.
-  static bool GetDexLocationsFromDependencies(const char* dex_dependencies,
-                                              std::vector<std::string>* locations);
-
   // Finds the associated oat class for a dex_file and descriptor. Returns an invalid OatClass on
   // error and sets found to false.
   static OatClass FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, bool* found);
diff --git a/runtime/oat_file_test.cc b/runtime/oat_file_test.cc
index b416b9d..d5fe1f3 100644
--- a/runtime/oat_file_test.cc
+++ b/runtime/oat_file_test.cc
@@ -62,54 +62,4 @@
         "/data/app/foo/base.apk", "o/base.apk"));
 }
 
-static std::vector<const DexFile*> ToConstDexFiles(
-    const std::vector<std::unique_ptr<const DexFile>>& in) {
-  std::vector<const DexFile*> ret;
-  for (auto& d : in) {
-    ret.push_back(d.get());
-  }
-  return ret;
-}
-
-TEST_F(OatFileTest, DexFileDependencies) {
-  std::string error_msg;
-
-  // No dependencies.
-  EXPECT_TRUE(OatFile::CheckStaticDexFileDependencies(nullptr, &error_msg)) << error_msg;
-  EXPECT_TRUE(OatFile::CheckStaticDexFileDependencies("", &error_msg)) << error_msg;
-
-  // Ill-formed dependencies.
-  EXPECT_FALSE(OatFile::CheckStaticDexFileDependencies("abc", &error_msg));
-  EXPECT_FALSE(OatFile::CheckStaticDexFileDependencies("abc*123*def", &error_msg));
-  EXPECT_FALSE(OatFile::CheckStaticDexFileDependencies("abc*def*", &error_msg));
-
-  // Unsatisfiable dependency.
-  EXPECT_FALSE(OatFile::CheckStaticDexFileDependencies("abc*123*", &error_msg));
-
-  // Load some dex files to be able to do a real test.
-  ScopedObjectAccess soa(Thread::Current());
-
-  std::vector<std::unique_ptr<const DexFile>> dex_files1 = OpenTestDexFiles("Main");
-  std::vector<const DexFile*> dex_files_const1 = ToConstDexFiles(dex_files1);
-  std::string encoding1 = OatFile::EncodeDexFileDependencies(dex_files_const1);
-  EXPECT_TRUE(OatFile::CheckStaticDexFileDependencies(encoding1.c_str(), &error_msg))
-      << error_msg << " " << encoding1;
-  std::vector<std::string> split1;
-  EXPECT_TRUE(OatFile::GetDexLocationsFromDependencies(encoding1.c_str(), &split1));
-  ASSERT_EQ(split1.size(), 1U);
-  EXPECT_EQ(split1[0], dex_files_const1[0]->GetLocation());
-
-  std::vector<std::unique_ptr<const DexFile>> dex_files2 = OpenTestDexFiles("MultiDex");
-  EXPECT_GT(dex_files2.size(), 1U);
-  std::vector<const DexFile*> dex_files_const2 = ToConstDexFiles(dex_files2);
-  std::string encoding2 = OatFile::EncodeDexFileDependencies(dex_files_const2);
-  EXPECT_TRUE(OatFile::CheckStaticDexFileDependencies(encoding2.c_str(), &error_msg))
-      << error_msg << " " << encoding2;
-  std::vector<std::string> split2;
-  EXPECT_TRUE(OatFile::GetDexLocationsFromDependencies(encoding2.c_str(), &split2));
-  ASSERT_EQ(split2.size(), 2U);
-  EXPECT_EQ(split2[0], dex_files_const2[0]->GetLocation());
-  EXPECT_EQ(split2[1], dex_files_const2[1]->GetLocation());
-}
-
 }  // namespace art