mirror of
https://github.com/revanced/ARSCLib.git
synced 2025-05-01 14:44:27 +02:00
Entries
This commit is contained in:
parent
2fccb3e6b7
commit
2e8ecc6e40
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
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
|
||||
zipStorePath=wrapper/dists
|
||||
|
@ -4,6 +4,8 @@ import com.reandroid.lib.arsc.array.LibraryInfoArray;
|
||||
import com.reandroid.lib.arsc.item.IntegerItem;
|
||||
import com.reandroid.lib.arsc.value.LibraryInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class LibraryBlock extends BaseChunk {
|
||||
private final IntegerItem mLibCount;
|
||||
private final LibraryInfoArray mLibraryInfoArray;
|
||||
@ -37,6 +39,9 @@ public class LibraryBlock extends BaseChunk {
|
||||
mLibraryInfoArray.add(info);
|
||||
mLibCount.set(mLibraryInfoArray.childesCount());
|
||||
}
|
||||
public List<LibraryInfo> listLibraryInfo(){
|
||||
return mLibraryInfoArray.listItems();
|
||||
}
|
||||
@Override
|
||||
public boolean isNull(){
|
||||
return mLibraryInfoArray.childesCount()==0;
|
||||
|
@ -3,12 +3,18 @@ package com.reandroid.lib.arsc.chunk;
|
||||
import com.reandroid.lib.arsc.array.SpecTypePairArray;
|
||||
import com.reandroid.lib.arsc.base.Block;
|
||||
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.PackageName;
|
||||
import com.reandroid.lib.arsc.pool.SpecStringPool;
|
||||
import com.reandroid.lib.arsc.pool.TypeStringPool;
|
||||
import com.reandroid.lib.arsc.value.EntryBlock;
|
||||
import com.reandroid.lib.arsc.value.LibraryInfo;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
|
||||
public class PackageBlock extends BaseChunk {
|
||||
private final IntegerItem mPackageId;
|
||||
@ -28,6 +34,8 @@ public class PackageBlock extends BaseChunk {
|
||||
|
||||
private final PackageLastBlocks mPackageLastBlocks;
|
||||
|
||||
private final Map<Integer, EntryGroup> mEntriesGroup;
|
||||
|
||||
public PackageBlock() {
|
||||
super(ChunkType.PACKAGE, 3);
|
||||
this.mPackageId=new IntegerItem();
|
||||
@ -45,6 +53,8 @@ public class PackageBlock extends BaseChunk {
|
||||
this.mLibraryBlock=new LibraryBlock();
|
||||
this.mPackageLastBlocks=new PackageLastBlocks(mSpecTypePairArray, mLibraryBlock);
|
||||
|
||||
this.mEntriesGroup=new HashMap<>();
|
||||
|
||||
addToHeader(mPackageId);
|
||||
addToHeader(mPackageName);
|
||||
addToHeader(mTypeStrings);
|
||||
@ -83,12 +93,57 @@ public class PackageBlock extends BaseChunk {
|
||||
}
|
||||
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(){
|
||||
return mTypeStringPool;
|
||||
}
|
||||
public SpecStringPool getSpecStringPool(){
|
||||
return mSpecStringPool;
|
||||
}
|
||||
public SpecTypePairArray getSpecTypePairArray(){
|
||||
return mSpecTypePairArray;
|
||||
}
|
||||
public List<LibraryInfo> listLibraryInfo(){
|
||||
return mLibraryBlock.listLibraryInfo();
|
||||
}
|
||||
|
||||
public void addLibrary(LibraryBlock libraryBlock){
|
||||
if(libraryBlock==null){
|
||||
@ -105,11 +160,51 @@ public class PackageBlock extends BaseChunk {
|
||||
public void addLibraryInfo(LibraryInfo 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(){
|
||||
int pos=countUpTo(mSpecStringPool);
|
||||
mKeyStrings.set(pos);
|
||||
}
|
||||
public void onEntryAdded(EntryBlock entryBlock){
|
||||
updateEntryGroup(entryBlock);
|
||||
}
|
||||
@Override
|
||||
public void onChunkLoaded() {
|
||||
}
|
||||
|
@ -3,8 +3,12 @@ package com.reandroid.lib.arsc.chunk;
|
||||
import com.reandroid.lib.arsc.array.EntryBlockArray;
|
||||
import com.reandroid.lib.arsc.item.IntegerArray;
|
||||
import com.reandroid.lib.arsc.item.IntegerItem;
|
||||
import com.reandroid.lib.arsc.value.EntryBlock;
|
||||
import com.reandroid.lib.arsc.value.ResConfig;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class TypeBlock extends BaseTypeBlock {
|
||||
private final IntegerItem mEntriesStart;
|
||||
private final ResConfig mResConfig;
|
||||
@ -29,6 +33,24 @@ public class TypeBlock extends BaseTypeBlock {
|
||||
public EntryBlockArray getEntryBlockArray(){
|
||||
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
|
||||
void onSetEntryCount(int count) {
|
||||
mEntryArray.setChildesCount(count);
|
||||
|
@ -6,11 +6,14 @@ import com.reandroid.lib.arsc.base.Block;
|
||||
import com.reandroid.lib.arsc.base.BlockContainer;
|
||||
import com.reandroid.lib.arsc.chunk.PackageBlock;
|
||||
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.io.BlockReader;
|
||||
import com.reandroid.lib.arsc.value.EntryBlock;
|
||||
import com.reandroid.lib.arsc.value.ResConfig;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SpecTypePair extends BlockContainer<Block> {
|
||||
@ -55,6 +58,20 @@ public class SpecTypePair extends BlockContainer<Block> {
|
||||
}
|
||||
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
|
||||
protected void onRefreshed() {
|
||||
|
100
src/main/java/com/reandroid/lib/arsc/group/EntryGroup.java
Normal file
100
src/main/java/com/reandroid/lib/arsc/group/EntryGroup.java
Normal 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];
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
@ -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.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 String name;
|
||||
private T[] items;
|
||||
private final int hashCode;
|
||||
StringGroup(BlockArrayCreator<T> blockArrayCreator, String name, T[] items){
|
||||
public ItemGroup(BlockArrayCreator<T> blockArrayCreator, String name){
|
||||
this.mBlockArrayCreator=blockArrayCreator;
|
||||
this.name=name;
|
||||
this.items=items;
|
||||
this.items=blockArrayCreator.newInstance(0);
|
||||
this.hashCode=(getClass().getName()+"-"+name).hashCode();
|
||||
}
|
||||
public boolean contains(T strItem){
|
||||
if(strItem==null){
|
||||
public List<T> listItems(){
|
||||
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;
|
||||
}
|
||||
int len=items.length;
|
||||
for(int i=0;i<len;i++){
|
||||
if(strItem==items[i]){
|
||||
if(block==items[i]){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public void remove(T strItem){
|
||||
if(strItem==null){
|
||||
public void remove(T block){
|
||||
if(block==null){
|
||||
return;
|
||||
}
|
||||
boolean found=false;
|
||||
int len=items.length;
|
||||
for(int i=0;i<len;i++){
|
||||
if(strItem==items[i]){
|
||||
if(block==items[i]){
|
||||
items[i]=null;
|
||||
found=true;
|
||||
}
|
||||
@ -44,14 +70,14 @@ public class StringGroup<T extends StringItem> {
|
||||
trimToSize();
|
||||
}
|
||||
}
|
||||
public void add(T strItem){
|
||||
if(strItem==null){
|
||||
public void add(T block){
|
||||
if(block==null){
|
||||
return;
|
||||
}
|
||||
int index=items.length;
|
||||
T[] update=createNew(index+1);
|
||||
System.arraycopy(items, 0, update, 0, index);
|
||||
update[index]=strItem;
|
||||
update[index]=block;
|
||||
items=update;
|
||||
}
|
||||
public T[] getItems(){
|
||||
@ -94,7 +120,7 @@ public class StringGroup<T extends StringItem> {
|
||||
public boolean equals(Object obj){
|
||||
if(obj instanceof StringGroup){
|
||||
StringGroup other=(StringGroup)obj;
|
||||
return name.equals(other.name);
|
||||
return hashCode==other.hashCode();
|
||||
}
|
||||
return false;
|
||||
}
|
10
src/main/java/com/reandroid/lib/arsc/group/StringGroup.java
Normal file
10
src/main/java/com/reandroid/lib/arsc/group/StringGroup.java
Normal 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);
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ import com.reandroid.lib.arsc.array.StringArray;
|
||||
import com.reandroid.lib.arsc.array.StyleArray;
|
||||
import com.reandroid.lib.arsc.base.Block;
|
||||
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.BlockReader;
|
||||
import com.reandroid.lib.arsc.item.*;
|
||||
@ -87,8 +88,7 @@ public abstract class BaseStringPool<T extends StringItem> extends BaseChunk imp
|
||||
if(group!=null){
|
||||
return group;
|
||||
}
|
||||
T[] items=mArrayStrings.newInstance(0);
|
||||
group=new StringGroup<>(mArrayStrings, str, items);
|
||||
group=new StringGroup<>(mArrayStrings, str);
|
||||
mUniqueMap.put(str, group);
|
||||
return group;
|
||||
}
|
||||
|
@ -288,6 +288,17 @@ public class EntryBlock extends Block {
|
||||
return result;
|
||||
}
|
||||
|
||||
private void updatePackage(){
|
||||
TypeBlock typeBlock=getTypeBlock();
|
||||
if(typeBlock==null){
|
||||
return;
|
||||
}
|
||||
PackageBlock packageBlock=typeBlock.getPackageBlock();
|
||||
if(packageBlock==null){
|
||||
return;
|
||||
}
|
||||
packageBlock.onEntryAdded(this);
|
||||
}
|
||||
@Override
|
||||
public void onReadBytes(BlockReader reader) throws IOException{
|
||||
setNull(false);
|
||||
@ -297,6 +308,7 @@ public class EntryBlock extends Block {
|
||||
mSpecReference.readBytes(reader);
|
||||
createResValue();
|
||||
mResValue.readBytes(reader);
|
||||
updatePackage();
|
||||
}
|
||||
public String toString(){
|
||||
StringBuilder builder=new StringBuilder();
|
||||
|
Loading…
x
Reference in New Issue
Block a user