[Framework] remove non default ResConfig entries

This commit is contained in:
REAndroid 2023-03-13 11:19:45 -04:00
parent c69c85d8c2
commit 268f557d47
3 changed files with 45 additions and 38 deletions

View File

@ -174,9 +174,6 @@
return frameworkTable; return frameworkTable;
} }
public void optimize(){ public void optimize(){
optimize(true);
}
public void optimize(boolean keepOnlyAttrsAndId){
synchronized (mLock){ synchronized (mLock){
if(mOptimizing){ if(mOptimizing){
return; return;
@ -190,7 +187,7 @@
mOptimizing = false; mOptimizing = false;
return; return;
} }
FrameworkOptimizer optimizer = new FrameworkOptimizer(this, keepOnlyAttrsAndId); FrameworkOptimizer optimizer = new FrameworkOptimizer(this);
optimizer.optimize(); optimizer.optimize();
mOptimizing = false; mOptimizing = false;
} }

View File

@ -36,11 +36,9 @@ import java.util.zip.ZipEntry;
private final ApkModule frameworkApk; private final ApkModule frameworkApk;
private APKLogger apkLogger; private APKLogger apkLogger;
private boolean mOptimizing; private boolean mOptimizing;
private final boolean keepOnlyAttrsAndId; public FrameworkOptimizer(ApkModule frameworkApk){
public FrameworkOptimizer(ApkModule frameworkApk, boolean keepOnlyAttrsAndId){
this.frameworkApk = frameworkApk; this.frameworkApk = frameworkApk;
this.apkLogger = frameworkApk.getApkLogger(); this.apkLogger = frameworkApk.getApkLogger();
this.keepOnlyAttrsAndId = keepOnlyAttrsAndId;
} }
public void optimize(){ public void optimize(){
if(mOptimizing){ if(mOptimizing){
@ -102,7 +100,7 @@ import java.util.zip.ZipEntry;
backupManifestValue(manifestBlock, table); backupManifestValue(manifestBlock, table);
} }
logMessage("Optimizing table ..."); logMessage("Optimizing table ...");
table.optimize(name, version, keepOnlyAttrsAndId); table.optimize(name, version);
long diff=prev - table.countBytes(); long diff=prev - table.countBytes();
long percent=(diff*100L)/prev; long percent=(diff*100L)/prev;
logMessage("Table size reduced by: "+percent+" %"); logMessage("Table size reduced by: "+percent+" %");

View File

@ -29,6 +29,7 @@ import com.reandroid.arsc.item.ReferenceItem;
import com.reandroid.arsc.item.TableString; import com.reandroid.arsc.item.TableString;
import com.reandroid.arsc.pool.TableStringPool; import com.reandroid.arsc.pool.TableStringPool;
import com.reandroid.arsc.value.Entry; import com.reandroid.arsc.value.Entry;
import com.reandroid.arsc.value.ResConfig;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
@ -173,21 +174,55 @@ public class FrameworkTable extends TableBlock {
writeProperty(PROP_NAME, value); writeProperty(PROP_NAME, value);
} }
} }
public void optimize(String name, int version){
public void optimize(String name, int version, boolean keepOnlyAttrsAndId){
mOptimizeChecked = true; mOptimizeChecked = true;
mOptimized = false; mOptimized = false;
if(keepOnlyAttrsAndId){ ensureTypeBlockNonNullEntries();
removeTypesExceptAttrId();
}else {
optimizeEntries(); optimizeEntries();
}
optimizeTableString(); optimizeTableString();
writeVersionCode(version); writeVersionCode(version);
mOptimizeChecked = false; mOptimizeChecked = false;
setFrameworkName(name); setFrameworkName(name);
refresh(); refresh();
} }
private void ensureTypeBlockNonNullEntries(){
for(PackageBlock packageBlock:listPackages()){
ensureTypeBlockNonNullEntries(packageBlock);
}
}
private void ensureTypeBlockNonNullEntries(PackageBlock packageBlock){
for(SpecTypePair specTypePair:packageBlock.listAllSpecTypePair()){
ensureTypeBlockNonNullEntries(specTypePair);
}
}
private void ensureTypeBlockNonNullEntries(SpecTypePair specTypePair){
Map<Integer, EntryGroup> map = specTypePair.createEntryGroups();
for(EntryGroup entryGroup:map.values()){
ensureNonNullDefaultEntry(entryGroup);
}
}
private void ensureNonNullDefaultEntry(EntryGroup entryGroup){
Entry defEntry = entryGroup.getDefault(false);
Entry entry;
if(defEntry==null){
entry = entryGroup.pickOne();
if(entry == null){
return;
}
SpecTypePair specTypePair = entry.getTypeBlock().getParentSpecTypePair();
TypeBlock type = specTypePair.getOrCreateTypeBlock(new ResConfig());
defEntry = type.getOrCreateEntry((short) (entry.getId() & 0xffff));
}
if(!defEntry.isNull()){
return;
}
entry = entryGroup.pickOne();
if(entry.isNull()){
return;
}
defEntry.merge(entry);
defEntry.isDefault();
}
private void optimizeEntries(){ private void optimizeEntries(){
Map<Integer, EntryGroup> groupMap=scanAllEntryGroups(); Map<Integer, EntryGroup> groupMap=scanAllEntryGroups();
for(EntryGroup group:groupMap.values()){ for(EntryGroup group:groupMap.values()){
@ -202,29 +237,6 @@ public class FrameworkTable extends TableBlock {
pkg.refresh(); pkg.refresh();
} }
} }
private void removeTypesExceptAttrId(){
for(PackageBlock pkg:listPackages()){
SpecTypePairArray pairArray = pkg.getSpecTypePairArray();
List<SpecTypePair> specTypePairList =
new ArrayList<>(pairArray.listItems());
for(SpecTypePair specTypePair:specTypePairList){
String name=specTypePair.getTypeName();
if(shouldRemoveType(name)){
specTypePair.destroy();
pairArray.remove(specTypePair);
}
}
}
}
private boolean shouldRemoveType(String typeName){
if(typeName==null){
return true;
}
if("id".equals(typeName)){
return false;
}
return !typeName.contains("attr");
}
private void removeEmptyBlocks(PackageBlock pkg){ private void removeEmptyBlocks(PackageBlock pkg){
SpecTypePairArray specTypePairArray = pkg.getSpecTypePairArray(); SpecTypePairArray specTypePairArray = pkg.getSpecTypePairArray();
specTypePairArray.sort(); specTypePairArray.sort();