Fix bootclasspath string initialization
When running the runtime with an image without explicitly specifying
the bootclasspath (with the -Xbootclasspath option), we construct it
from the location of DEX files loaded from the image.
This allows to fix the JDWP test ClassPathsTest#testClassPaths001 on
the host where the bootclasspath is not explicitly specified on the
command line.
Bug: 18812378
Change-Id: I726eafd8b9e59dc9513beeb7082cf086fe89c4b1
diff --git a/runtime/jdwp/jdwp_handler.cc b/runtime/jdwp/jdwp_handler.cc
index b294e48..a1d2a6c 100644
--- a/runtime/jdwp/jdwp_handler.cc
+++ b/runtime/jdwp/jdwp_handler.cc
@@ -333,15 +333,15 @@
std::vector<std::string> class_path;
Split(Runtime::Current()->GetClassPathString(), ':', &class_path);
expandBufAdd4BE(pReply, class_path.size());
- for (size_t i = 0; i < class_path.size(); ++i) {
- expandBufAddUtf8String(pReply, class_path[i]);
+ for (const std::string& str : class_path) {
+ expandBufAddUtf8String(pReply, str);
}
std::vector<std::string> boot_class_path;
Split(Runtime::Current()->GetBootClassPathString(), ':', &boot_class_path);
expandBufAdd4BE(pReply, boot_class_path.size());
- for (size_t i = 0; i < boot_class_path.size(); ++i) {
- expandBufAddUtf8String(pReply, boot_class_path[i]);
+ for (const std::string& str : boot_class_path) {
+ expandBufAddUtf8String(pReply, str);
}
return ERR_NONE;
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index fb6034d..c2e814b 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -865,6 +865,16 @@
if (kIsDebugBuild) {
GetHeap()->GetImageSpace()->VerifyImageAllocations();
}
+ if (boot_class_path_string_.empty()) {
+ // The bootclasspath is not explicitly specified: construct it from the loaded dex files.
+ const std::vector<const DexFile*>& boot_class_path = GetClassLinker()->GetBootClassPath();
+ std::vector<std::string> dex_locations;
+ dex_locations.reserve(boot_class_path.size());
+ for (const DexFile* dex_file : boot_class_path) {
+ dex_locations.push_back(dex_file->GetLocation());
+ }
+ boot_class_path_string_ = Join(dex_locations, ':');
+ }
} else {
std::vector<std::string> dex_filenames;
Split(boot_class_path_string_, ':', &dex_filenames);