summaryrefslogtreecommitdiff
path: root/dexlayout/dex_ir_builder.cc
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2018-01-27 01:25:24 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2018-01-27 01:25:24 +0000
commiteaf09d10411c8b56f2b4b0c882eb63ef7d01ec0c (patch)
tree094c1552a8dbcd79147aea588afa667c2bd5c67b /dexlayout/dex_ir_builder.cc
parent9220335a2cc121afce989e8196ee93b54db9c834 (diff)
parent7517555480074dcbd5c6d9472d5a394ce0e88023 (diff)
Merge "Add dexlayout class filtering"
Diffstat (limited to 'dexlayout/dex_ir_builder.cc')
-rw-r--r--dexlayout/dex_ir_builder.cc29
1 files changed, 24 insertions, 5 deletions
diff --git a/dexlayout/dex_ir_builder.cc b/dexlayout/dex_ir_builder.cc
index 3ec163cea1..4f9bcdd742 100644
--- a/dexlayout/dex_ir_builder.cc
+++ b/dexlayout/dex_ir_builder.cc
@@ -20,13 +20,18 @@
#include <vector>
#include "dex_ir_builder.h"
+#include "dexlayout.h"
namespace art {
namespace dex_ir {
-static void CheckAndSetRemainingOffsets(const DexFile& dex_file, Collections* collections);
+static void CheckAndSetRemainingOffsets(const DexFile& dex_file,
+ Collections* collections,
+ const Options& options);
-Header* DexIrBuilder(const DexFile& dex_file, bool eagerly_assign_offsets) {
+Header* DexIrBuilder(const DexFile& dex_file,
+ bool eagerly_assign_offsets,
+ const Options& options) {
const DexFile::Header& disk_header = dex_file.GetHeader();
Header* header = new Header(disk_header.magic_,
disk_header.checksum_,
@@ -70,13 +75,22 @@ Header* DexIrBuilder(const DexFile& dex_file, bool eagerly_assign_offsets) {
// ClassDef table.
collections.SetClassDefsOffset(disk_header.class_defs_off_);
for (uint32_t i = 0; i < dex_file.NumClassDefs(); ++i) {
+ if (!options.class_filter_.empty()) {
+ // If the filter is enabled (not empty), filter out classes that don't have a matching
+ // descriptor.
+ const DexFile::ClassDef& class_def = dex_file.GetClassDef(i);
+ const char* descriptor = dex_file.GetClassDescriptor(class_def);
+ if (options.class_filter_.find(descriptor) == options.class_filter_.end()) {
+ continue;
+ }
+ }
collections.CreateClassDef(dex_file, i);
}
// MapItem.
collections.SetMapListOffset(disk_header.map_off_);
// CallSiteIds and MethodHandleItems.
collections.CreateCallSitesAndMethodHandles(dex_file);
- CheckAndSetRemainingOffsets(dex_file, &collections);
+ CheckAndSetRemainingOffsets(dex_file, &collections, options);
// Sort the vectors by the map order (same order as the file).
collections.SortVectorsByMapOrder();
@@ -89,7 +103,9 @@ Header* DexIrBuilder(const DexFile& dex_file, bool eagerly_assign_offsets) {
return header;
}
-static void CheckAndSetRemainingOffsets(const DexFile& dex_file, Collections* collections) {
+static void CheckAndSetRemainingOffsets(const DexFile& dex_file,
+ Collections* collections,
+ const Options& options) {
const DexFile::Header& disk_header = dex_file.GetHeader();
// Read MapItems and validate/set remaining offsets.
const DexFile::MapList* map = dex_file.GetMapList();
@@ -122,7 +138,10 @@ static void CheckAndSetRemainingOffsets(const DexFile& dex_file, Collections* co
CHECK_EQ(item->offset_, collections->MethodIdsOffset());
break;
case DexFile::kDexTypeClassDefItem:
- CHECK_EQ(item->size_, collections->ClassDefsSize());
+ if (options.class_filter_.empty()) {
+ // The filter may have removed some classes, this will get fixed up during writing.
+ CHECK_EQ(item->size_, collections->ClassDefsSize());
+ }
CHECK_EQ(item->offset_, collections->ClassDefsOffset());
break;
case DexFile::kDexTypeCallSiteIdItem: