disable entry group mapping when not necessary

This commit is contained in:
REAndroid 2023-04-28 11:57:47 +02:00
parent fd0ef31cb3
commit 6fce5ad5ed
5 changed files with 145 additions and 97 deletions

View File

@ -40,6 +40,7 @@ public class ApkBundle {
}
ApkModule result = new ApkModule(generateMergedModuleName(), new APKArchive());
result.setAPKLogger(apkLogger);
result.setDisableEntryGroupMap(true);
result.setLoadDefaultFramework(false);
mergeStringPools(result);
@ -165,6 +166,7 @@ public class ApkBundle {
}
public void addModule(ApkModule apkModule){
apkModule.setLoadDefaultFramework(false);
apkModule.setDisableEntryGroupMap(true);
String name = apkModule.getModuleName();
mModulesMap.remove(name);
mModulesMap.put(name, apkModule);

View File

@ -57,6 +57,8 @@ public class ApkModule implements ApkFile {
private Decoder mDecoder;
private ApkType mApkType;
private ApkSignatureBlock apkSignatureBlock;
private boolean disableEntryGroupMap;
public ApkModule(String moduleName, APKArchive apkArchive){
this.moduleName=moduleName;
this.apkArchive=apkArchive;
@ -64,6 +66,16 @@ public class ApkModule implements ApkFile {
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() {
return apkSignatureBlock;
}
@ -525,6 +537,7 @@ public class ApkModule implements ApkFile {
new BlockInputSource<>(TableBlock.FILE_NAME, tableBlock);
archive.add(source);
mTableBlock = tableBlock;
tableBlock.setDisableEntryGroupMap(isDisableEntryGroupMap());
}
@Override
public AndroidManifestBlock getAndroidManifestBlock() {
@ -563,6 +576,7 @@ public class ApkModule implements ApkFile {
}
try {
mTableBlock = loadTableBlock();
mTableBlock.setDisableEntryGroupMap(isDisableEntryGroupMap());
if(initFramework && loadDefaultFramework){
Integer version = getAndroidFrameworkVersion();
initializeAndroidFramework(mTableBlock, version);

View File

@ -18,6 +18,7 @@ package com.reandroid.arsc.array;
import com.reandroid.arsc.base.Block;
import com.reandroid.arsc.base.BlockArray;
import com.reandroid.arsc.chunk.PackageBlock;
import com.reandroid.arsc.chunk.TableBlock;
import com.reandroid.arsc.io.BlockLoad;
import com.reandroid.arsc.io.BlockReader;
import com.reandroid.arsc.item.IntegerItem;
@ -91,6 +92,10 @@ public class PackageArray extends BlockArray<PackageBlock>
packageBlock = createNext();
packageBlock.setId(pkgId);
packageBlock.setName("PACKAGE NAME");
TableBlock tableBlock = getParentInstance(TableBlock.class);
if(tableBlock != null){
packageBlock.setDisableEntryGroupMap(tableBlock.isDisableEntryGroupMap());
}
return packageBlock;
}
public PackageBlock getPackageBlockById(byte pkgId){
@ -126,8 +131,13 @@ public class PackageArray extends BlockArray<PackageBlock>
@Override
public void onBlockLoaded(BlockReader reader, Block sender) throws IOException {
if(sender==mPackageCount){
if(sender != mPackageCount){
return;
}
setChildesCount(mPackageCount.get());
TableBlock tableBlock = getParentInstance(TableBlock.class);
if(tableBlock != null){
tableBlock.setDisableEntryGroupMap(tableBlock.isDisableEntryGroupMap());
}
}
@Override

View File

@ -50,6 +50,7 @@ package com.reandroid.arsc.chunk;
private final PackageBody mBody;
private final Map<Integer, EntryGroup> mEntriesGroup;
private boolean disableEntryGroupMap;
public PackageBlock() {
super(new PackageHeader(), 3);
@ -213,6 +214,13 @@ package com.reandroid.arsc.chunk;
public TypeBlock getTypeBlock(byte typeId, String qualifiers){
return getSpecTypePairArray().getTypeBlock(typeId, qualifiers);
}
public boolean isDisableEntryGroupMap() {
return disableEntryGroupMap;
}
public void setDisableEntryGroupMap(boolean disable) {
this.disableEntryGroupMap = disable;
}
public Map<Integer, EntryGroup> getEntriesGroupMap(){
return mEntriesGroup;
}
@ -240,35 +248,36 @@ package com.reandroid.arsc.chunk;
return null;
}
public void updateEntry(Entry entry){
if(isDisableEntryGroupMap()){
return;
}
if(entry == null || entry.isNull()){
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){
if(entry == null){
return;
}
int id= entry.getResourceId();
EntryGroup group=getEntriesGroupMap().get(id);
int resourceId = entry.getResourceId();
Map<Integer, EntryGroup> map = getEntriesGroupMap();
EntryGroup group = map.get(resourceId);
if(group == null){
return;
}
group.remove(entry);
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){
List<Entry> results=new ArrayList<>();
for(SpecTypePair pair:listSpecTypePair(typeId)){

View File

@ -39,17 +39,30 @@ import java.util.function.Predicate;
implements MainChunk, JSONConvert<JSONObject>, EntryStore {
private final TableStringPool mTableStringPool;
private final PackageArray mPackageArray;
private final List<TableBlock> mFrameWorks=new ArrayList<>();
private final List<TableBlock> mFrameWorks;
private ApkFile mApkFile;
private ReferenceResolver referenceResolver;
private boolean disableEntryGroupMap;
public TableBlock() {
super(new TableHeader(), 2);
TableHeader header = getHeaderBlock();
this.mTableStringPool = new TableStringPool(true);
this.mPackageArray = new PackageArray(header.getPackageCount());
this.mFrameWorks = new ArrayList<>();
addChild(mTableStringPool);
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){
return resolveReference(referenceId, null);
}