From 4ba43a6b5e7dfb0bf40c568bcdcde0fbc477f5a8 Mon Sep 17 00:00:00 2001 From: REAndroid Date: Mon, 13 Mar 2023 09:01:25 -0400 Subject: [PATCH] keep only type attr & id for framework optimization --- .../java/com/reandroid/apk/FrameworkApk.java | 5 ++- .../com/reandroid/apk/FrameworkOptimizer.java | 7 ++-- .../reandroid/arsc/util/FrameworkTable.java | 42 ++++++++++++++++--- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/reandroid/apk/FrameworkApk.java b/src/main/java/com/reandroid/apk/FrameworkApk.java index 1c99689..01ead82 100644 --- a/src/main/java/com/reandroid/apk/FrameworkApk.java +++ b/src/main/java/com/reandroid/apk/FrameworkApk.java @@ -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; } diff --git a/src/main/java/com/reandroid/apk/FrameworkOptimizer.java b/src/main/java/com/reandroid/apk/FrameworkOptimizer.java index 143edcc..27cda05 100644 --- a/src/main/java/com/reandroid/apk/FrameworkOptimizer.java +++ b/src/main/java/com/reandroid/apk/FrameworkOptimizer.java @@ -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+" %"); diff --git a/src/main/java/com/reandroid/arsc/util/FrameworkTable.java b/src/main/java/com/reandroid/arsc/util/FrameworkTable.java index e86ffca..5f573ca 100755 --- a/src/main/java/com/reandroid/arsc/util/FrameworkTable.java +++ b/src/main/java/com/reandroid/arsc/util/FrameworkTable.java @@ -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 groupMap=scanAllEntryGroups(); for(EntryGroup group:groupMap.values()){ List 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 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();