mirror of
https://github.com/revanced/ARSCLib.git
synced 2025-05-01 06:34:26 +02:00
[Framework] remove non default ResConfig entries
This commit is contained in:
parent
c69c85d8c2
commit
268f557d47
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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+" %");
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user