From 2f75149baeb2f2a8ba5372dfc823476056c35641 Mon Sep 17 00:00:00 2001 From: REAndroid Date: Fri, 17 Feb 2023 08:17:32 -0500 Subject: [PATCH] link attributes resource id --- .../arsc/chunk/xml/ResXmlAttribute.java | 69 +++++++++++++------ .../com/reandroid/arsc/item/ResXmlID.java | 44 ++++++------ 2 files changed, 71 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlAttribute.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlAttribute.java index d008899..3e570e0 100755 --- a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlAttribute.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlAttribute.java @@ -15,7 +15,6 @@ */ package com.reandroid.arsc.chunk.xml; - import com.reandroid.arsc.array.ResXmlIDArray; import com.reandroid.arsc.decoder.ValueDecoder; import com.reandroid.arsc.group.EntryGroup; import com.reandroid.arsc.io.BlockReader; @@ -34,7 +33,8 @@ public class ResXmlAttribute extends ValueItem implements Comparable{ private ReferenceItem mNSReference; private ReferenceItem mNameReference; - private ReferenceItem mStringReference; + private ReferenceItem mNameIdReference; + private ReferenceItem mValueStringReference; public ResXmlAttribute(int attributeUnitSize) { super(attributeUnitSize, OFFSET_SIZE); byte[] bts = getBytesInternal(); @@ -79,7 +79,11 @@ return getString(getValueStringReference()); } public int getNameResourceID(){ - return getResourceId(getNameReference()); + ResXmlID xmlID = getResXmlID(); + if(xmlID != null){ + return xmlID.get(); + } + return 0; } public void setNameResourceID(int resourceId){ ResXmlIDMap xmlIDMap=getResXmlIDMap(); @@ -130,20 +134,12 @@ } return stringItem.getHtml(); } - private int getResourceId(int ref){ - if(ref<0){ - return 0; + private ResXmlID getResXmlID(){ + ResXmlIDMap xmlIDMap = getResXmlIDMap(); + if(xmlIDMap == null){ + return null; } - ResXmlIDMap xmlIDMap=getResXmlIDMap(); - if(xmlIDMap==null){ - return 0; - } - ResXmlIDArray xmlIDArray = xmlIDMap.getResXmlIDArray(); - ResXmlID xmlID = xmlIDArray.get(ref); - if(xmlID!=null){ - return xmlID.get(); - } - return 0; + return xmlIDMap.getResXmlIDArray().get(getNameReference()); } private ResXmlIDMap getResXmlIDMap(){ ResXmlElement xmlElement=getParentResXmlElement(); @@ -171,9 +167,11 @@ if(ref == getNameReference()){ return; } + unLinkNameId(getResXmlID()); unlink(mNameReference); putInteger(getBytesInternal(), OFFSET_NAME, ref); mNameReference = link(OFFSET_NAME); + linkNameId(); } int getValueStringReference(){ return getInteger(getBytesInternal(), OFFSET_STRING); @@ -182,9 +180,9 @@ if(ref == getValueStringReference()){ return; } - unlink(mStringReference); + unlink(mValueStringReference); putInteger(getBytesInternal(), OFFSET_STRING, ref); - mStringReference = link(OFFSET_STRING); + mValueStringReference = link(OFFSET_STRING); } @Override @@ -205,22 +203,49 @@ } @Override protected void onDataChanged(){ - if(getValueType()!=ValueType.STRING){ + if(getValueType()==ValueType.STRING){ + setValueStringReference(getData()); + }else { setValueStringReference(-1); } } + private void linkNameId(){ + ResXmlID xmlID = getResXmlID(); + if(xmlID==null){ + return; + } + unLinkNameId(xmlID); + ReferenceItem referenceItem = new ReferenceBlock<>(this, OFFSET_NAME); + xmlID.addReference(referenceItem); + mNameIdReference = referenceItem; + } + private void unLinkNameId(ResXmlID xmlID){ + ReferenceItem referenceItem = mNameIdReference; + if(referenceItem==null || xmlID == null){ + return; + } + xmlID.removeReference(referenceItem); + mNameIdReference = null; + } private void linkAll(){ unlink(mNSReference); mNSReference = link(OFFSET_NS); unlink(mNameReference); mNameReference = link(OFFSET_NAME); - unlink(mStringReference); - mStringReference = link(OFFSET_STRING); + unlink(mValueStringReference); + mValueStringReference = link(OFFSET_STRING); + + linkNameId(); } private void unlinkAll(){ unlink(mNSReference); unlink(mNameReference); - unlink(mStringReference); + unlink(mValueStringReference); + mNSReference = null; + mNameReference = null; + mValueStringReference = null; + + unLinkNameId(getResXmlID()); } private ReferenceItem link(int offset){ if(offset<0){ diff --git a/src/main/java/com/reandroid/arsc/item/ResXmlID.java b/src/main/java/com/reandroid/arsc/item/ResXmlID.java index bb72f5e..bcfb473 100755 --- a/src/main/java/com/reandroid/arsc/item/ResXmlID.java +++ b/src/main/java/com/reandroid/arsc/item/ResXmlID.java @@ -20,7 +20,6 @@ import com.reandroid.arsc.chunk.xml.ResXmlDocument; import com.reandroid.arsc.pool.ResXmlStringPool; import java.util.ArrayList; -import java.util.Collection; import java.util.List; public class ResXmlID extends IntegerItem { @@ -35,12 +34,6 @@ public class ResXmlID extends IntegerItem { public boolean removeReference(ReferenceItem ref){ return mReferencedList.remove(ref); } - public boolean removeAllReference(Collection referenceItems){ - return mReferencedList.removeAll(referenceItems); - } - public void removeAllReference(){ - mReferencedList.clear(); - } public List getReferencedList(){ return mReferencedList; } @@ -49,13 +42,8 @@ public class ResXmlID extends IntegerItem { mReferencedList.add(ref); } } - public void addReference(Collection refList){ - if(refList==null){ - return; - } - for(ReferenceItem ref:refList){ - addReference(ref); - } + public int getReferenceCount(){ + return mReferencedList.size(); } private void reUpdateReferences(int newIndex){ for(ReferenceItem ref:mReferencedList){ @@ -67,16 +55,19 @@ public class ResXmlID extends IntegerItem { reUpdateReferences(newIndex); } public String getName(){ - ResXmlStringPool stringPool=getXmlStringPool(); - if(stringPool==null){ - return null; - } - ResXmlString xmlString = stringPool.get(getIndex()); + ResXmlString xmlString = getResXmlString(); if(xmlString==null){ return null; } return xmlString.getHtml(); } + public ResXmlString getResXmlString(){ + ResXmlStringPool stringPool=getXmlStringPool(); + if(stringPool==null){ + return null; + } + return stringPool.get(getIndex()); + } private ResXmlStringPool getXmlStringPool(){ Block parent=this; while (parent!=null){ @@ -89,6 +80,19 @@ public class ResXmlID extends IntegerItem { } @Override public String toString(){ - return getIndex()+": "+String.format("0x%08x", get()); + StringBuilder builder = new StringBuilder(); + builder.append("USED-BY="); + builder.append(getReferenceCount()); + builder.append('{'); + String name = getName(); + if(name!=null){ + builder.append(name); + }else { + builder.append(getIndex()); + } + builder.append(':'); + builder.append(String.format("0x%08x", get())); + builder.append('}'); + return builder.toString(); } }