diff options
Diffstat (limited to 'dexlayout/dex_ir_builder.cc')
-rw-r--r-- | dexlayout/dex_ir_builder.cc | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/dexlayout/dex_ir_builder.cc b/dexlayout/dex_ir_builder.cc index 947d3d5297..c38e563f18 100644 --- a/dexlayout/dex_ir_builder.cc +++ b/dexlayout/dex_ir_builder.cc @@ -170,6 +170,7 @@ class BuilderMaps { void AddAnnotationsFromMapListSection(const DexFile& dex_file, uint32_t start_offset, uint32_t count); + void AddHiddenapiClassDataFromMapListSection(const DexFile& dex_file, uint32_t offset); void CheckAndSetRemainingOffsets(const DexFile& dex_file, const Options& options); @@ -408,6 +409,10 @@ void BuilderMaps::CheckAndSetRemainingOffsets(const DexFile& dex_file, const Opt case DexFile::kDexTypeAnnotationsDirectoryItem: header_->AnnotationsDirectoryItems().SetOffset(item->offset_); break; + case DexFile::kDexTypeHiddenapiClassData: + header_->HiddenapiClassDatas().SetOffset(item->offset_); + AddHiddenapiClassDataFromMapListSection(dex_file, item->offset_); + break; default: LOG(ERROR) << "Unknown map list item type."; } @@ -624,6 +629,44 @@ void BuilderMaps::AddAnnotationsFromMapListSection(const DexFile& dex_file, } } +void BuilderMaps::AddHiddenapiClassDataFromMapListSection(const DexFile& dex_file, + uint32_t offset) { + const DexFile::HiddenapiClassData* hiddenapi_class_data = + dex_file.GetHiddenapiClassDataAtOffset(offset); + DCHECK(hiddenapi_class_data == dex_file.GetHiddenapiClassData()); + + for (size_t i = 0; i < dex_file.NumClassDefs(); ++i) { + ClassDef* class_def = header_->ClassDefs()[i]; + ClassData* class_data = class_def->GetClassData(); + const uint8_t* ptr = hiddenapi_class_data->GetFlagsPointer(i); + + std::unique_ptr<HiddenapiFlagsMap> flags = nullptr; + if (ptr != nullptr) { + DCHECK(class_data != nullptr); + flags = std::make_unique<HiddenapiFlagsMap>(); + for (const dex_ir::FieldItem& field : *class_data->StaticFields()) { + flags->emplace(&field, DecodeUnsignedLeb128(&ptr)); + } + for (const dex_ir::FieldItem& field : *class_data->InstanceFields()) { + flags->emplace(&field, DecodeUnsignedLeb128(&ptr)); + } + for (const dex_ir::MethodItem& method : *class_data->DirectMethods()) { + flags->emplace(&method, DecodeUnsignedLeb128(&ptr)); + } + for (const dex_ir::MethodItem& method : *class_data->VirtualMethods()) { + flags->emplace(&method, DecodeUnsignedLeb128(&ptr)); + } + } + + CreateAndAddIndexedItem(header_->HiddenapiClassDatas(), + header_->HiddenapiClassDatas().GetOffset() + + hiddenapi_class_data->flags_offset_[i], + i, + class_def, + std::move(flags)); + } +} + AnnotationItem* BuilderMaps::CreateAnnotationItem(const DexFile& dex_file, const DexFile::AnnotationItem* annotation) { const uint8_t* const start_data = reinterpret_cast<const uint8_t*>(annotation); @@ -908,13 +951,13 @@ ClassData* BuilderMaps::CreateClassData(const DexFile& dex_file, FieldItemVector* static_fields = new FieldItemVector(); for (const ClassAccessor::Field& field : accessor.GetStaticFields()) { FieldId* field_item = header_->FieldIds()[field.GetIndex()]; - uint32_t access_flags = field.GetRawAccessFlags(); + uint32_t access_flags = field.GetAccessFlags(); static_fields->emplace_back(access_flags, field_item); } FieldItemVector* instance_fields = new FieldItemVector(); for (const ClassAccessor::Field& field : accessor.GetInstanceFields()) { FieldId* field_item = header_->FieldIds()[field.GetIndex()]; - uint32_t access_flags = field.GetRawAccessFlags(); + uint32_t access_flags = field.GetAccessFlags(); instance_fields->emplace_back(access_flags, field_item); } // Direct methods. @@ -1180,7 +1223,7 @@ void BuilderMaps::ReadEncodedValue(const DexFile& dex_file, MethodItem BuilderMaps::GenerateMethodItem(const DexFile& dex_file, const ClassAccessor::Method& method) { MethodId* method_id = header_->MethodIds()[method.GetIndex()]; - uint32_t access_flags = method.GetRawAccessFlags(); + uint32_t access_flags = method.GetAccessFlags(); const DexFile::CodeItem* disk_code_item = method.GetCodeItem(); // Temporary hack to prevent incorrectly deduping code items if they have the same offset since // they may have different debug info streams. |