mirror of
https://github.com/revanced/ARSCLib.git
synced 2025-04-30 06:14:25 +02:00
disable entry group mapping when not necessary
This commit is contained in:
parent
fd0ef31cb3
commit
6fce5ad5ed
@ -40,6 +40,7 @@ public class ApkBundle {
|
|||||||
}
|
}
|
||||||
ApkModule result = new ApkModule(generateMergedModuleName(), new APKArchive());
|
ApkModule result = new ApkModule(generateMergedModuleName(), new APKArchive());
|
||||||
result.setAPKLogger(apkLogger);
|
result.setAPKLogger(apkLogger);
|
||||||
|
result.setDisableEntryGroupMap(true);
|
||||||
result.setLoadDefaultFramework(false);
|
result.setLoadDefaultFramework(false);
|
||||||
|
|
||||||
mergeStringPools(result);
|
mergeStringPools(result);
|
||||||
@ -165,6 +166,7 @@ public class ApkBundle {
|
|||||||
}
|
}
|
||||||
public void addModule(ApkModule apkModule){
|
public void addModule(ApkModule apkModule){
|
||||||
apkModule.setLoadDefaultFramework(false);
|
apkModule.setLoadDefaultFramework(false);
|
||||||
|
apkModule.setDisableEntryGroupMap(true);
|
||||||
String name = apkModule.getModuleName();
|
String name = apkModule.getModuleName();
|
||||||
mModulesMap.remove(name);
|
mModulesMap.remove(name);
|
||||||
mModulesMap.put(name, apkModule);
|
mModulesMap.put(name, apkModule);
|
||||||
|
@ -57,6 +57,8 @@ public class ApkModule implements ApkFile {
|
|||||||
private Decoder mDecoder;
|
private Decoder mDecoder;
|
||||||
private ApkType mApkType;
|
private ApkType mApkType;
|
||||||
private ApkSignatureBlock apkSignatureBlock;
|
private ApkSignatureBlock apkSignatureBlock;
|
||||||
|
private boolean disableEntryGroupMap;
|
||||||
|
|
||||||
public ApkModule(String moduleName, APKArchive apkArchive){
|
public ApkModule(String moduleName, APKArchive apkArchive){
|
||||||
this.moduleName=moduleName;
|
this.moduleName=moduleName;
|
||||||
this.apkArchive=apkArchive;
|
this.apkArchive=apkArchive;
|
||||||
@ -64,6 +66,16 @@ public class ApkModule implements ApkFile {
|
|||||||
this.mUncompressedFiles.addPath(apkArchive);
|
this.mUncompressedFiles.addPath(apkArchive);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDisableEntryGroupMap() {
|
||||||
|
return disableEntryGroupMap;
|
||||||
|
}
|
||||||
|
public void setDisableEntryGroupMap(boolean disable) {
|
||||||
|
this.disableEntryGroupMap = disable;
|
||||||
|
TableBlock tableBlock = this.mTableBlock;
|
||||||
|
if(tableBlock != null){
|
||||||
|
tableBlock.setDisableEntryGroupMap(disable);
|
||||||
|
}
|
||||||
|
}
|
||||||
public ApkSignatureBlock getApkSignatureBlock() {
|
public ApkSignatureBlock getApkSignatureBlock() {
|
||||||
return apkSignatureBlock;
|
return apkSignatureBlock;
|
||||||
}
|
}
|
||||||
@ -525,6 +537,7 @@ public class ApkModule implements ApkFile {
|
|||||||
new BlockInputSource<>(TableBlock.FILE_NAME, tableBlock);
|
new BlockInputSource<>(TableBlock.FILE_NAME, tableBlock);
|
||||||
archive.add(source);
|
archive.add(source);
|
||||||
mTableBlock = tableBlock;
|
mTableBlock = tableBlock;
|
||||||
|
tableBlock.setDisableEntryGroupMap(isDisableEntryGroupMap());
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public AndroidManifestBlock getAndroidManifestBlock() {
|
public AndroidManifestBlock getAndroidManifestBlock() {
|
||||||
@ -563,6 +576,7 @@ public class ApkModule implements ApkFile {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
mTableBlock = loadTableBlock();
|
mTableBlock = loadTableBlock();
|
||||||
|
mTableBlock.setDisableEntryGroupMap(isDisableEntryGroupMap());
|
||||||
if(initFramework && loadDefaultFramework){
|
if(initFramework && loadDefaultFramework){
|
||||||
Integer version = getAndroidFrameworkVersion();
|
Integer version = getAndroidFrameworkVersion();
|
||||||
initializeAndroidFramework(mTableBlock, version);
|
initializeAndroidFramework(mTableBlock, version);
|
||||||
|
@ -18,6 +18,7 @@ package com.reandroid.arsc.array;
|
|||||||
import com.reandroid.arsc.base.Block;
|
import com.reandroid.arsc.base.Block;
|
||||||
import com.reandroid.arsc.base.BlockArray;
|
import com.reandroid.arsc.base.BlockArray;
|
||||||
import com.reandroid.arsc.chunk.PackageBlock;
|
import com.reandroid.arsc.chunk.PackageBlock;
|
||||||
|
import com.reandroid.arsc.chunk.TableBlock;
|
||||||
import com.reandroid.arsc.io.BlockLoad;
|
import com.reandroid.arsc.io.BlockLoad;
|
||||||
import com.reandroid.arsc.io.BlockReader;
|
import com.reandroid.arsc.io.BlockReader;
|
||||||
import com.reandroid.arsc.item.IntegerItem;
|
import com.reandroid.arsc.item.IntegerItem;
|
||||||
@ -91,6 +92,10 @@ public class PackageArray extends BlockArray<PackageBlock>
|
|||||||
packageBlock = createNext();
|
packageBlock = createNext();
|
||||||
packageBlock.setId(pkgId);
|
packageBlock.setId(pkgId);
|
||||||
packageBlock.setName("PACKAGE NAME");
|
packageBlock.setName("PACKAGE NAME");
|
||||||
|
TableBlock tableBlock = getParentInstance(TableBlock.class);
|
||||||
|
if(tableBlock != null){
|
||||||
|
packageBlock.setDisableEntryGroupMap(tableBlock.isDisableEntryGroupMap());
|
||||||
|
}
|
||||||
return packageBlock;
|
return packageBlock;
|
||||||
}
|
}
|
||||||
public PackageBlock getPackageBlockById(byte pkgId){
|
public PackageBlock getPackageBlockById(byte pkgId){
|
||||||
@ -126,8 +131,13 @@ public class PackageArray extends BlockArray<PackageBlock>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBlockLoaded(BlockReader reader, Block sender) throws IOException {
|
public void onBlockLoaded(BlockReader reader, Block sender) throws IOException {
|
||||||
if(sender==mPackageCount){
|
if(sender != mPackageCount){
|
||||||
|
return;
|
||||||
|
}
|
||||||
setChildesCount(mPackageCount.get());
|
setChildesCount(mPackageCount.get());
|
||||||
|
TableBlock tableBlock = getParentInstance(TableBlock.class);
|
||||||
|
if(tableBlock != null){
|
||||||
|
tableBlock.setDisableEntryGroupMap(tableBlock.isDisableEntryGroupMap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
|
@ -50,6 +50,7 @@ package com.reandroid.arsc.chunk;
|
|||||||
private final PackageBody mBody;
|
private final PackageBody mBody;
|
||||||
|
|
||||||
private final Map<Integer, EntryGroup> mEntriesGroup;
|
private final Map<Integer, EntryGroup> mEntriesGroup;
|
||||||
|
private boolean disableEntryGroupMap;
|
||||||
|
|
||||||
public PackageBlock() {
|
public PackageBlock() {
|
||||||
super(new PackageHeader(), 3);
|
super(new PackageHeader(), 3);
|
||||||
@ -213,6 +214,13 @@ package com.reandroid.arsc.chunk;
|
|||||||
public TypeBlock getTypeBlock(byte typeId, String qualifiers){
|
public TypeBlock getTypeBlock(byte typeId, String qualifiers){
|
||||||
return getSpecTypePairArray().getTypeBlock(typeId, qualifiers);
|
return getSpecTypePairArray().getTypeBlock(typeId, qualifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDisableEntryGroupMap() {
|
||||||
|
return disableEntryGroupMap;
|
||||||
|
}
|
||||||
|
public void setDisableEntryGroupMap(boolean disable) {
|
||||||
|
this.disableEntryGroupMap = disable;
|
||||||
|
}
|
||||||
public Map<Integer, EntryGroup> getEntriesGroupMap(){
|
public Map<Integer, EntryGroup> getEntriesGroupMap(){
|
||||||
return mEntriesGroup;
|
return mEntriesGroup;
|
||||||
}
|
}
|
||||||
@ -240,35 +248,36 @@ package com.reandroid.arsc.chunk;
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
public void updateEntry(Entry entry){
|
public void updateEntry(Entry entry){
|
||||||
|
if(isDisableEntryGroupMap()){
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(entry == null || entry.isNull()){
|
if(entry == null || entry.isNull()){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
updateEntryGroup(entry);
|
int resourceId = entry.getResourceId();
|
||||||
|
Map<Integer, EntryGroup> map = getEntriesGroupMap();
|
||||||
|
EntryGroup group = map.get(resourceId);
|
||||||
|
if(group == null){
|
||||||
|
group = new EntryGroup(resourceId);
|
||||||
|
map.put(resourceId, group);
|
||||||
|
}
|
||||||
|
group.add(entry);
|
||||||
}
|
}
|
||||||
public void removeEntryGroup(Entry entry){
|
public void removeEntryGroup(Entry entry){
|
||||||
if(entry == null){
|
if(entry == null){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int id= entry.getResourceId();
|
int resourceId = entry.getResourceId();
|
||||||
EntryGroup group=getEntriesGroupMap().get(id);
|
Map<Integer, EntryGroup> map = getEntriesGroupMap();
|
||||||
|
EntryGroup group = map.get(resourceId);
|
||||||
if(group == null){
|
if(group == null){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
group.remove(entry);
|
group.remove(entry);
|
||||||
if(group.size() == 0){
|
if(group.size() == 0){
|
||||||
getEntriesGroupMap().remove(id);
|
map.remove(resourceId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void updateEntryGroup(Entry entry){
|
|
||||||
int resId= entry.getResourceId();
|
|
||||||
EntryGroup group=getEntriesGroupMap().get(resId);
|
|
||||||
if(group==null){
|
|
||||||
group=new EntryGroup(resId);
|
|
||||||
getEntriesGroupMap().put(resId, group);
|
|
||||||
}
|
|
||||||
group.add(entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Entry> listEntries(byte typeId, int entryId){
|
public List<Entry> listEntries(byte typeId, int entryId){
|
||||||
List<Entry> results=new ArrayList<>();
|
List<Entry> results=new ArrayList<>();
|
||||||
for(SpecTypePair pair:listSpecTypePair(typeId)){
|
for(SpecTypePair pair:listSpecTypePair(typeId)){
|
||||||
|
@ -39,17 +39,30 @@ import java.util.function.Predicate;
|
|||||||
implements MainChunk, JSONConvert<JSONObject>, EntryStore {
|
implements MainChunk, JSONConvert<JSONObject>, EntryStore {
|
||||||
private final TableStringPool mTableStringPool;
|
private final TableStringPool mTableStringPool;
|
||||||
private final PackageArray mPackageArray;
|
private final PackageArray mPackageArray;
|
||||||
private final List<TableBlock> mFrameWorks=new ArrayList<>();
|
private final List<TableBlock> mFrameWorks;
|
||||||
private ApkFile mApkFile;
|
private ApkFile mApkFile;
|
||||||
private ReferenceResolver referenceResolver;
|
private ReferenceResolver referenceResolver;
|
||||||
|
private boolean disableEntryGroupMap;
|
||||||
|
|
||||||
public TableBlock() {
|
public TableBlock() {
|
||||||
super(new TableHeader(), 2);
|
super(new TableHeader(), 2);
|
||||||
TableHeader header = getHeaderBlock();
|
TableHeader header = getHeaderBlock();
|
||||||
this.mTableStringPool = new TableStringPool(true);
|
this.mTableStringPool = new TableStringPool(true);
|
||||||
this.mPackageArray = new PackageArray(header.getPackageCount());
|
this.mPackageArray = new PackageArray(header.getPackageCount());
|
||||||
|
this.mFrameWorks = new ArrayList<>();
|
||||||
addChild(mTableStringPool);
|
addChild(mTableStringPool);
|
||||||
addChild(mPackageArray);
|
addChild(mPackageArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDisableEntryGroupMap() {
|
||||||
|
return disableEntryGroupMap;
|
||||||
|
}
|
||||||
|
public void setDisableEntryGroupMap(boolean disable) {
|
||||||
|
this.disableEntryGroupMap = disable;
|
||||||
|
for(PackageBlock packageBlock : listPackages()){
|
||||||
|
packageBlock.setDisableEntryGroupMap(disable);
|
||||||
|
}
|
||||||
|
}
|
||||||
public List<Entry> resolveReference(int referenceId){
|
public List<Entry> resolveReference(int referenceId){
|
||||||
return resolveReference(referenceId, null);
|
return resolveReference(referenceId, null);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user