dexlayout: ProcessOffset in WriteHiddenapiClassData
WriteHiddenapiClassData would not call ProcessOffset before starting to
write data. This is only a problem if compute_offsets_ is false as it
would continue writing where previous section left off and that place
not being the end of the file.
This fixes dexlayout_test gtest.
Bug: 123150330
Test: m test-art-host-gtest-dexlayout_test
Change-Id: I552122d0968584db4a53d7219986f9693210b1e1
diff --git a/dexlayout/dex_writer.cc b/dexlayout/dex_writer.cc
index 143f5b0..268abe4 100644
--- a/dexlayout/dex_writer.cc
+++ b/dexlayout/dex_writer.cc
@@ -469,6 +469,7 @@
DCHECK_EQ(header_->HiddenapiClassDatas().Size(), header_->ClassDefs().Size());
stream->AlignTo(SectionAlignment(DexFile::kDexTypeHiddenapiClassData));
+ ProcessOffset(stream, &header_->HiddenapiClassDatas());
const uint32_t start = stream->Tell();
// Compute offsets for each class def and write the header.
@@ -989,6 +990,15 @@
}
}
+void DexWriter::ProcessOffset(Stream* stream, dex_ir::CollectionBase* item) {
+ if (compute_offsets_) {
+ item->SetOffset(stream->Tell());
+ } else {
+ // Not computing offsets, just use the one in the item.
+ stream->Seek(item->GetOffset());
+ }
+}
+
std::unique_ptr<DexContainer> DexWriter::CreateDexContainer() const {
return std::unique_ptr<DexContainer>(new DexWriter::Container);
}
diff --git a/dexlayout/dex_writer.h b/dexlayout/dex_writer.h
index 98041d3..62247ec 100644
--- a/dexlayout/dex_writer.h
+++ b/dexlayout/dex_writer.h
@@ -271,6 +271,7 @@
// Process an offset, if compute_offset is set, write into the dex ir item, otherwise read the
// existing offset and use that for writing.
void ProcessOffset(Stream* stream, dex_ir::Item* item);
+ void ProcessOffset(Stream* stream, dex_ir::CollectionBase* item);
dex_ir::Header* const header_;
DexLayout* const dex_layout_;