diff --git a/dex2oat/dex2oat_image_test.cc b/dex2oat/dex2oat_image_test.cc
index 09cdd50..e377308 100644
--- a/dex2oat/dex2oat_image_test.cc
+++ b/dex2oat/dex2oat_image_test.cc
@@ -423,9 +423,6 @@
     return gc::space::ImageSpace::LoadBootImage(/*boot_class_path=*/ boot_class_path,
                                                 /*boot_class_path_locations=*/ libcore_dex_files,
                                                 /*boot_class_path_fds=*/ std::vector<int>(),
-                                                /*boot_class_path_image_fds=*/ std::vector<int>(),
-                                                /*boot_class_path_vdex_fds=*/ std::vector<int>(),
-                                                /*boot_class_path_oat_fds=*/ std::vector<int>(),
                                                 android::base::Split(image_location, ":"),
                                                 kRuntimeISA,
                                                 relocate,
diff --git a/odrefresh/odrefresh.cc b/odrefresh/odrefresh.cc
index ff23f55..fbf30c4 100644
--- a/odrefresh/odrefresh.cc
+++ b/odrefresh/odrefresh.cc
@@ -735,88 +735,21 @@
     }
   }
 
-  static bool AddCompiledBootClasspathFds(
-      /*inout*/ std::vector<std::unique_ptr<File>>& output_files,
-      /*inout*/ std::vector<std::string>& bcp_image_fds,
-      /*inout*/ std::vector<std::string>& bcp_vdex_fds,
-      /*inout*/ std::vector<std::string>& bcp_oat_fds,
-      const std::string& image_path) {
-    bool added_any = false;
-    std::unique_ptr<File> image_file(OS::OpenFileForReading(image_path.c_str()));
-    if (image_file && image_file->IsValid()) {
-      bcp_image_fds.push_back(std::to_string(image_file->Fd()));
-      output_files.push_back(std::move(image_file));
-      added_any = true;
-    } else {
-      bcp_image_fds.push_back("-1");
-    }
-
-    std::string oat_path = ReplaceFileExtension(image_path, "oat");
-    std::unique_ptr<File> oat_file(OS::OpenFileForReading(oat_path.c_str()));
-    if (oat_file && oat_file->IsValid()) {
-      bcp_oat_fds.push_back(std::to_string(oat_file->Fd()));
-      output_files.push_back(std::move(oat_file));
-      added_any = true;
-    } else {
-      bcp_oat_fds.push_back("-1");
-    }
-
-    std::string vdex_path = ReplaceFileExtension(image_path, "vdex");
-    std::unique_ptr<File> vdex_file(OS::OpenFileForReading(vdex_path.c_str()));
-    if (vdex_file && vdex_file->IsValid()) {
-      bcp_vdex_fds.push_back(std::to_string(vdex_file->Fd()));
-      output_files.push_back(std::move(vdex_file));
-      added_any = true;
-    } else {
-      bcp_vdex_fds.push_back("-1");
-    }
-    return added_any;
-  }
-
   static bool AddBootClasspathFds(/*inout*/ std::vector<std::string>& args,
                                   /*inout*/ std::vector<std::unique_ptr<File>>& output_files,
-                                  const std::vector<std::string>& bcp_jars,
-                                  const InstructionSet isa,
-                                  bool use_compiled_bcp_ext_as_fds) {
+                                  const std::vector<std::string>& bcp_jars) {
     auto bcp_fds = std::vector<std::string>();
-    auto bcp_image_fds = std::vector<std::string>();
-    auto bcp_oat_fds = std::vector<std::string>();
-    auto bcp_vdex_fds = std::vector<std::string>();
-    bool added_any = false;
     for (const std::string& jar : bcp_jars) {
       std::unique_ptr<File> jar_file(OS::OpenFileForReading(jar.c_str()));
-      if (jar_file && !jar_file->IsValid()) {
+      if (!jar_file->IsValid()) {
         LOG(ERROR) << "Failed to open a BCP jar " << jar;
         return false;
       }
       bcp_fds.push_back(std::to_string(jar_file->Fd()));
       output_files.push_back(std::move(jar_file));
-
-      // When enabled, for each JAR, also pass the corresponding .art/.vdex/.odex as FDs.
-      if (use_compiled_bcp_ext_as_fds) {
-        std::string image_path = GetApexDataBootImage(jar);
-        if (!image_path.empty()) {
-          added_any |= AddCompiledBootClasspathFds(output_files,
-                                                   bcp_image_fds,
-                                                   bcp_oat_fds,
-                                                   bcp_vdex_fds,
-                                                   GetSystemImageFilename(image_path.c_str(), isa));
-        }
-      }
     }
     args.emplace_back("--runtime-arg");
     args.emplace_back(Concatenate({"-Xbootclasspathfds:", android::base::Join(bcp_fds, ':')}));
-    if (use_compiled_bcp_ext_as_fds && added_any) {
-      args.emplace_back("--runtime-arg");
-      args.emplace_back(Concatenate({"-Xbootclasspathimagefds:",
-        android::base::Join(bcp_image_fds, ':')}));
-      args.emplace_back("--runtime-arg");
-      args.emplace_back(Concatenate({"-Xbootclasspathoatfds:",
-        android::base::Join(bcp_oat_fds, ':')}));
-      args.emplace_back("--runtime-arg");
-      args.emplace_back(Concatenate({"-Xbootclasspathvdexfds:",
-        android::base::Join(bcp_vdex_fds, ':')}));
-    }
     return true;
   }
 
@@ -1186,8 +1119,7 @@
     args.emplace_back("--runtime-arg");
     args.emplace_back(Concatenate({"-Xbootclasspath:", config_.GetDex2oatBootClasspath()}));
     auto bcp_jars = android::base::Split(config_.GetDex2oatBootClasspath(), ":");
-    if (!AddBootClasspathFds(args, readonly_files_raii, bcp_jars, isa,
-                             /*use_compiled_bcp_ext_as_fds=*/ false)) {
+    if (!AddBootClasspathFds(args, readonly_files_raii, bcp_jars)) {
       return false;
     }
 
@@ -1353,8 +1285,7 @@
       args.emplace_back("--runtime-arg");
       args.emplace_back(Concatenate({"-Xbootclasspath:", config_.GetBootClasspath()}));
       auto bcp_jars = android::base::Split(config_.GetBootClasspath(), ":");
-      if (!AddBootClasspathFds(args, readonly_files_raii, bcp_jars, isa,
-                               /*use_compiled_bcp_ext_as_fds=*/ true)) {
+      if (!AddBootClasspathFds(args, readonly_files_raii, bcp_jars)) {
         return false;
       }
 
diff --git a/runtime/gc/heap.cc b/runtime/gc/heap.cc
index 55fdb72..7706a5c 100644
--- a/runtime/gc/heap.cc
+++ b/runtime/gc/heap.cc
@@ -263,9 +263,6 @@
            const std::vector<std::string>& boot_class_path,
            const std::vector<std::string>& boot_class_path_locations,
            const std::vector<int>& boot_class_path_fds,
-           const std::vector<int>& boot_class_path_image_fds,
-           const std::vector<int>& boot_class_path_vdex_fds,
-           const std::vector<int>& boot_class_path_oat_fds,
            const std::vector<std::string>& image_file_names,
            const InstructionSet image_instruction_set,
            CollectorType foreground_collector_type,
@@ -467,9 +464,6 @@
   if (space::ImageSpace::LoadBootImage(boot_class_path,
                                        boot_class_path_locations,
                                        boot_class_path_fds,
-                                       boot_class_path_image_fds,
-                                       boot_class_path_vdex_fds,
-                                       boot_class_path_oat_fds,
                                        image_file_names,
                                        image_instruction_set,
                                        runtime->ShouldRelocate(),
diff --git a/runtime/gc/heap.h b/runtime/gc/heap.h
index 27616fb..345109d 100644
--- a/runtime/gc/heap.h
+++ b/runtime/gc/heap.h
@@ -202,9 +202,6 @@
        const std::vector<std::string>& boot_class_path,
        const std::vector<std::string>& boot_class_path_locations,
        const std::vector<int>& boot_class_path_fds,
-       const std::vector<int>& boot_class_path_image_fds,
-       const std::vector<int>& boot_class_path_vdex_fds,
-       const std::vector<int>& boot_class_path_oat_fds,
        const std::vector<std::string>& image_file_names,
        InstructionSet image_instruction_set,
        CollectorType foreground_collector_type,
diff --git a/runtime/gc/space/image_space.cc b/runtime/gc/space/image_space.cc
index 3930ad5..c1410ce 100644
--- a/runtime/gc/space/image_space.cc
+++ b/runtime/gc/space/image_space.cc
@@ -1418,17 +1418,11 @@
   BootImageLayout(ArrayRef<const std::string> image_locations,
                   ArrayRef<const std::string> boot_class_path,
                   ArrayRef<const std::string> boot_class_path_locations,
-                  ArrayRef<const int> boot_class_path_fds,
-                  ArrayRef<const int> boot_class_path_image_fds,
-                  ArrayRef<const int> boot_class_path_vdex_fds,
-                  ArrayRef<const int> boot_class_path_oat_fds)
+                  ArrayRef<const int> boot_class_path_fds)
      : image_locations_(image_locations),
        boot_class_path_(boot_class_path),
        boot_class_path_locations_(boot_class_path_locations),
-       boot_class_path_fds_(boot_class_path_fds),
-       boot_class_path_image_fds_(boot_class_path_image_fds),
-       boot_class_path_vdex_fds_(boot_class_path_vdex_fds),
-       boot_class_path_oat_fds_(boot_class_path_oat_fds) {}
+       boot_class_path_fds_(boot_class_path_fds) {}
 
   std::string GetPrimaryImageLocation();
 
@@ -1543,9 +1537,6 @@
   ArrayRef<const std::string> boot_class_path_;
   ArrayRef<const std::string> boot_class_path_locations_;
   ArrayRef<const int> boot_class_path_fds_;
-  ArrayRef<const int> boot_class_path_image_fds_;
-  ArrayRef<const int> boot_class_path_vdex_fds_;
-  ArrayRef<const int> boot_class_path_oat_fds_;
 
   std::vector<ImageChunk> chunks_;
   uint32_t base_address_ = 0u;
@@ -1828,19 +1819,8 @@
   DCHECK_LT(bcp_index, boot_class_path_.size());
 
   std::string actual_filename = ExpandLocation(base_filename, bcp_index);
-  int bcp_image_fd = bcp_index < boot_class_path_image_fds_.size()
-      ? boot_class_path_image_fds_[bcp_index]
-      : -1;
   ImageHeader header;
-  auto image_file = bcp_image_fd >= 0
-      ? std::make_unique<File>(bcp_image_fd, actual_filename, /*check_usage=*/ false)
-      : std::unique_ptr<File>(OS::OpenFileForReading(actual_filename.c_str()));
-  if (!image_file || !image_file->IsOpened()) {
-    *error_msg = StringPrintf("Unable to open file \"%s\" for reading image header",
-                              actual_filename.c_str());
-    return false;
-  }
-  if (!ReadSpecificImageHeader(image_file.get(), actual_filename.c_str(), &header, error_msg)) {
+  if (!ReadSpecificImageHeader(actual_filename.c_str(), &header, error_msg)) {
     return false;
   }
   const char* file_description = actual_filename.c_str();
@@ -1862,20 +1842,6 @@
   chunk.boot_image_component_count = header.GetBootImageComponentCount();
   chunk.boot_image_checksum = header.GetBootImageChecksum();
   chunk.boot_image_size = header.GetBootImageSize();
-  // When BCP art/vdex/oat FDs are also passed, initialize the chunk accordingly.
-  if (bcp_index < boot_class_path_image_fds_.size()) {
-    // The FD of .art needs to be duplicated because it'll be owned/used later.
-    int fd = boot_class_path_image_fds_[bcp_index];
-    if (fd >= 0) {
-      chunk.art_fd.reset(dup(fd));
-    }
-  }
-  if (bcp_index < boot_class_path_vdex_fds_.size()) {
-    chunk.vdex_fd.reset(boot_class_path_vdex_fds_[bcp_index]);
-  }
-  if (bcp_index < boot_class_path_oat_fds_.size()) {
-    chunk.oat_fd.reset(boot_class_path_oat_fds_[bcp_index]);
-  }
   chunks_.push_back(std::move(chunk));
   next_bcp_index_ = bcp_index + header.GetComponentCount();
   total_component_count_ += header.GetComponentCount();
@@ -2261,9 +2227,6 @@
   BootImageLoader(const std::vector<std::string>& boot_class_path,
                   const std::vector<std::string>& boot_class_path_locations,
                   const std::vector<int>& boot_class_path_fds,
-                  const std::vector<int>& boot_class_path_image_fds,
-                  const std::vector<int>& boot_class_path_vdex_fds,
-                  const std::vector<int>& boot_class_path_oat_fds,
                   const std::vector<std::string>& image_locations,
                   InstructionSet image_isa,
                   bool relocate,
@@ -2271,9 +2234,6 @@
       : boot_class_path_(boot_class_path),
         boot_class_path_locations_(boot_class_path_locations),
         boot_class_path_fds_(boot_class_path_fds),
-        boot_class_path_image_fds_(boot_class_path_image_fds),
-        boot_class_path_vdex_fds_(boot_class_path_vdex_fds),
-        boot_class_path_oat_fds_(boot_class_path_oat_fds),
         image_locations_(image_locations),
         image_isa_(image_isa),
         relocate_(relocate),
@@ -2285,10 +2245,7 @@
     BootImageLayout layout(image_locations_,
                            boot_class_path_,
                            boot_class_path_locations_,
-                           boot_class_path_fds_,
-                           boot_class_path_image_fds_,
-                           boot_class_path_vdex_fds_,
-                           boot_class_path_oat_fds_);
+                           boot_class_path_fds_);
     std::string image_location = layout.GetPrimaryImageLocation();
     std::string system_filename;
     bool found_image = FindImageFilenameImpl(image_location.c_str(),
@@ -2912,7 +2869,6 @@
                                      executable_,
                                      /*low_4gb=*/ false,
                                      dex_filenames,
-                                     dex_fds,
                                      image_reservation,
                                      error_msg));
         // We no longer need the file descriptors and they will be closed by
@@ -3171,9 +3127,6 @@
   const ArrayRef<const std::string> boot_class_path_;
   const ArrayRef<const std::string> boot_class_path_locations_;
   const ArrayRef<const int> boot_class_path_fds_;
-  const ArrayRef<const int> boot_class_path_image_fds_;
-  const ArrayRef<const int> boot_class_path_vdex_fds_;
-  const ArrayRef<const int> boot_class_path_oat_fds_;
   const ArrayRef<const std::string> image_locations_;
   const InstructionSet image_isa_;
   const bool relocate_;
@@ -3191,10 +3144,7 @@
   BootImageLayout layout(image_locations_,
                          boot_class_path_,
                          boot_class_path_locations_,
-                         boot_class_path_fds_,
-                         boot_class_path_image_fds_,
-                         boot_class_path_vdex_fds_,
-                         boot_class_path_oat_fds_);
+                         boot_class_path_fds_);
   if (!layout.LoadFromSystem(image_isa_, error_msg)) {
     return false;
   }
@@ -3222,10 +3172,7 @@
   BootImageLayout layout(ArrayRef<const std::string>(runtime->GetImageLocations()),
                          ArrayRef<const std::string>(runtime->GetBootClassPath()),
                          ArrayRef<const std::string>(runtime->GetBootClassPathLocations()),
-                         ArrayRef<const int>(runtime->GetBootClassPathFds()),
-                         ArrayRef<const int>(runtime->GetBootClassPathImageFds()),
-                         ArrayRef<const int>(runtime->GetBootClassPathVdexFds()),
-                         ArrayRef<const int>(runtime->GetBootClassPathOatFds()));
+                         ArrayRef<const int>(runtime->GetBootClassPathFds()));
   const std::string image_location = layout.GetPrimaryImageLocation();
   std::unique_ptr<ImageHeader> image_header;
   std::string error_msg;
@@ -3248,9 +3195,6 @@
     const std::vector<std::string>& boot_class_path,
     const std::vector<std::string>& boot_class_path_locations,
     const std::vector<int>& boot_class_path_fds,
-    const std::vector<int>& boot_class_path_image_fds,
-    const std::vector<int>& boot_class_path_vdex_fds,
-    const std::vector<int>& boot_class_path_odex_fds,
     const std::vector<std::string>& image_locations,
     const InstructionSet image_isa,
     bool relocate,
@@ -3273,9 +3217,6 @@
   BootImageLoader loader(boot_class_path,
                          boot_class_path_locations,
                          boot_class_path_fds,
-                         boot_class_path_image_fds,
-                         boot_class_path_vdex_fds,
-                         boot_class_path_odex_fds,
                          image_locations,
                          image_isa,
                          relocate,
@@ -3547,10 +3488,7 @@
     BootImageLayout layout(image_locations,
                            boot_class_path.SubArray(/*pos=*/ 0u, bcp_size),
                            boot_class_path_locations.SubArray(/*pos=*/ 0u, bcp_size),
-                           bcp_fds,
-                           /*boot_class_path_image_fds=*/ ArrayRef<const int>(),
-                           /*boot_class_path_vdex_fds=*/ ArrayRef<const int>(),
-                           /*boot_class_path_oat_fds=*/ ArrayRef<const int>());
+                           bcp_fds);
     std::string primary_image_location = layout.GetPrimaryImageLocation();
     std::string system_filename;
     bool has_system = false;
diff --git a/runtime/gc/space/image_space.h b/runtime/gc/space/image_space.h
index 28cc795..c8879cb 100644
--- a/runtime/gc/space/image_space.h
+++ b/runtime/gc/space/image_space.h
@@ -125,9 +125,6 @@
       const std::vector<std::string>& boot_class_path,
       const std::vector<std::string>& boot_class_path_locations,
       const std::vector<int>& boot_class_path_fds,
-      const std::vector<int>& boot_class_path_image_fds,
-      const std::vector<int>& boot_class_path_vdex_fds,
-      const std::vector<int>& boot_class_path_oat_fds,
       const std::vector<std::string>& image_locations,
       const InstructionSet image_isa,
       bool relocate,
diff --git a/runtime/gc/space/image_space_test.cc b/runtime/gc/space/image_space_test.cc
index 973bf5e..5e1bc11 100644
--- a/runtime/gc/space/image_space_test.cc
+++ b/runtime/gc/space/image_space_test.cc
@@ -137,9 +137,6 @@
     return ImageSpace::LoadBootImage(bcp,
                                      bcp_locations,
                                      /*boot_class_path_fds=*/ std::vector<int>(),
-                                     /*boot_class_path_image_fds=*/ std::vector<int>(),
-                                     /*boot_class_path_vdex_fds=*/ std::vector<int>(),
-                                     /*boot_class_path_oat_fds=*/ std::vector<int>(),
                                      full_image_locations,
                                      kRuntimeISA,
                                      /*relocate=*/ false,
diff --git a/runtime/oat_file.cc b/runtime/oat_file.cc
index 347b58f..179cfc9 100644
--- a/runtime/oat_file.cc
+++ b/runtime/oat_file.cc
@@ -127,7 +127,6 @@
                                   bool executable,
                                   bool low_4gb,
                                   ArrayRef<const std::string> dex_filenames,
-                                  ArrayRef<const int> dex_fds,
                                   /*inout*/MemMap* reservation,  // Where to load if not null.
                                   /*out*/std::string* error_msg);
 
@@ -249,7 +248,6 @@
                                       bool executable,
                                       bool low_4gb,
                                       ArrayRef<const std::string> dex_filenames,
-                                      ArrayRef<const int> dex_fds,
                                       /*inout*/MemMap* reservation,
                                       /*out*/std::string* error_msg) {
   std::unique_ptr<OatFileBase> ret(new kOatFileBaseSubType(oat_location, executable));
@@ -273,7 +271,7 @@
     return nullptr;
   }
 
-  if (!ret->Setup(zip_fd, dex_filenames, dex_fds, error_msg)) {
+  if (!ret->Setup(zip_fd, dex_filenames, /*dex_fds=*/ArrayRef<const int>(), error_msg)) {
     return nullptr;
   }
 
@@ -1833,7 +1831,6 @@
                        bool executable,
                        bool low_4gb,
                        ArrayRef<const std::string> dex_filenames,
-                       ArrayRef<const int> dex_fds,
                        /*inout*/MemMap* reservation,
                        /*out*/std::string* error_msg) {
   CHECK(!oat_location.empty()) << oat_location;
@@ -1849,7 +1846,6 @@
                                                                 executable,
                                                                 low_4gb,
                                                                 dex_filenames,
-                                                                dex_fds,
                                                                 reservation,
                                                                 error_msg);
   return with_internal;
diff --git a/runtime/oat_file.h b/runtime/oat_file.h
index 5c98176..beb231c 100644
--- a/runtime/oat_file.h
+++ b/runtime/oat_file.h
@@ -154,7 +154,6 @@
                        bool executable,
                        bool low_4gb,
                        ArrayRef<const std::string> dex_filenames,
-                       ArrayRef<const int> dex_fds,
                        /*inout*/MemMap* reservation,  // Where to load if not null.
                        /*out*/std::string* error_msg);
 
