mirror of
https://github.com/revanced/ARSCLib.git
synced 2025-05-02 07:04:27 +02:00
Fix xml attribute encoding
This commit is contained in:
parent
34a9742d6b
commit
04f1a817a0
@ -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
|
||||||
|
@ -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(){
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user