re-struct Value to include ResXmlAttribute

This commit is contained in:
REAndroid 2023-02-17 06:20:27 -05:00
parent 8023a75ae8
commit a48537a20e
10 changed files with 42 additions and 89 deletions

View File

@ -180,7 +180,7 @@ public class ApkModule {
continue; continue;
} }
for(TableString tableString:groupTableString.listItems()){ for(TableString tableString:groupTableString.listItems()){
List<Entry> entryList = tableString.listReferencedEntries(true); List<Entry> entryList = tableString.listReferencedEntries();
if(entryList.size()==0){ if(entryList.size()==0){
continue; continue;
} }

View File

@ -250,7 +250,7 @@ public class AndroidManifestBlock extends ResXmlDocument {
ResXmlElement manifestElement=getOrCreateManifestElement(); ResXmlElement manifestElement=getOrCreateManifestElement();
ResXmlAttribute attribute = manifestElement ResXmlAttribute attribute = manifestElement
.getOrCreateAndroidAttribute(attributeName, resourceId); .getOrCreateAndroidAttribute(attributeName, resourceId);
attribute.setValueAsInteger(value); attribute.setTypeAndData(ValueType.INT_DEC, value);
} }
private Integer getManifestAttributeInt(int resourceId){ private Integer getManifestAttributeInt(int resourceId){
ResXmlElement manifestElement=getManifestElement(); ResXmlElement manifestElement=getManifestElement();
@ -258,10 +258,10 @@ public class AndroidManifestBlock extends ResXmlDocument {
return null; return null;
} }
ResXmlAttribute attribute= manifestElement.searchAttributeByResourceId(resourceId); ResXmlAttribute attribute= manifestElement.searchAttributeByResourceId(resourceId);
if(attribute==null || !attribute.hasIntegerValue()){ if(attribute==null || attribute.getValueType()!=ValueType.INT_DEC){
return null; return null;
} }
return attribute.getValueAsInteger(); return attribute.getData();
} }
public ResXmlElement getApplicationElement(){ public ResXmlElement getApplicationElement(){
ResXmlElement manifestElement=getManifestElement(); ResXmlElement manifestElement=getManifestElement();

View File

@ -39,22 +39,10 @@
addChild(mNamespaceReference); addChild(mNamespaceReference);
addChild(mStringReference); addChild(mStringReference);
} }
Set<ResXmlString> clearStringReferences(){ void onRemoved(){
Set<ResXmlString> results=new HashSet<>(); unLinkStringReference(getHeaderBlock().getCommentReference());
ResXmlString xmlString; unLinkStringReference(mNamespaceReference);
xmlString=unLinkStringReference(getHeaderBlock().getCommentReference()); unLinkStringReference(mStringReference);
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 linkStringReferences(){ void linkStringReferences(){
linkStringReference(getHeaderBlock().getCommentReference()); linkStringReference(getHeaderBlock().getCommentReference());
@ -67,7 +55,7 @@
xmlString.addReferenceIfAbsent(item); xmlString.addReferenceIfAbsent(item);
} }
} }
ResXmlString unLinkStringReference(IntegerItem item){ void unLinkStringReference(IntegerItem item){
ResXmlString xmlString = getResXmlString(item.get()); ResXmlString xmlString = getResXmlString(item.get());
if(xmlString!=null){ if(xmlString!=null){
xmlString.removeReference(item); xmlString.removeReference(item);

View File

@ -21,7 +21,6 @@
import com.reandroid.arsc.container.SingleBlockContainer; import com.reandroid.arsc.container.SingleBlockContainer;
import com.reandroid.arsc.header.HeaderBlock; import com.reandroid.arsc.header.HeaderBlock;
import com.reandroid.arsc.io.BlockReader; import com.reandroid.arsc.io.BlockReader;
import com.reandroid.arsc.item.ResXmlString;
import com.reandroid.arsc.pool.ResXmlStringPool; import com.reandroid.arsc.pool.ResXmlStringPool;
import com.reandroid.common.EntryStore; import com.reandroid.common.EntryStore;
import com.reandroid.json.JSONConvert; import com.reandroid.json.JSONConvert;
@ -77,23 +76,21 @@
public ResXmlAttribute newAttribute(){ public ResXmlAttribute newAttribute(){
return getStartElement().newAttribute(); return getStartElement().newAttribute();
} }
Set<ResXmlString> clearStringReferences(){ void onRemoved(){
Set<ResXmlString> results=new HashSet<>();
for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){ for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){
results.addAll(startNamespace.clearStringReferences()); startNamespace.onRemoved();
} }
ResXmlStartElement start = getStartElement(); ResXmlStartElement start = getStartElement();
if(start!=null){ if(start!=null){
results.addAll(start.clearStringReferences()); start.onRemoved();
} }
ResXmlText resXmlText=getResXmlText(); ResXmlText resXmlText=getResXmlText();
if(resXmlText!=null){ if(resXmlText!=null){
results.addAll(resXmlText.clearStringReferences()); resXmlText.onRemoved();
} }
for(ResXmlElement child:listElements()){ for(ResXmlElement child:listElements()){
results.addAll(child.clearStringReferences()); child.onRemoved();
} }
return results;
} }
void linkStringReferences(){ void linkStringReferences(){
for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){ for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){
@ -284,18 +281,14 @@
mBody.add(element); mBody.add(element);
} }
public boolean removeAttribute(ResXmlAttribute resXmlAttribute){ public boolean removeAttribute(ResXmlAttribute resXmlAttribute){
if(resXmlAttribute != null){
resXmlAttribute.onRemoved();
}
return getStartElement().getResXmlAttributeArray().remove(resXmlAttribute); return getStartElement().getResXmlAttributeArray().remove(resXmlAttribute);
} }
public boolean removeElement(ResXmlElement element){ public boolean removeElement(ResXmlElement element){
if(element.getParent()!=null){ if(element.getParent()!=null){
// TODO: Find a way to remove properly from StringPool element.onRemoved();
Set<ResXmlString> removedStrings = element.clearStringReferences();
for(ResXmlString xmlString:removedStrings){
if(xmlString.getReferencedList().size()!=0){
continue;
}
xmlString.set("");
}
} }
return mBody.remove(element); return mBody.remove(element);
} }

View File

@ -66,21 +66,17 @@
if(end!=null){ if(end!=null){
end.linkStringReferences(); end.linkStringReferences();
} }
for(ResXmlAttribute attr:listResXmlAttributes()){
attr.linkStringReferences();
}
} }
@Override @Override
Set<ResXmlString> clearStringReferences(){ void onRemoved(){
Set<ResXmlString> results=super.clearStringReferences(); super.onRemoved();
ResXmlEndElement end = getResXmlEndElement(); ResXmlEndElement end = getResXmlEndElement();
if(end!=null){ if(end!=null){
results.addAll(end.clearStringReferences()); end.onRemoved();
} }
for(ResXmlAttribute attr:listResXmlAttributes()){ for(ResXmlAttribute attr:listResXmlAttributes()){
results.addAll(attr.clearStringReferences()); attr.onRemoved();
} }
return results;
} }
@Override @Override
protected void onPreRefreshRefresh(){ protected void onPreRefreshRefresh(){

View File

@ -41,13 +41,11 @@
} }
} }
@Override @Override
Set<ResXmlString> clearStringReferences(){ void onRemoved(){
Set<ResXmlString> results=super.clearStringReferences();
ResXmlEndNamespace end = getEnd(); ResXmlEndNamespace end = getEnd();
if(end!=null){ if(end!=null){
results.addAll(end.clearStringReferences()); end.onRemoved();
} }
return results;
} }
public XMLAttribute decodeToXml(){ public XMLAttribute decodeToXml(){
String uri=getUri(); String uri=getUri();

View File

@ -15,7 +15,9 @@
*/ */
package com.reandroid.arsc.item; package com.reandroid.arsc.item;
import com.reandroid.arsc.base.Block;
import com.reandroid.arsc.value.Entry; import com.reandroid.arsc.value.Entry;
import com.reandroid.arsc.value.ResValue;
import com.reandroid.arsc.value.ResValueMap; import com.reandroid.arsc.value.ResValueMap;
import com.reandroid.arsc.value.ValueItem; import com.reandroid.arsc.value.ValueItem;
@ -26,20 +28,21 @@ public class TableString extends StringItem {
public TableString(boolean utf8) { public TableString(boolean utf8) {
super(utf8); super(utf8);
} }
public List<Entry> listReferencedEntries(boolean ignoreBagEntries){ public List<Entry> listReferencedEntries(){
List<Entry> results=new ArrayList<>(); List<Entry> results=new ArrayList<>();
for(ReferenceItem ref:getReferencedList()){ for(ReferenceItem ref:getReferencedList()){
if(!(ref instanceof ReferenceBlock)){ if(!(ref instanceof ReferenceBlock)){
continue; continue;
} }
ValueItem valueItem = (ValueItem) ((ReferenceBlock)ref).getBlock(); Block block = ((ReferenceBlock<?>)ref).getBlock();
if(valueItem ==null){ if(block ==null){
continue; continue;
} }
if(ignoreBagEntries && (valueItem instanceof ResValueMap)){ if(!(block instanceof ResValue)){
continue; continue;
} }
results.add(valueItem.getParentEntry()); ResValue resValue = (ResValue) block;
results.add(resValue.getEntry());
} }
return results; return results;
} }

View File

@ -163,15 +163,16 @@ package com.reandroid.arsc.pool;
removeReference(ref); removeReference(ref);
} }
} }
public boolean removeReference(ReferenceItem ref){ public T removeReference(ReferenceItem ref){
if(ref==null){ if(ref==null){
return false; return null;
} }
T item=get(ref.get()); T item=get(ref.get());
if(item!=null){ if(item!=null){
return item.removeReference(ref); item.removeReference(ref);
return item;
} }
return false; return null;
} }
public void addReference(ReferenceItem ref){ public void addReference(ReferenceItem ref){
if(ref==null){ if(ref==null){

View File

@ -15,29 +15,14 @@
*/ */
package com.reandroid.arsc.value; package com.reandroid.arsc.value;
import com.reandroid.arsc.base.Block;
public class ResValue extends ValueItem { public class ResValue extends ValueItem {
public ResValue() { public ResValue() {
super(8); super(8, OFFSET_SIZE);
} }
public Entry getEntry(){ public Entry getEntry(){
Block parent = getParent(); return getParent(Entry.class);
while (parent!=null){
if(parent instanceof Entry){
return (Entry) parent;
}
parent = parent.getParent();
}
return null;
} }
@Override
int getSizeOffset(){
return OFFSET_SIZE;
}
private static final int OFFSET_SIZE = 0; private static final int OFFSET_SIZE = 0;
} }

View File

@ -21,18 +21,11 @@ import com.reandroid.json.JSONObject;
public class ResValueMap extends ValueItem{ public class ResValueMap extends ValueItem{
public ResValueMap() { public ResValueMap() {
super(12); super(12, OFFSET_SIZE);
} }
public Entry getEntry(){ public Entry getEntry(){
Block parent = getParent(); return getParent(Entry.class);
while (parent!=null){
if(parent instanceof Entry){
return (Entry) parent;
}
parent = parent.getParent();
}
return null;
} }
public ResTableMapEntry getParentMapEntry(){ public ResTableMapEntry getParentMapEntry(){
@ -53,10 +46,6 @@ public class ResValueMap extends ValueItem{
putInteger(getBytesInternal(), OFFSET_NAME, name); putInteger(getBytesInternal(), OFFSET_NAME, name);
} }
@Override
int getSizeOffset(){
return OFFSET_SIZE;
}
@Override @Override
public JSONObject toJson() { public JSONObject toJson() {