diff --git a/runtime/oat_file_assistant.cc b/runtime/oat_file_assistant.cc
index 109769c..67ee940 100644
--- a/runtime/oat_file_assistant.cc
+++ b/runtime/oat_file_assistant.cc
@@ -877,7 +877,6 @@
                                   executable,
                                   /*low_4gb=*/ false,
                                   dex_locations,
-                                  /*dex_fds=*/ ArrayRef<const int>(),
                                   /*reservation=*/ nullptr,
                                   &error_msg));
       }
diff --git a/runtime/parsed_options.cc b/runtime/parsed_options.cc
index f27947e..af45213 100644
--- a/runtime/parsed_options.cc
+++ b/runtime/parsed_options.cc
@@ -115,15 +115,6 @@
       .Define("-Xbootclasspathfds:_")
           .WithType<ParseIntList<':'>>()
           .IntoKey(M::BootClassPathFds)
-      .Define("-Xbootclasspathimagefds:_")
-          .WithType<ParseIntList<':'>>()
-          .IntoKey(M::BootClassPathImageFds)
-      .Define("-Xbootclasspathvdexfds:_")
-          .WithType<ParseIntList<':'>>()
-          .IntoKey(M::BootClassPathVdexFds)
-      .Define("-Xbootclasspathoatfds:_")
-          .WithType<ParseIntList<':'>>()
-          .IntoKey(M::BootClassPathOatFds)
       .Define("-Xcheck:jni")
           .IntoKey(M::CheckJni)
       .Define("-Xms_")
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index b64c5e3..91cbd67 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -1206,7 +1206,6 @@
 
 static size_t OpenBootDexFiles(ArrayRef<const std::string> dex_filenames,
                                ArrayRef<const std::string> dex_locations,
-                               ArrayRef<const int> dex_fds,
                                std::vector<std::unique_ptr<const DexFile>>* dex_files) {
   DCHECK(dex_files != nullptr) << "OpenDexFiles: out-param is nullptr";
   size_t failure_count = 0;
@@ -1214,22 +1213,20 @@
   for (size_t i = 0; i < dex_filenames.size(); i++) {
     const char* dex_filename = dex_filenames[i].c_str();
     const char* dex_location = dex_locations[i].c_str();
-    const int dex_fd = i < dex_fds.size() ? dex_fds[i] : -1;
     static constexpr bool kVerifyChecksum = true;
     std::string error_msg;
-    if (!OS::FileExists(dex_filename) && dex_fd < 0) {
+    if (!OS::FileExists(dex_filename)) {
       LOG(WARNING) << "Skipping non-existent dex file '" << dex_filename << "'";
       continue;
     }
     bool verify = Runtime::Current()->IsVerificationEnabled();
     if (!dex_file_loader.Open(dex_filename,
-                              dex_fd,
                               dex_location,
                               verify,
                               kVerifyChecksum,
                               &error_msg,
                               dex_files)) {
-      LOG(WARNING) << "Failed to open .dex from file '" << dex_filename << "' / fd " << dex_fd << ": " << error_msg;
+      LOG(WARNING) << "Failed to open .dex from file '" << dex_filename << "': " << error_msg;
       ++failure_count;
     }
   }
@@ -1416,16 +1413,6 @@
     return false;
   }
 
-  boot_class_path_image_fds_ = runtime_options.ReleaseOrDefault(Opt::BootClassPathImageFds);
-  boot_class_path_vdex_fds_ = runtime_options.ReleaseOrDefault(Opt::BootClassPathVdexFds);
-  boot_class_path_oat_fds_ = runtime_options.ReleaseOrDefault(Opt::BootClassPathOatFds);
-  CHECK(boot_class_path_image_fds_.empty() ||
-        boot_class_path_image_fds_.size() == boot_class_path_fds_.size());
-  CHECK(boot_class_path_vdex_fds_.empty() ||
-        boot_class_path_vdex_fds_.size() == boot_class_path_fds_.size());
-  CHECK(boot_class_path_oat_fds_.empty() ||
-        boot_class_path_oat_fds_.size() == boot_class_path_fds_.size());
-
   class_path_string_ = runtime_options.ReleaseOrDefault(Opt::ClassPath);
   properties_ = runtime_options.ReleaseOrDefault(Opt::PropertiesList);
 
@@ -1550,9 +1537,6 @@
                        GetBootClassPath(),
                        GetBootClassPathLocations(),
                        GetBootClassPathFds(),
-                       GetBootClassPathImageFds(),
-                       GetBootClassPathVdexFds(),
-                       GetBootClassPathOatFds(),
                        image_locations_,
                        instruction_set_,
                        // Override the collector type to CC if the read barrier config.
@@ -1760,12 +1744,8 @@
       if (runtime_options.Exists(Opt::BootClassPathDexList)) {
         extra_boot_class_path.swap(*runtime_options.GetOrDefault(Opt::BootClassPathDexList));
       } else {
-        ArrayRef<const int> bcp_fds = start < GetBootClassPathFds().size()
-            ? ArrayRef<const int>(GetBootClassPathFds()).SubArray(start)
-            : ArrayRef<const int>();
         OpenBootDexFiles(ArrayRef<const std::string>(GetBootClassPath()).SubArray(start),
                          ArrayRef<const std::string>(GetBootClassPathLocations()).SubArray(start),
-                         bcp_fds,
                          &extra_boot_class_path);
       }
       class_linker_->AddExtraBootDexFiles(self, std::move(extra_boot_class_path));
@@ -1784,7 +1764,6 @@
     } else {
       OpenBootDexFiles(ArrayRef<const std::string>(GetBootClassPath()),
                        ArrayRef<const std::string>(GetBootClassPathLocations()),
-                       ArrayRef<const int>(GetBootClassPathFds()),
                        &boot_class_path);
     }
     if (!class_linker_->InitWithoutImage(std::move(boot_class_path), &error_msg)) {
diff --git a/runtime/runtime.h b/runtime/runtime.h
index 221bcaf..eb313e0 100644
--- a/runtime/runtime.h
+++ b/runtime/runtime.h
@@ -292,18 +292,6 @@
     return boot_class_path_fds_;
   }
 
