keep only type attr & id for framework optimization

This commit is contained in:
REAndroid 2023-03-13 09:01:25 -04:00
parent a07a800470
commit 4ba43a6b5e
3 changed files with 44 additions and 10 deletions

View File

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

View File

@ -35,11 +35,12 @@ public class FrameworkOptimizer {
private final ApkModule frameworkApk;
private APKLogger apkLogger;
private boolean mOptimizing;
public FrameworkOptimizer(ApkModule frameworkApk){
private final boolean keepOnlyAttrsAndId;
public FrameworkOptimizer(ApkModule frameworkApk, boolean keepOnlyAttrsAndId){
this.frameworkApk = frameworkApk;
this.apkLogger = frameworkApk.getApkLogger();
this.keepOnlyAttrsAndId = keepOnlyAttrsAndId;
}
public void optimize(){
if(mOptimizing){
return;
@ -91,7 +92,7 @@ public class FrameworkOptimizer {
backupManifestValue(manifestBlock, table);
}
logMessage("Optimizing table ...");
table.optimize(name, version);
table.optimize(name, version, keepOnlyAttrsAndId);
long diff=prev - table.countBytes();
long percent=(diff*100L)/prev;
logMessage("Table size reduced by: "+percent+" %");

View File

@ -174,9 +174,21 @@ public class FrameworkTable extends TableBlock {
}
}
public void optimize(String name, int version){
public void optimize(String name, int version, boolean keepOnlyAttrsAndId){
mOptimizeChecked = true;
mOptimized = false;
if(keepOnlyAttrsAndId){
removeTypesExceptAttrId();
}else {
optimizeEntries();
}
optimizeTableString();
writeVersionCode(version);
mOptimizeChecked = false;
setFrameworkName(name);
refresh();
}
private void optimizeEntries(){
Map<Integer, EntryGroup> groupMap=scanAllEntryGroups();
for(EntryGroup group:groupMap.values()){
List<Entry> entryList = getEntriesToRemove(group);
@ -189,11 +201,29 @@ public class FrameworkTable extends TableBlock {
pkg.removeEmpty();
pkg.refresh();
}
optimizeTableString();
writeVersionCode(version);
mOptimizeChecked = false;
setFrameworkName(name);
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){
SpecTypePairArray specTypePairArray = pkg.getSpecTypePairArray();