Fix xml attribute encoding

This commit is contained in:
REAndroid 2022-12-12 15:17:32 -05:00
parent 34a9742d6b
commit 04f1a817a0
3 changed files with 84 additions and 16 deletions

View File

@ -2,7 +2,7 @@
apply plugin: 'java-library' apply plugin: 'java-library'
group 'com.reandroid.lib.arsc' group 'com.reandroid.lib.arsc'
version '1.0.4' version '1.0.5'
java { java {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8

View File

@ -41,14 +41,6 @@ public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JS
addChild(4, mEndElementContainer); addChild(4, mEndElementContainer);
addChild(5, mEndNamespaceList); addChild(5, mEndNamespaceList);
} }
@Override
protected void onPreRefreshRefresh(){
ResXmlStartElement start = getStartElement();
if(start==null){
return;
}
start.getResXmlAttributeArray().sortAttributes();
}
public ResXmlElement createChildElement(){ public ResXmlElement createChildElement(){
return createChildElement(null); return createChildElement(null);
} }
@ -612,6 +604,7 @@ public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JS
child.fromJson(childObject); child.fromJson(childObject);
} }
} }
start.calculatePositions();
} }
@Override @Override
public String toString(){ public String toString(){

View File

@ -2,9 +2,11 @@ package com.reandroid.lib.arsc.chunk.xml;
import com.reandroid.lib.arsc.chunk.ChunkType; import com.reandroid.lib.arsc.chunk.ChunkType;
import com.reandroid.lib.arsc.array.ResXmlAttributeArray; import com.reandroid.lib.arsc.array.ResXmlAttributeArray;
import com.reandroid.lib.arsc.item.IntegerItem; import com.reandroid.lib.arsc.io.BlockReader;
import com.reandroid.lib.arsc.item.ShortItem; import com.reandroid.lib.arsc.item.ShortItem;
import com.reandroid.lib.arsc.pool.ResXmlStringPool;
import java.io.IOException;
import java.util.Collection; import java.util.Collection;
@ -12,8 +14,9 @@ public class ResXmlStartElement extends BaseXmlChunk {
private final ShortItem mAttributeStart; private final ShortItem mAttributeStart;
private final ShortItem mAttributeUnitSize; private final ShortItem mAttributeUnitSize;
private final ShortItem mAttributeCount; private final ShortItem mAttributeCount;
private final ShortItem mIdAttribute; private final ShortItem mIdAttributePosition;
private final IntegerItem mClassAttribute; private final ShortItem mClassAttributePosition;
private final ShortItem mStyleAttributePosition;
private final ResXmlAttributeArray mAttributeArray; private final ResXmlAttributeArray mAttributeArray;
private ResXmlEndElement mResXmlEndElement; private ResXmlEndElement mResXmlEndElement;
public ResXmlStartElement() { public ResXmlStartElement() {
@ -21,16 +24,77 @@ public class ResXmlStartElement extends BaseXmlChunk {
mAttributeStart=new ShortItem(ATTRIBUTES_DEFAULT_START); mAttributeStart=new ShortItem(ATTRIBUTES_DEFAULT_START);
mAttributeUnitSize =new ShortItem(ATTRIBUTES_UNIT_SIZE); mAttributeUnitSize =new ShortItem(ATTRIBUTES_UNIT_SIZE);
mAttributeCount=new ShortItem(); mAttributeCount=new ShortItem();
mIdAttribute=new ShortItem(); mIdAttributePosition =new ShortItem();
mClassAttribute=new IntegerItem(); mClassAttributePosition=new ShortItem();
mStyleAttributePosition=new ShortItem();
mAttributeArray=new ResXmlAttributeArray(getHeaderBlock(), mAttributeStart, mAttributeCount); mAttributeArray=new ResXmlAttributeArray(getHeaderBlock(), mAttributeStart, mAttributeCount);
addChild(mAttributeStart); addChild(mAttributeStart);
addChild(mAttributeUnitSize); addChild(mAttributeUnitSize);
addChild(mAttributeCount); addChild(mAttributeCount);
addChild(mIdAttribute); addChild(mIdAttributePosition);
addChild(mClassAttribute); addChild(mClassAttributePosition);
addChild(mStyleAttributePosition);
addChild(mAttributeArray); addChild(mAttributeArray);
} }
@Override
public void onReadBytes(BlockReader reader) throws IOException {
super.onReadBytes(reader);
if(mClassAttributePosition.get()==0 && mStyleAttributePosition.get()==0){
return;
}
ResXmlStringPool stringPool=getStringPool();
int c=(mClassAttributePosition.get() & 0xffff)-1;
int style = (mStyleAttributePosition.get() >>> 16) - 1;
int z=c+style;
stringPool.childesCount();
}
@Override
protected void onPreRefreshRefresh(){
sortAttributes();
}
private void sortAttributes(){
ResXmlAttributeArray array = getResXmlAttributeArray();
ResXmlAttribute idAttribute=array.get(mIdAttributePosition.get()-1);
ResXmlAttribute classAttribute=array.get(mClassAttributePosition.get()-1);
ResXmlAttribute styleAttribute=array.get(mStyleAttributePosition.get()-1);
array.sortAttributes();
if(idAttribute!=null){
mIdAttributePosition.set((short) (idAttribute.getIndex()+1));
}
if(classAttribute!=null){
mClassAttributePosition.set((short) (classAttribute.getIndex()+1));
// In case obfuscation
if(!"class".equals(classAttribute.getName())){
classAttribute.setName("class", 0);
}
}
if(styleAttribute!=null){
mStyleAttributePosition.set((short) (styleAttribute.getIndex()+1));
// In case obfuscation
if(!"style".equals(styleAttribute.getName())){
styleAttribute.setName("style", 0);
}
}
}
void calculatePositions(){
int android_id=0x010100d0;
ResXmlAttribute idAttribute=getAttribute(android_id);
ResXmlAttribute classAttribute=getNoIdAttribute("class");
ResXmlAttribute styleAttribute=getNoIdAttribute("style");
if(idAttribute!=null){
mIdAttributePosition.set((short) (idAttribute.getIndex()+1));
}
if(classAttribute!=null){
mClassAttributePosition.set((short) (classAttribute.getIndex()+1));
}
if(styleAttribute!=null){
mStyleAttributePosition.set((short) (styleAttribute.getIndex()+1));
}
}
public ResXmlAttribute getAttribute(int resourceId){ public ResXmlAttribute getAttribute(int resourceId){
for(ResXmlAttribute attribute:listResXmlAttributes()){ for(ResXmlAttribute attribute:listResXmlAttributes()){
if(resourceId==attribute.getNameResourceID()){ if(resourceId==attribute.getNameResourceID()){
@ -39,6 +103,17 @@ public class ResXmlStartElement extends BaseXmlChunk {
} }
return null; return null;
} }
private ResXmlAttribute getNoIdAttribute(String name){
for(ResXmlAttribute attribute:listResXmlAttributes()){
if(attribute.getNameResourceID()!=0){
continue;
}
if(name.equals(attribute.getName())){
return attribute;
}
}
return null;
}
public ResXmlAttribute getAttribute(String uri, String name){ public ResXmlAttribute getAttribute(String uri, String name){
if(name==null){ if(name==null){
return null; return null;