-  const std::vector<int>& GetBootClassPathImageFds() const {
-    return boot_class_path_image_fds_;
-  }
-
-  const std::vector<int>& GetBootClassPathVdexFds() const {
-    return boot_class_path_vdex_fds_;
-  }
-
-  const std::vector<int>& GetBootClassPathOatFds() const {
-    return boot_class_path_oat_fds_;
-  }
-
   // Returns the checksums for the boot image, extensions and extra boot class path dex files,
   // based on the image spaces and boot class path dex files loaded in memory.
   const std::string& GetBootClassPathChecksums() const {
@@ -1151,9 +1139,6 @@
   std::vector<std::string> boot_class_path_locations_;
   std::string boot_class_path_checksums_;
   std::vector<int> boot_class_path_fds_;
-  std::vector<int> boot_class_path_image_fds_;
-  std::vector<int> boot_class_path_vdex_fds_;
-  std::vector<int> boot_class_path_oat_fds_;
   std::string class_path_string_;
   std::vector<std::string> properties_;
 
diff --git a/runtime/runtime_options.def b/runtime/runtime_options.def
index 209c3d8..f5085e0 100644
--- a/runtime/runtime_options.def
+++ b/runtime/runtime_options.def
@@ -41,9 +41,6 @@
 RUNTIME_OPTIONS_KEY (ParseStringList<':'>,BootClassPath)           // std::vector<std::string>
 RUNTIME_OPTIONS_KEY (ParseStringList<':'>,BootClassPathLocations)  // std::vector<std::string>
 RUNTIME_OPTIONS_KEY (ParseIntList<':'>,   BootClassPathFds)        // std::vector<int>
-RUNTIME_OPTIONS_KEY (ParseIntList<':'>,   BootClassPathImageFds)   // std::vector<int>
-RUNTIME_OPTIONS_KEY (ParseIntList<':'>,   BootClassPathVdexFds)    // std::vector<int>
-RUNTIME_OPTIONS_KEY (ParseIntList<':'>,   BootClassPathOatFds)     // std::vector<int>
 RUNTIME_OPTIONS_KEY (std::string,         ClassPath)
 RUNTIME_OPTIONS_KEY (ParseStringList<':'>,Image)
 RUNTIME_OPTIONS_KEY (Unit,                CheckJni)
