From a48537a20e102ceda80d60b9d71d91688eb39e2a Mon Sep 17 00:00:00 2001 From: REAndroid Date: Fri, 17 Feb 2023 06:20:27 -0500 Subject: [PATCH] re-struct Value to include ResXmlAttribute --- .../java/com/reandroid/apk/ApkModule.java | 2 +- .../arsc/chunk/xml/AndroidManifestBlock.java | 6 ++--- .../arsc/chunk/xml/BaseXmlChunk.java | 22 ++++------------ .../arsc/chunk/xml/ResXmlElement.java | 25 +++++++------------ .../arsc/chunk/xml/ResXmlStartElement.java | 12 +++------ .../arsc/chunk/xml/ResXmlStartNamespace.java | 6 ++--- .../com/reandroid/arsc/item/TableString.java | 13 ++++++---- .../com/reandroid/arsc/pool/StringPool.java | 9 ++++--- .../com/reandroid/arsc/value/ResValue.java | 21 +++------------- .../com/reandroid/arsc/value/ResValueMap.java | 15 ++--------- 10 files changed, 42 insertions(+), 89 deletions(-) diff --git a/src/main/java/com/reandroid/apk/ApkModule.java b/src/main/java/com/reandroid/apk/ApkModule.java index ec18e40..9eceda5 100644 --- a/src/main/java/com/reandroid/apk/ApkModule.java +++ b/src/main/java/com/reandroid/apk/ApkModule.java @@ -180,7 +180,7 @@ public class ApkModule { continue; } for(TableString tableString:groupTableString.listItems()){ - List entryList = tableString.listReferencedEntries(true); + List entryList = tableString.listReferencedEntries(); if(entryList.size()==0){ continue; } diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/AndroidManifestBlock.java b/src/main/java/com/reandroid/arsc/chunk/xml/AndroidManifestBlock.java index 339fb0d..b6e56de 100644 --- a/src/main/java/com/reandroid/arsc/chunk/xml/AndroidManifestBlock.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/AndroidManifestBlock.java @@ -250,7 +250,7 @@ public class AndroidManifestBlock extends ResXmlDocument { ResXmlElement manifestElement=getOrCreateManifestElement(); ResXmlAttribute attribute = manifestElement .getOrCreateAndroidAttribute(attributeName, resourceId); - attribute.setValueAsInteger(value); + attribute.setTypeAndData(ValueType.INT_DEC, value); } private Integer getManifestAttributeInt(int resourceId){ ResXmlElement manifestElement=getManifestElement(); @@ -258,10 +258,10 @@ public class AndroidManifestBlock extends ResXmlDocument { return null; } ResXmlAttribute attribute= manifestElement.searchAttributeByResourceId(resourceId); - if(attribute==null || !attribute.hasIntegerValue()){ + if(attribute==null || attribute.getValueType()!=ValueType.INT_DEC){ return null; } - return attribute.getValueAsInteger(); + return attribute.getData(); } public ResXmlElement getApplicationElement(){ ResXmlElement manifestElement=getManifestElement(); diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/BaseXmlChunk.java b/src/main/java/com/reandroid/arsc/chunk/xml/BaseXmlChunk.java index 7135abf..13676f7 100755 --- a/src/main/java/com/reandroid/arsc/chunk/xml/BaseXmlChunk.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/BaseXmlChunk.java @@ -39,22 +39,10 @@ addChild(mNamespaceReference); addChild(mStringReference); } - Set clearStringReferences(){ - Set results=new HashSet<>(); - ResXmlString xmlString; - xmlString=unLinkStringReference(getHeaderBlock().getCommentReference()); - if(xmlString!=null){ - results.add(xmlString); - } - xmlString=unLinkStringReference(mNamespaceReference); - if(xmlString!=null){ - results.add(xmlString); - } - xmlString=unLinkStringReference(mStringReference); - if(xmlString!=null){ - results.add(xmlString); - } - return results; + void onRemoved(){ + unLinkStringReference(getHeaderBlock().getCommentReference()); + unLinkStringReference(mNamespaceReference); + unLinkStringReference(mStringReference); } void linkStringReferences(){ linkStringReference(getHeaderBlock().getCommentReference()); @@ -67,7 +55,7 @@ xmlString.addReferenceIfAbsent(item); } } - ResXmlString unLinkStringReference(IntegerItem item){ + void unLinkStringReference(IntegerItem item){ ResXmlString xmlString = getResXmlString(item.get()); if(xmlString!=null){ xmlString.removeReference(item); diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlElement.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlElement.java index 827d3cd..3eb1adb 100755 --- a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlElement.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlElement.java @@ -21,7 +21,6 @@ import com.reandroid.arsc.container.SingleBlockContainer; import com.reandroid.arsc.header.HeaderBlock; import com.reandroid.arsc.io.BlockReader; - import com.reandroid.arsc.item.ResXmlString; import com.reandroid.arsc.pool.ResXmlStringPool; import com.reandroid.common.EntryStore; import com.reandroid.json.JSONConvert; @@ -77,23 +76,21 @@ public ResXmlAttribute newAttribute(){ return getStartElement().newAttribute(); } - Set clearStringReferences(){ - Set results=new HashSet<>(); + void onRemoved(){ for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){ - results.addAll(startNamespace.clearStringReferences()); + startNamespace.onRemoved(); } ResXmlStartElement start = getStartElement(); if(start!=null){ - results.addAll(start.clearStringReferences()); + start.onRemoved(); } ResXmlText resXmlText=getResXmlText(); if(resXmlText!=null){ - results.addAll(resXmlText.clearStringReferences()); + resXmlText.onRemoved(); } for(ResXmlElement child:listElements()){ - results.addAll(child.clearStringReferences()); + child.onRemoved(); } - return results; } void linkStringReferences(){ for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){ @@ -284,18 +281,14 @@ mBody.add(element); } public boolean removeAttribute(ResXmlAttribute resXmlAttribute){ + if(resXmlAttribute != null){ + resXmlAttribute.onRemoved(); + } return getStartElement().getResXmlAttributeArray().remove(resXmlAttribute); } public boolean removeElement(ResXmlElement element){ if(element.getParent()!=null){ - // TODO: Find a way to remove properly from StringPool - Set removedStrings = element.clearStringReferences(); - for(ResXmlString xmlString:removedStrings){ - if(xmlString.getReferencedList().size()!=0){ - continue; - } - xmlString.set(""); - } + element.onRemoved(); } return mBody.remove(element); } diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartElement.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartElement.java index 2716ea5..fc481ca 100755 --- a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartElement.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartElement.java @@ -66,21 +66,17 @@ if(end!=null){ end.linkStringReferences(); } - for(ResXmlAttribute attr:listResXmlAttributes()){ - attr.linkStringReferences(); - } } @Override - Set clearStringReferences(){ - Set results=super.clearStringReferences(); + void onRemoved(){ + super.onRemoved(); ResXmlEndElement end = getResXmlEndElement(); if(end!=null){ - results.addAll(end.clearStringReferences()); + end.onRemoved(); } for(ResXmlAttribute attr:listResXmlAttributes()){ - results.addAll(attr.clearStringReferences()); + attr.onRemoved(); } - return results; } @Override protected void onPreRefreshRefresh(){ diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartNamespace.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartNamespace.java index ea0778a..d65f8da 100755 --- a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartNamespace.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartNamespace.java @@ -41,13 +41,11 @@ } } @Override - Set clearStringReferences(){ - Set results=super.clearStringReferences(); + void onRemoved(){ ResXmlEndNamespace end = getEnd(); if(end!=null){ - results.addAll(end.clearStringReferences()); + end.onRemoved(); } - return results; } public XMLAttribute decodeToXml(){ String uri=getUri(); diff --git a/src/main/java/com/reandroid/arsc/item/TableString.java b/src/main/java/com/reandroid/arsc/item/TableString.java index 077a709..f011de2 100755 --- a/src/main/java/com/reandroid/arsc/item/TableString.java +++ b/src/main/java/com/reandroid/arsc/item/TableString.java @@ -15,7 +15,9 @@ */ package com.reandroid.arsc.item; +import com.reandroid.arsc.base.Block; import com.reandroid.arsc.value.Entry; +import com.reandroid.arsc.value.ResValue; import com.reandroid.arsc.value.ResValueMap; import com.reandroid.arsc.value.ValueItem; @@ -26,20 +28,21 @@ public class TableString extends StringItem { public TableString(boolean utf8) { super(utf8); } - public List listReferencedEntries(boolean ignoreBagEntries){ + public List listReferencedEntries(){ List results=new ArrayList<>(); for(ReferenceItem ref:getReferencedList()){ if(!(ref instanceof ReferenceBlock)){ continue; } - ValueItem valueItem = (ValueItem) ((ReferenceBlock)ref).getBlock(); - if(valueItem ==null){ + Block block = ((ReferenceBlock)ref).getBlock(); + if(block ==null){ continue; } - if(ignoreBagEntries && (valueItem instanceof ResValueMap)){ + if(!(block instanceof ResValue)){ continue; } - results.add(valueItem.getParentEntry()); + ResValue resValue = (ResValue) block; + results.add(resValue.getEntry()); } return results; } diff --git a/src/main/java/com/reandroid/arsc/pool/StringPool.java b/src/main/java/com/reandroid/arsc/pool/StringPool.java index 683f14c..29c337d 100755 --- a/src/main/java/com/reandroid/arsc/pool/StringPool.java +++ b/src/main/java/com/reandroid/arsc/pool/StringPool.java @@ -163,15 +163,16 @@ package com.reandroid.arsc.pool; removeReference(ref); } } - public boolean removeReference(ReferenceItem ref){ + public T removeReference(ReferenceItem ref){ if(ref==null){ - return false; + return null; } T item=get(ref.get()); if(item!=null){ - return item.removeReference(ref); + item.removeReference(ref); + return item; } - return false; + return null; } public void addReference(ReferenceItem ref){ if(ref==null){ diff --git a/src/main/java/com/reandroid/arsc/value/ResValue.java b/src/main/java/com/reandroid/arsc/value/ResValue.java index 047397e..1fdae9f 100755 --- a/src/main/java/com/reandroid/arsc/value/ResValue.java +++ b/src/main/java/com/reandroid/arsc/value/ResValue.java @@ -15,29 +15,14 @@ */ package com.reandroid.arsc.value; -import com.reandroid.arsc.base.Block; - public class ResValue extends ValueItem { public ResValue() { - super(8); + super(8, OFFSET_SIZE); } + public Entry getEntry(){ - Block parent = getParent(); - while (parent!=null){ - if(parent instanceof Entry){ - return (Entry) parent; - } - parent = parent.getParent(); - } - return null; + return getParent(Entry.class); } - @Override - int getSizeOffset(){ - return OFFSET_SIZE; - } - - private static final int OFFSET_SIZE = 0; - } diff --git a/src/main/java/com/reandroid/arsc/value/ResValueMap.java b/src/main/java/com/reandroid/arsc/value/ResValueMap.java index ec9dac7..ccad1a5 100755 --- a/src/main/java/com/reandroid/arsc/value/ResValueMap.java +++ b/src/main/java/com/reandroid/arsc/value/ResValueMap.java @@ -21,18 +21,11 @@ import com.reandroid.json.JSONObject; public class ResValueMap extends ValueItem{ public ResValueMap() { - super(12); + super(12, OFFSET_SIZE); } public Entry getEntry(){ - Block parent = getParent(); - while (parent!=null){ - if(parent instanceof Entry){ - return (Entry) parent; - } - parent = parent.getParent(); - } - return null; + return getParent(Entry.class); } public ResTableMapEntry getParentMapEntry(){ @@ -53,10 +46,6 @@ public class ResValueMap extends ValueItem{ putInteger(getBytesInternal(), OFFSET_NAME, name); } - @Override - int getSizeOffset(){ - return OFFSET_SIZE; - } @Override public JSONObject toJson() {