From 64c08b592a10666b4c2924e7ef33d013c03e6862 Mon Sep 17 00:00:00 2001 From: REAndroid Date: Mon, 27 Feb 2023 12:34:59 -0500 Subject: [PATCH] implement method to trim Entries --- .../reandroid/arsc/array/TypeBlockArray.java | 8 ++++ .../com/reandroid/arsc/base/BlockArray.java | 37 +++++++++++++++++++ .../com/reandroid/arsc/chunk/TypeBlock.java | 6 +++ .../arsc/container/SpecTypePair.java | 9 +++++ .../reandroid/arsc/item/ReferenceBlock.java | 4 ++ 5 files changed, 64 insertions(+) diff --git a/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java b/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java index 7593747..d26c375 100755 --- a/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java +++ b/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java @@ -45,6 +45,14 @@ public class TypeBlockArray extends BlockArray public void sort(){ sort(this); } + public boolean removeNullEntries(int startId){ + boolean result = true; + for(TypeBlock typeBlock:listItems()){ + boolean removed = typeBlock.removeNullEntries(startId); + result = result && removed; + } + return result; + } public void removeEmptyBlocks(){ List allTypes=new ArrayList<>(listItems()); boolean foundEmpty=false; diff --git a/src/main/java/com/reandroid/arsc/base/BlockArray.java b/src/main/java/com/reandroid/arsc/base/BlockArray.java index b00c29e..aef6f8e 100755 --- a/src/main/java/com/reandroid/arsc/base/BlockArray.java +++ b/src/main/java/com/reandroid/arsc/base/BlockArray.java @@ -24,6 +24,34 @@ public abstract class BlockArray extends BlockContainer impl elementData= newInstance(0); } + public void removeAllNull(int start){ + removeAll(start, true); + } + public void removeAll(int start){ + removeAll(start, false); + } + private void removeAll(int start, boolean check_null){ + List removeList = subList(start); + if(removeList.size()==0 || (check_null && !isAllNull(removeList))){ + return; + } + T[] itemArray = this.elementData; + for(T item:removeList){ + if(item==null){ + continue; + } + if(!item.isNull()){ + item.setNull(true); + } + int index = item.getIndex(); + if(index>=0 && itemArray[index]==item){ + item.setIndex(-1); + item.setParent(null); + itemArray[index] = null; + } + } + setChildesCount(start); + } public List subList(int start){ return subList(start, -1); } @@ -363,6 +391,15 @@ public abstract class BlockArray extends BlockContainer impl return "count="+ childesCount(); } + public static boolean isAllNull(Collection itemsList){ + for(Block item:itemsList){ + if(item!=null && !item.isNull()){ + return false; + } + } + return true; + } + private class BlockIterator implements Iterator { private int mCursor; private final int mMaxSize; diff --git a/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java b/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java index cc04bdc..d8e0440 100755 --- a/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java +++ b/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java @@ -53,6 +53,12 @@ public class TypeBlock extends Chunk addChild(entryOffsets); addChild(mEntryArray); } + public boolean removeNullEntries(int startId){ + startId = 0x0000ffff & startId; + EntryArray entryArray = getEntryArray(); + entryArray.removeAllNull(startId); + return entryArray.childesCount() == startId; + } public PackageBlock getPackageBlock(){ SpecTypePair specTypePair = getParent(SpecTypePair.class); if(specTypePair!=null){ diff --git a/src/main/java/com/reandroid/arsc/container/SpecTypePair.java b/src/main/java/com/reandroid/arsc/container/SpecTypePair.java index 8da83a2..7226479 100755 --- a/src/main/java/com/reandroid/arsc/container/SpecTypePair.java +++ b/src/main/java/com/reandroid/arsc/container/SpecTypePair.java @@ -65,6 +65,15 @@ public class SpecTypePair extends BlockContainer public void sortTypes(){ getTypeBlockArray().sort(); } + public boolean removeNullEntries(int startId){ + startId = 0x0000ffff & startId; + boolean removed = getTypeBlockArray().removeNullEntries(startId); + if(!removed){ + return false; + } + getSpecBlock().setEntryCount(startId); + return true; + } public void removeEmptyTypeBlocks(){ getTypeBlockArray().removeEmptyBlocks(); } diff --git a/src/main/java/com/reandroid/arsc/item/ReferenceBlock.java b/src/main/java/com/reandroid/arsc/item/ReferenceBlock.java index 2e31858..9a1302f 100644 --- a/src/main/java/com/reandroid/arsc/item/ReferenceBlock.java +++ b/src/main/java/com/reandroid/arsc/item/ReferenceBlock.java @@ -35,4 +35,8 @@ public class ReferenceBlock implements ReferenceItem{ public int get() { return BlockItem.getInteger(this.block.getBytes(), this.offset); } + @Override + public String toString(){ + return get()+":"+this.block; + } }