Revert "Revert "Don't embed the dex code in the oat file if dex is uncompressed.""
Bug: 63920015
Bug: 70854754
Test: oat_writer_test.cc, test.py
Revert was due to userdebug/user differences, which is fixed with:
https://googleplex-android-review.googlesource.com/#/c/platform/build/+/3434091/
This CL also fixes oatdump when the dex code is not in the .vdex file.
This reverts commit e166e67666bf4b23e4ed0a98f5e2bb3cae9cee7d.
Change-Id: Iec924be2ff8f03cf2ebe306e7a0018241f33beb0
diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc
index fcbf2f1..f2a69f3 100644
--- a/oatdump/oatdump.cc
+++ b/oatdump/oatdump.cc
@@ -1055,14 +1055,19 @@
os << StringPrintf("checksum: 0x%08x\n", oat_dex_file.GetDexFileLocationChecksum());
const uint8_t* const oat_file_begin = oat_dex_file.GetOatFile()->Begin();
- const uint8_t* const vdex_file_begin = oat_dex_file.GetOatFile()->DexBegin();
+ if (oat_dex_file.GetOatFile()->ContainsDexCode()) {
+ const uint8_t* const vdex_file_begin = oat_dex_file.GetOatFile()->DexBegin();
- // Print data range of the dex file embedded inside the corresponding vdex file.
- const uint8_t* const dex_file_pointer = oat_dex_file.GetDexFilePointer();
- uint32_t dex_offset = dchecked_integral_cast<uint32_t>(dex_file_pointer - vdex_file_begin);
- os << StringPrintf("dex-file: 0x%08x..0x%08x\n",
- dex_offset,
- dchecked_integral_cast<uint32_t>(dex_offset + oat_dex_file.FileSize() - 1));
+ // Print data range of the dex file embedded inside the corresponding vdex file.
+ const uint8_t* const dex_file_pointer = oat_dex_file.GetDexFilePointer();
+ uint32_t dex_offset = dchecked_integral_cast<uint32_t>(dex_file_pointer - vdex_file_begin);
+ os << StringPrintf(
+ "dex-file: 0x%08x..0x%08x\n",
+ dex_offset,
+ dchecked_integral_cast<uint32_t>(dex_offset + oat_dex_file.FileSize() - 1));
+ } else {
+ os << StringPrintf("dex-file not in VDEX file\n");
+ }
// Create the dex file early. A lot of print-out things depend on it.
std::string error_msg;
@@ -3041,8 +3046,15 @@
return (success) ? EXIT_SUCCESS : EXIT_FAILURE;
}
-static int DumpOat(Runtime* runtime, const char* oat_filename, OatDumperOptions* options,
+static int DumpOat(Runtime* runtime,
+ const char* oat_filename,
+ const char* dex_filename,
+ OatDumperOptions* options,
std::ostream* os) {
+ if (dex_filename == nullptr) {
+ LOG(WARNING) << "No dex filename provided, "
+ << "oatdump might fail if the oat file does not contain the dex code.";
+ }
std::string error_msg;
std::unique_ptr<OatFile> oat_file(OatFile::Open(oat_filename,
oat_filename,
@@ -3050,7 +3062,7 @@
nullptr,
false,
/*low_4gb*/false,
- nullptr,
+ dex_filename,
&error_msg));
if (oat_file == nullptr) {
fprintf(stderr, "Failed to open oat file from '%s': %s\n", oat_filename, error_msg.c_str());
@@ -3064,7 +3076,10 @@
}
}
-static int SymbolizeOat(const char* oat_filename, std::string& output_name, bool no_bits) {
+static int SymbolizeOat(const char* oat_filename,
+ const char* dex_filename,
+ std::string& output_name,
+ bool no_bits) {
std::string error_msg;
std::unique_ptr<OatFile> oat_file(OatFile::Open(oat_filename,
oat_filename,
@@ -3072,7 +3087,7 @@
nullptr,
false,
/*low_4gb*/false,
- nullptr,
+ dex_filename,
&error_msg));
if (oat_file == nullptr) {
fprintf(stderr, "Failed to open oat file from '%s': %s\n", oat_filename, error_msg.c_str());
@@ -3102,7 +3117,8 @@
static bool Dump(Runtime* runtime,
const std::string& imt_file,
bool dump_imt_stats,
- const char* oat_filename) {
+ const char* oat_filename,
+ const char* dex_filename) {
Thread* self = Thread::Current();
ScopedObjectAccess soa(self);
@@ -3118,7 +3134,7 @@
nullptr,
false,
/*low_4gb*/false,
- nullptr,
+ dex_filename,
&error_msg));
if (oat_file == nullptr) {
fprintf(stderr, "Failed to open oat file from '%s': %s\n", oat_filename, error_msg.c_str());
@@ -3553,6 +3569,8 @@
if (option.starts_with("--oat-file=")) {
oat_filename_ = option.substr(strlen("--oat-file=")).data();
+ } else if (option.starts_with("--dex-file=")) {
+ dex_filename_ = option.substr(strlen("--dex-file=")).data();
} else if (option.starts_with("--image=")) {
image_location_ = option.substr(strlen("--image=")).data();
} else if (option == "--no-dump:vmap") {
@@ -3704,6 +3722,7 @@
public:
const char* oat_filename_ = nullptr;
+ const char* dex_filename_ = nullptr;
const char* class_filter_ = "";
const char* method_filter_ = "";
const char* image_location_ = nullptr;
@@ -3764,10 +3783,12 @@
// This is what "strip --only-keep-debug" does when it creates separate ELF file
// with only debug data. We use it in similar way to exclude .rodata and .text.
bool no_bits = args_->only_keep_debug_;
- return SymbolizeOat(args_->oat_filename_, args_->output_name_, no_bits) == EXIT_SUCCESS;
+ return SymbolizeOat(args_->oat_filename_, args_->dex_filename_, args_->output_name_, no_bits)
+ == EXIT_SUCCESS;
} else {
return DumpOat(nullptr,
args_->oat_filename_,
+ args_->dex_filename_,
oat_dumper_options_.get(),
args_->os_) == EXIT_SUCCESS;
}
@@ -3780,12 +3801,14 @@
return IMTDumper::Dump(runtime,
args_->imt_dump_,
args_->imt_stat_dump_,
- args_->oat_filename_);
+ args_->oat_filename_,
+ args_->dex_filename_);
}
if (args_->oat_filename_ != nullptr) {
return DumpOat(runtime,
args_->oat_filename_,
+ args_->dex_filename_,
oat_dumper_options_.get(),
args_->os_) == EXIT_SUCCESS;
}