This commit is contained in:
REAndroid 2021-11-15 04:06:14 +08:00
parent 2fccb3e6b7
commit 2e8ecc6e40
10 changed files with 306 additions and 19 deletions

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-6.5.1-all.zip distributionUrl=file:///home/d/services.gradle.org/distributions/gradle-6.5.1-all.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -4,6 +4,8 @@ import com.reandroid.lib.arsc.array.LibraryInfoArray;
import com.reandroid.lib.arsc.item.IntegerItem; import com.reandroid.lib.arsc.item.IntegerItem;
import com.reandroid.lib.arsc.value.LibraryInfo; import com.reandroid.lib.arsc.value.LibraryInfo;
import java.util.List;
public class LibraryBlock extends BaseChunk { public class LibraryBlock extends BaseChunk {
private final IntegerItem mLibCount; private final IntegerItem mLibCount;
private final LibraryInfoArray mLibraryInfoArray; private final LibraryInfoArray mLibraryInfoArray;
@ -37,6 +39,9 @@ public class LibraryBlock extends BaseChunk {
mLibraryInfoArray.add(info); mLibraryInfoArray.add(info);
mLibCount.set(mLibraryInfoArray.childesCount()); mLibCount.set(mLibraryInfoArray.childesCount());
} }
public List<LibraryInfo> listLibraryInfo(){
return mLibraryInfoArray.listItems();
}
@Override @Override
public boolean isNull(){ public boolean isNull(){
return mLibraryInfoArray.childesCount()==0; return mLibraryInfoArray.childesCount()==0;

View File

@ -3,12 +3,18 @@ package com.reandroid.lib.arsc.chunk;
import com.reandroid.lib.arsc.array.SpecTypePairArray; import com.reandroid.lib.arsc.array.SpecTypePairArray;
import com.reandroid.lib.arsc.base.Block; import com.reandroid.lib.arsc.base.Block;
import com.reandroid.lib.arsc.container.PackageLastBlocks; import com.reandroid.lib.arsc.container.PackageLastBlocks;
import com.reandroid.lib.arsc.container.SpecTypePair;
import com.reandroid.lib.arsc.group.EntryGroup;
import com.reandroid.lib.arsc.group.ItemGroup;
import com.reandroid.lib.arsc.item.IntegerItem; import com.reandroid.lib.arsc.item.IntegerItem;
import com.reandroid.lib.arsc.item.PackageName; import com.reandroid.lib.arsc.item.PackageName;
import com.reandroid.lib.arsc.pool.SpecStringPool; import com.reandroid.lib.arsc.pool.SpecStringPool;
import com.reandroid.lib.arsc.pool.TypeStringPool; import com.reandroid.lib.arsc.pool.TypeStringPool;
import com.reandroid.lib.arsc.value.EntryBlock;
import com.reandroid.lib.arsc.value.LibraryInfo; import com.reandroid.lib.arsc.value.LibraryInfo;
import java.util.*;
public class PackageBlock extends BaseChunk { public class PackageBlock extends BaseChunk {
private final IntegerItem mPackageId; private final IntegerItem mPackageId;
@ -28,6 +34,8 @@ public class PackageBlock extends BaseChunk {
private final PackageLastBlocks mPackageLastBlocks; private final PackageLastBlocks mPackageLastBlocks;
private final Map<Integer, EntryGroup> mEntriesGroup;
public PackageBlock() { public PackageBlock() {
super(ChunkType.PACKAGE, 3); super(ChunkType.PACKAGE, 3);
this.mPackageId=new IntegerItem(); this.mPackageId=new IntegerItem();
@ -45,6 +53,8 @@ public class PackageBlock extends BaseChunk {
this.mLibraryBlock=new LibraryBlock(); this.mLibraryBlock=new LibraryBlock();
this.mPackageLastBlocks=new PackageLastBlocks(mSpecTypePairArray, mLibraryBlock); this.mPackageLastBlocks=new PackageLastBlocks(mSpecTypePairArray, mLibraryBlock);
this.mEntriesGroup=new HashMap<>();
addToHeader(mPackageId); addToHeader(mPackageId);
addToHeader(mPackageName); addToHeader(mPackageName);
addToHeader(mTypeStrings); addToHeader(mTypeStrings);
@ -83,12 +93,57 @@ public class PackageBlock extends BaseChunk {
} }
return null; return null;
} }
public int getPackageId(){
return mPackageId.get();
}
public int setPackageId(){
return mPackageId.get();
}
public String getPackageName(){
return mPackageName.get();
}
public void setPackageName(String name){
mPackageName.set(name);
}
public void setTypeStrings(int i){
mTypeStrings.set(i);
}
public int getLastPublicType(){
return mLastPublicType.get();
}
public void setLastPublicType(int i){
mLastPublicType.set(i);
}
public int getKeyStrings(){
return mKeyStrings.get();
}
public void setKeyStrings(int i){
mKeyStrings.set(i);
}
public int getLastPublicKey(){
return mLastPublicKey.get();
}
public void setLastPublicKey(int i){
mLastPublicKey.set(i);
}
public int getTypeIdOffset(){
return mTypeIdOffset.get();
}
public void setTypeIdOffset(int i){
mTypeIdOffset.set(i);
}
public TypeStringPool getTypeStringPool(){ public TypeStringPool getTypeStringPool(){
return mTypeStringPool; return mTypeStringPool;
} }
public SpecStringPool getSpecStringPool(){ public SpecStringPool getSpecStringPool(){
return mSpecStringPool; return mSpecStringPool;
} }
public SpecTypePairArray getSpecTypePairArray(){
return mSpecTypePairArray;
}
public List<LibraryInfo> listLibraryInfo(){
return mLibraryBlock.listLibraryInfo();
}
public void addLibrary(LibraryBlock libraryBlock){ public void addLibrary(LibraryBlock libraryBlock){
if(libraryBlock==null){ if(libraryBlock==null){
@ -105,11 +160,51 @@ public class PackageBlock extends BaseChunk {
public void addLibraryInfo(LibraryInfo info){ public void addLibraryInfo(LibraryInfo info){
mLibraryBlock.addLibraryInfo(info); mLibraryBlock.addLibraryInfo(info);
} }
public Set<Integer> listResourceIds(){
return mEntriesGroup.keySet();
}
public Collection<EntryGroup> listEntryGroup(){
return mEntriesGroup.values();
}
public EntryGroup getEntryGroup(int resId){
return mEntriesGroup.get(resId);
}
private void updateEntryGroup(EntryBlock entryBlock){
int resId=entryBlock.getResourceId();
EntryGroup group=mEntriesGroup.get(resId);
if(group==null){
group=new EntryGroup(resId);
mEntriesGroup.put(resId, group);
}
group.add(entryBlock);
}
public List<EntryBlock> listEntries(byte typeId, int entryId){
List<EntryBlock> results=new ArrayList<>();
for(SpecTypePair pair:listSpecTypePair(typeId)){
results.addAll(pair.listEntries(entryId));
}
return results;
}
public List<SpecTypePair> listSpecTypePair(byte typeId){
List<SpecTypePair> results=new ArrayList<>();
for(SpecTypePair pair:listAllSpecTypePair()){
if(typeId==pair.getTypeId()){
results.add(pair);
}
}
return results;
}
public List<SpecTypePair> listAllSpecTypePair(){
return getSpecTypePairArray().listItems();
}
private void refreshKeyStrings(){ private void refreshKeyStrings(){
int pos=countUpTo(mSpecStringPool); int pos=countUpTo(mSpecStringPool);
mKeyStrings.set(pos); mKeyStrings.set(pos);
} }
public void onEntryAdded(EntryBlock entryBlock){
updateEntryGroup(entryBlock);
}
@Override @Override
public void onChunkLoaded() { public void onChunkLoaded() {
} }

View File

@ -3,8 +3,12 @@ package com.reandroid.lib.arsc.chunk;
import com.reandroid.lib.arsc.array.EntryBlockArray; import com.reandroid.lib.arsc.array.EntryBlockArray;
import com.reandroid.lib.arsc.item.IntegerArray; import com.reandroid.lib.arsc.item.IntegerArray;
import com.reandroid.lib.arsc.item.IntegerItem; import com.reandroid.lib.arsc.item.IntegerItem;
import com.reandroid.lib.arsc.value.EntryBlock;
import com.reandroid.lib.arsc.value.ResConfig; import com.reandroid.lib.arsc.value.ResConfig;
import java.util.ArrayList;
import java.util.List;
public class TypeBlock extends BaseTypeBlock { public class TypeBlock extends BaseTypeBlock {
private final IntegerItem mEntriesStart; private final IntegerItem mEntriesStart;
private final ResConfig mResConfig; private final ResConfig mResConfig;
@ -29,6 +33,24 @@ public class TypeBlock extends BaseTypeBlock {
public EntryBlockArray getEntryBlockArray(){ public EntryBlockArray getEntryBlockArray(){
return mEntryArray; return mEntryArray;
} }
public List<EntryBlock> listEntries(){
return listEntries(false);
}
public List<EntryBlock> listEntries(boolean includeNull){
List<EntryBlock> results=new ArrayList<>();
for(EntryBlock entryBlock:mEntryArray.listItems()){
if(!includeNull){
if(entryBlock.isNull()){
continue;
}
}
results.add(entryBlock);
}
return results;
}
public EntryBlock getEntryBlock(int entryId){
return mEntryArray.get(entryId);
}
@Override @Override
void onSetEntryCount(int count) { void onSetEntryCount(int count) {
mEntryArray.setChildesCount(count); mEntryArray.setChildesCount(count);

View File

@ -6,11 +6,14 @@ import com.reandroid.lib.arsc.base.Block;
import com.reandroid.lib.arsc.base.BlockContainer; import com.reandroid.lib.arsc.base.BlockContainer;
import com.reandroid.lib.arsc.chunk.PackageBlock; import com.reandroid.lib.arsc.chunk.PackageBlock;
import com.reandroid.lib.arsc.chunk.SpecBlock; import com.reandroid.lib.arsc.chunk.SpecBlock;
import com.reandroid.lib.arsc.chunk.TypeBlock;
import com.reandroid.lib.arsc.header.HeaderBlock; import com.reandroid.lib.arsc.header.HeaderBlock;
import com.reandroid.lib.arsc.io.BlockReader; import com.reandroid.lib.arsc.io.BlockReader;
import com.reandroid.lib.arsc.value.EntryBlock;
import com.reandroid.lib.arsc.value.ResConfig; import com.reandroid.lib.arsc.value.ResConfig;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class SpecTypePair extends BlockContainer<Block> { public class SpecTypePair extends BlockContainer<Block> {
@ -55,6 +58,20 @@ public class SpecTypePair extends BlockContainer<Block> {
} }
return null; return null;
} }
public List<EntryBlock> listEntries(int entryId){
List<EntryBlock> results=new ArrayList<>();
for(TypeBlock typeBlock:listTypeBlocks()){
EntryBlock entryBlock=typeBlock.getEntryBlock(entryId);
if(entryBlock==null||entryBlock.isNull()){
continue;
}
results.add(entryBlock);
}
return results;
}
public List<TypeBlock> listTypeBlocks(){
return mTypeBlockArray.listItems();
}
@Override @Override
protected void onRefreshed() { protected void onRefreshed() {

View File

@ -0,0 +1,100 @@
package com.reandroid.lib.arsc.group;
import com.reandroid.lib.arsc.base.BlockArrayCreator;
import com.reandroid.lib.arsc.chunk.PackageBlock;
import com.reandroid.lib.arsc.chunk.TypeBlock;
import com.reandroid.lib.arsc.item.SpecString;
import com.reandroid.lib.arsc.item.TypeString;
import com.reandroid.lib.arsc.pool.SpecStringPool;
import com.reandroid.lib.arsc.value.EntryBlock;
public class EntryGroup extends ItemGroup<EntryBlock> {
private final int resourceId;
public EntryGroup(int resId) {
super(create(), String.format("0x%08x", resId));
this.resourceId=resId;
}
public int getResourceId(){
return resourceId;
}
public void renameSpec(String name){
EntryBlock[] items=getItems();
if(items==null){
return;
}
SpecStringPool specStringPool=getSpecStringPool();
if(specStringPool==null){
return;
}
SpecString specString=specStringPool.getOrCreate(name);
renameSpec(specString.getIndex());
}
public void renameSpec(int specReference){
EntryBlock[] items=getItems();
if(items==null){
return;
}
for(EntryBlock block:items){
if(block==null||block.isNull()){
continue;
}
block.setSpecReference(specReference);
}
}
public TypeString getTypeString(){
EntryBlock entryBlock=get(0);
if(entryBlock==null){
return null;
}
return entryBlock.getTypeString();
}
public SpecString getSpecString(){
EntryBlock entryBlock=get(0);
if(entryBlock==null){
return null;
}
return entryBlock.getSpecString();
}
public String getTypeName(){
TypeString typeString=getTypeString();
if(typeString==null){
return null;
}
return typeString.get();
}
public String getSpecName(){
SpecString specString=getSpecString();
if(specString==null){
return null;
}
return specString.get();
}
private SpecStringPool getSpecStringPool(){
EntryBlock entryBlock=get(0);
if(entryBlock==null){
return null;
}
TypeBlock typeBlock=entryBlock.getTypeBlock();
if(typeBlock==null){
return null;
}
PackageBlock packageBlock=typeBlock.getPackageBlock();
if(packageBlock==null){
return null;
}
return packageBlock.getSpecStringPool();
}
private static BlockArrayCreator<EntryBlock> create(){
return new BlockArrayCreator<EntryBlock>(){
@Override
public EntryBlock newInstance() {
return new EntryBlock();
}
@Override
public EntryBlock[] newInstance(int len) {
return new EntryBlock[len];
}
};
}
}

View File

@ -1,41 +1,67 @@
package com.reandroid.lib.arsc.pool; package com.reandroid.lib.arsc.group;
import com.reandroid.lib.arsc.base.Block;
import com.reandroid.lib.arsc.base.BlockArrayCreator; import com.reandroid.lib.arsc.base.BlockArrayCreator;
import com.reandroid.lib.arsc.item.StringItem;
import java.lang.reflect.Array; import java.util.AbstractList;
import java.util.List;
public class StringGroup<T extends StringItem> { public class ItemGroup<T extends Block> {
private final BlockArrayCreator<T> mBlockArrayCreator; private final BlockArrayCreator<T> mBlockArrayCreator;
private final String name; private final String name;
private T[] items; private T[] items;
private final int hashCode; private final int hashCode;
StringGroup(BlockArrayCreator<T> blockArrayCreator, String name, T[] items){ public ItemGroup(BlockArrayCreator<T> blockArrayCreator, String name){
this.mBlockArrayCreator=blockArrayCreator; this.mBlockArrayCreator=blockArrayCreator;
this.name=name; this.name=name;
this.items=items; this.items=blockArrayCreator.newInstance(0);
this.hashCode=(getClass().getName()+"-"+name).hashCode(); this.hashCode=(getClass().getName()+"-"+name).hashCode();
} }
public boolean contains(T strItem){ public List<T> listItems(){
if(strItem==null){ return new AbstractList<T>() {
@Override
public T get(int i) {
return ItemGroup.this.get(i);
}
@Override
public int size() {
return ItemGroup.this.size();
}
};
}
public T get(int i){
if(i<0||i>= size()){
return null;
}
return items[i];
}
public int size(){
if(items==null){
return 0;
}
return items.length;
}
public boolean contains(T block){
if(block==null){
return false; return false;
} }
int len=items.length; int len=items.length;
for(int i=0;i<len;i++){ for(int i=0;i<len;i++){
if(strItem==items[i]){ if(block==items[i]){
return true; return true;
} }
} }
return false; return false;
} }
public void remove(T strItem){ public void remove(T block){
if(strItem==null){ if(block==null){
return; return;
} }
boolean found=false; boolean found=false;
int len=items.length; int len=items.length;
for(int i=0;i<len;i++){ for(int i=0;i<len;i++){
if(strItem==items[i]){ if(block==items[i]){
items[i]=null; items[i]=null;
found=true; found=true;
} }
@ -44,14 +70,14 @@ public class StringGroup<T extends StringItem> {
trimToSize(); trimToSize();
} }
} }
public void add(T strItem){ public void add(T block){
if(strItem==null){ if(block==null){
return; return;
} }
int index=items.length; int index=items.length;
T[] update=createNew(index+1); T[] update=createNew(index+1);
System.arraycopy(items, 0, update, 0, index); System.arraycopy(items, 0, update, 0, index);
update[index]=strItem; update[index]=block;
items=update; items=update;
} }
public T[] getItems(){ public T[] getItems(){
@ -94,7 +120,7 @@ public class StringGroup<T extends StringItem> {
public boolean equals(Object obj){ public boolean equals(Object obj){
if(obj instanceof StringGroup){ if(obj instanceof StringGroup){
StringGroup other=(StringGroup)obj; StringGroup other=(StringGroup)obj;
return name.equals(other.name); return hashCode==other.hashCode();
} }
return false; return false;
} }

View File

@ -0,0 +1,10 @@
package com.reandroid.lib.arsc.group;
import com.reandroid.lib.arsc.base.BlockArrayCreator;
import com.reandroid.lib.arsc.item.StringItem;
public class StringGroup<T extends StringItem> extends ItemGroup<T>{
public StringGroup(BlockArrayCreator<T> blockArrayCreator, String name){
super(blockArrayCreator, name);
}
}

View File

@ -5,6 +5,7 @@ import com.reandroid.lib.arsc.array.StringArray;
import com.reandroid.lib.arsc.array.StyleArray; import com.reandroid.lib.arsc.array.StyleArray;
import com.reandroid.lib.arsc.base.Block; import com.reandroid.lib.arsc.base.Block;
import com.reandroid.lib.arsc.chunk.BaseChunk; import com.reandroid.lib.arsc.chunk.BaseChunk;
import com.reandroid.lib.arsc.group.StringGroup;
import com.reandroid.lib.arsc.io.BlockLoad; import com.reandroid.lib.arsc.io.BlockLoad;
import com.reandroid.lib.arsc.io.BlockReader; import com.reandroid.lib.arsc.io.BlockReader;
import com.reandroid.lib.arsc.item.*; import com.reandroid.lib.arsc.item.*;
@ -87,8 +88,7 @@ public abstract class BaseStringPool<T extends StringItem> extends BaseChunk imp
if(group!=null){ if(group!=null){
return group; return group;
} }
T[] items=mArrayStrings.newInstance(0); group=new StringGroup<>(mArrayStrings, str);
group=new StringGroup<>(mArrayStrings, str, items);
mUniqueMap.put(str, group); mUniqueMap.put(str, group);
return group; return group;
} }

View File

@ -288,6 +288,17 @@ public class EntryBlock extends Block {
return result; return result;
} }
private void updatePackage(){
TypeBlock typeBlock=getTypeBlock();
if(typeBlock==null){
return;
}
PackageBlock packageBlock=typeBlock.getPackageBlock();
if(packageBlock==null){
return;
}
packageBlock.onEntryAdded(this);
}
@Override @Override
public void onReadBytes(BlockReader reader) throws IOException{ public void onReadBytes(BlockReader reader) throws IOException{
setNull(false); setNull(false);
@ -297,6 +308,7 @@ public class EntryBlock extends Block {
mSpecReference.readBytes(reader); mSpecReference.readBytes(reader);
createResValue(); createResValue();
mResValue.readBytes(reader); mResValue.readBytes(reader);
updatePackage();
} }
public String toString(){ public String toString(){
StringBuilder builder=new StringBuilder(); StringBuilder builder=new StringBuilder();