diff --git a/src/main/java/com/reandroid/apk/ApkBundle.java b/src/main/java/com/reandroid/apk/ApkBundle.java index 607d3c6..011e290 100644 --- a/src/main/java/com/reandroid/apk/ApkBundle.java +++ b/src/main/java/com/reandroid/apk/ApkBundle.java @@ -40,7 +40,6 @@ public class ApkBundle { } ApkModule result = new ApkModule(generateMergedModuleName(), new APKArchive()); result.setAPKLogger(apkLogger); - result.setDisableEntryGroupMap(true); result.setLoadDefaultFramework(false); mergeStringPools(result); @@ -166,7 +165,6 @@ 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); diff --git a/src/main/java/com/reandroid/apk/ApkModule.java b/src/main/java/com/reandroid/apk/ApkModule.java index 75b9a2d..910f396 100644 --- a/src/main/java/com/reandroid/apk/ApkModule.java +++ b/src/main/java/com/reandroid/apk/ApkModule.java @@ -57,7 +57,6 @@ 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; @@ -66,16 +65,6 @@ 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; } @@ -537,7 +526,6 @@ public class ApkModule implements ApkFile { new BlockInputSource<>(TableBlock.FILE_NAME, tableBlock); archive.add(source); mTableBlock = tableBlock; - tableBlock.setDisableEntryGroupMap(isDisableEntryGroupMap()); } @Override public AndroidManifestBlock getAndroidManifestBlock() { @@ -576,7 +564,6 @@ public class ApkModule implements ApkFile { } try { mTableBlock = loadTableBlock(); - mTableBlock.setDisableEntryGroupMap(isDisableEntryGroupMap()); if(initFramework && loadDefaultFramework){ Integer version = getAndroidFrameworkVersion(); initializeAndroidFramework(mTableBlock, version); diff --git a/src/main/java/com/reandroid/arsc/array/PackageArray.java b/src/main/java/com/reandroid/arsc/array/PackageArray.java index b40ff49..5fa3aca 100755 --- a/src/main/java/com/reandroid/arsc/array/PackageArray.java +++ b/src/main/java/com/reandroid/arsc/array/PackageArray.java @@ -92,10 +92,6 @@ public class PackageArray extends BlockArray 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){ @@ -135,10 +131,6 @@ public class PackageArray extends BlockArray return; } setChildesCount(mPackageCount.get()); - TableBlock tableBlock = getParentInstance(TableBlock.class); - if(tableBlock != null){ - tableBlock.setDisableEntryGroupMap(tableBlock.isDisableEntryGroupMap()); - } } @Override public JSONArray toJson() { diff --git a/src/main/java/com/reandroid/arsc/chunk/PackageBlock.java b/src/main/java/com/reandroid/arsc/chunk/PackageBlock.java index 3ac17a5..1380a98 100755 --- a/src/main/java/com/reandroid/arsc/chunk/PackageBlock.java +++ b/src/main/java/com/reandroid/arsc/chunk/PackageBlock.java @@ -50,7 +50,7 @@ public class PackageBlock extends Chunk private final PackageBody mBody; private final Map mEntriesGroup; - private boolean disableEntryGroupMap; + private boolean entryGroupMapLocked; public PackageBlock() { super(new PackageHeader(), 3); @@ -61,7 +61,8 @@ public class PackageBlock extends Chunk this.mBody = new PackageBody(); - this.mEntriesGroup=new HashMap<>(); + this.mEntriesGroup = new HashMap<>(); + this.entryGroupMapLocked = true; addChild(mTypeStringPool); addChild(mSpecStringPool); @@ -200,7 +201,7 @@ public class PackageBlock extends Chunk return mBody.getLibraryBlock(); } public Set listResourceIds(){ - return mEntriesGroup.keySet(); + return getEntriesGroupMap().keySet(); } public Entry getOrCreateEntry(byte typeId, short entryId, String qualifiers){ return getSpecTypePairArray().getOrCreateEntry(typeId, entryId, qualifiers); @@ -215,13 +216,30 @@ public class PackageBlock extends Chunk return getSpecTypePairArray().getTypeBlock(typeId, qualifiers); } - public boolean isDisableEntryGroupMap() { - return disableEntryGroupMap; + public boolean isEntryGroupMapLocked() { + return entryGroupMapLocked; } - public void setDisableEntryGroupMap(boolean disable) { - this.disableEntryGroupMap = disable; + private void unlockEntryGroup() { + synchronized (this){ + if(!this.entryGroupMapLocked){ + return; + } + System.err.println("\nUnlocking EntryGroupMap ..."); + this.entryGroupMapLocked = false; + Map map = this.mEntriesGroup; + map.clear(); + createEntryGroupMap(map); + System.err.println("\nEntryGroupMap unlocked!"); + } + } + private void createEntryGroupMap(Map map){ + map.clear(); + for(SpecTypePair specTypePair:listAllSpecTypePair()){ + map.putAll(specTypePair.createEntryGroups()); + } } public Map getEntriesGroupMap(){ + unlockEntryGroup(); return mEntriesGroup; } public Collection listEntryGroup(){ @@ -248,7 +266,7 @@ public class PackageBlock extends Chunk return null; } public void updateEntry(Entry entry){ - if(isDisableEntryGroupMap()){ + if(isEntryGroupMapLocked()){ return; } if(entry == null || entry.isNull()){ diff --git a/src/main/java/com/reandroid/arsc/chunk/TableBlock.java b/src/main/java/com/reandroid/arsc/chunk/TableBlock.java index 32dff79..ce6e13d 100755 --- a/src/main/java/com/reandroid/arsc/chunk/TableBlock.java +++ b/src/main/java/com/reandroid/arsc/chunk/TableBlock.java @@ -42,7 +42,6 @@ public class TableBlock extends Chunk private final List mFrameWorks; private ApkFile mApkFile; private ReferenceResolver referenceResolver; - private boolean disableEntryGroupMap; public TableBlock() { super(new TableHeader(), 2); @@ -54,15 +53,6 @@ public class TableBlock extends Chunk addChild(mPackageArray); } - public boolean isDisableEntryGroupMap() { - return disableEntryGroupMap; - } - public void setDisableEntryGroupMap(boolean disable) { - this.disableEntryGroupMap = disable; - for(PackageBlock packageBlock : listPackages()){ - packageBlock.setDisableEntryGroupMap(disable); - } - } public List resolveReference(int referenceId){ return resolveReference(referenceId, null); } diff --git a/src/main/java/com/reandroid/arsc/item/StringItem.java b/src/main/java/com/reandroid/arsc/item/StringItem.java index 390917a..d237762 100755 --- a/src/main/java/com/reandroid/arsc/item/StringItem.java +++ b/src/main/java/com/reandroid/arsc/item/StringItem.java @@ -1,4 +1,4 @@ - /* +/* * Copyright (C) 2022 github.com/REAndroid * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -65,11 +65,13 @@ public class StringItem extends BlockItem implements JSONConvert { } } public void addReference(Collection refList){ - if(refList==null){ + if(refList == null){ return; } for(ReferenceItem ref:refList){ - addReference(ref); + if(ref != null){ + this.mReferencedList.add(ref); + } } } private void reUpdateReferences(int newIndex){ diff --git a/src/main/java/com/reandroid/arsc/value/ValueHeader.java b/src/main/java/com/reandroid/arsc/value/ValueHeader.java index 6913e9a..4e766cf 100644 --- a/src/main/java/com/reandroid/arsc/value/ValueHeader.java +++ b/src/main/java/com/reandroid/arsc/value/ValueHeader.java @@ -1,4 +1,4 @@ - /* +/* * Copyright (C) 2022 github.com/REAndroid * * Licensed under the Apache License, Version 2.0 (the "License");