fix error decompiling android frameworks api > 32

This commit is contained in:
REAndroid 2023-03-07 15:05:23 -05:00
parent 57fadc12c0
commit c2da1c776d

View File

@ -18,16 +18,18 @@ package com.reandroid.common;
import com.reandroid.arsc.chunk.PackageBlock; import com.reandroid.arsc.chunk.PackageBlock;
import com.reandroid.arsc.chunk.TableBlock; import com.reandroid.arsc.chunk.TableBlock;
import com.reandroid.arsc.group.EntryGroup; import com.reandroid.arsc.group.EntryGroup;
import com.reandroid.arsc.item.TableString; import com.reandroid.arsc.util.FrameworkTable;
import com.reandroid.arsc.value.Entry; import com.reandroid.arsc.value.Entry;
import com.reandroid.arsc.value.StagedAliasEntry; import com.reandroid.arsc.value.StagedAliasEntry;
import java.util.*; import java.util.*;
public class TableEntryStore implements EntryStore{ public class TableEntryStore implements EntryStore{
private final Map<Integer, Set<PackageBlock>> mPackagesMap; private final Map<Integer, Set<PackageBlock>> mLocalPackagesMap;
private final Map<Integer, Set<PackageBlock>> mFrameworkPackagesMap;
public TableEntryStore(){ public TableEntryStore(){
this.mPackagesMap = new HashMap<>(); this.mLocalPackagesMap = new HashMap<>();
this.mFrameworkPackagesMap = new HashMap<>();
} }
public String getEntryName(int resourceId){ public String getEntryName(int resourceId){
@ -59,53 +61,87 @@ public class TableEntryStore implements EntryStore{
if(packageBlock==null){ if(packageBlock==null){
return; return;
} }
Set<PackageBlock> packageBlockSet=getOrCreate(packageBlock.getId()); Set<PackageBlock> packageBlockSet;
if(packageBlock.getTableBlock() instanceof FrameworkTable){
packageBlockSet = getOrCreateFrameworks(packageBlock.getId());
}else {
packageBlockSet = getOrCreateLocal(packageBlock.getId());
}
if(packageBlockSet.contains(packageBlock)){ if(packageBlockSet.contains(packageBlock)){
return; return;
} }
packageBlockSet.add(packageBlock); packageBlockSet.add(packageBlock);
} }
private Set<PackageBlock> getOrCreate(int packageId){ private Set<PackageBlock> getOrCreateLocal(int packageId){
Integer id=packageId; Integer id=packageId;
Set<PackageBlock> packageBlockSet=mPackagesMap.get(id); Set<PackageBlock> packageBlockSet = mLocalPackagesMap.get(id);
if(packageBlockSet==null){ if(packageBlockSet==null){
packageBlockSet=new HashSet<>(); packageBlockSet=new HashSet<>();
mPackagesMap.put(id, packageBlockSet); mLocalPackagesMap.put(id, packageBlockSet);
}
return packageBlockSet;
}
private Set<PackageBlock> getOrCreateFrameworks(int packageId){
Integer id=packageId;
Set<PackageBlock> packageBlockSet = mFrameworkPackagesMap.get(id);
if(packageBlockSet==null){
packageBlockSet=new HashSet<>();
mFrameworkPackagesMap.put(id, packageBlockSet);
} }
return packageBlockSet; return packageBlockSet;
} }
@Override @Override
public List<EntryGroup> getEntryGroups(int resourceId) { public List<EntryGroup> getEntryGroups(int resourceId) {
List<EntryGroup> results = searchEntryGroups(resourceId); List<EntryGroup> results = searchEntryGroupsLocal(resourceId);
if(results.size()>0){ if(results.size()>0){
return results; return results;
} }
return searchEntryGroups(searchIdAlias(resourceId)); int alias = searchIdAliasLocal(resourceId);
results = searchEntryGroupsLocal(alias);
if(results.size()>0){
return results;
}
results = searchEntryGroupsFramework(resourceId);
if(results.size()>0){
return results;
}
alias = searchIdAliasFramework(resourceId);
return searchEntryGroupsFramework(alias);
} }
@Override @Override
public EntryGroup getEntryGroup(int resourceId) { public EntryGroup getEntryGroup(int resourceId) {
EntryGroup entryGroup = searchEntryGroup(resourceId); EntryGroup entryGroup = searchEntryLocal(resourceId);
if(entryGroup!=null){ if(entryGroup==null){
return entryGroup; entryGroup = searchEntryLocal(searchIdAliasLocal(resourceId));
} }
return searchEntryGroup(searchIdAlias(resourceId)); if(entryGroup==null){
entryGroup = searchEntryFramework(resourceId);
}
if(entryGroup==null){
entryGroup = searchEntryFramework(searchIdAliasFramework(resourceId));
}
return entryGroup;
} }
@Override @Override
public List<PackageBlock> getPackageBlocks(int packageId) { public List<PackageBlock> getPackageBlocks(int packageId) {
List<PackageBlock> results=new ArrayList<>(); List<PackageBlock> results=new ArrayList<>();
Set<PackageBlock> packageBlockSet = mPackagesMap.get(0xff & packageId); packageId = 0xff & packageId;
Set<PackageBlock> packageBlockSet = mLocalPackagesMap.get(packageId);
if(packageBlockSet==null){
packageBlockSet = mFrameworkPackagesMap.get(packageId);
}
if(packageBlockSet!=null){ if(packageBlockSet!=null){
results.addAll(packageBlockSet); results.addAll(packageBlockSet);
} }
return results; return results;
} }
private List<EntryGroup> searchEntryGroups(int resourceId) { private List<EntryGroup> searchEntryGroupsLocal(int resourceId) {
if(resourceId==0){ if(resourceId==0){
return new ArrayList<>(); return new ArrayList<>();
} }
List<EntryGroup> results=new ArrayList<>(); List<EntryGroup> results=new ArrayList<>();
int pkgId = (resourceId>>24)&0xff; int pkgId = (resourceId>>24)&0xff;
Set<PackageBlock> packageBlockSet = mPackagesMap.get(pkgId); Set<PackageBlock> packageBlockSet = mLocalPackagesMap.get(pkgId);
if(packageBlockSet==null){ if(packageBlockSet==null){
return results; return results;
} }
@ -117,12 +153,27 @@ public class TableEntryStore implements EntryStore{
} }
return results; return results;
} }
private EntryGroup searchEntryGroup(int resourceId) { private List<EntryGroup> searchEntryGroupsFramework(int resourceId) {
if(resourceId==0){ if(resourceId==0){
return null; return new ArrayList<>();
} }
List<EntryGroup> results=new ArrayList<>();
int pkgId = (resourceId>>24)&0xff;
Set<PackageBlock> packageBlockSet = mFrameworkPackagesMap.get(pkgId);
if(packageBlockSet==null){
return results;
}
for(PackageBlock packageBlock: packageBlockSet){
EntryGroup group=packageBlock.getEntryGroup(resourceId);
if(group!=null){
results.add(group);
}
}
return results;
}
private EntryGroup searchEntryLocal(int resourceId) {
int packageId = (resourceId>>24)&0xff; int packageId = (resourceId>>24)&0xff;
Set<PackageBlock> packageBlockSet = mPackagesMap.get(packageId); Set<PackageBlock> packageBlockSet = mLocalPackagesMap.get(packageId);
if(packageBlockSet==null){ if(packageBlockSet==null){
return null; return null;
} }
@ -134,8 +185,33 @@ public class TableEntryStore implements EntryStore{
} }
return null; return null;
} }
private int searchIdAlias(int resourceId) { private EntryGroup searchEntryFramework(int resourceId) {
for(Set<PackageBlock> packageBlockSet : mPackagesMap.values()){ int packageId = (resourceId>>24)&0xff;
Set<PackageBlock> packageBlockSet = mFrameworkPackagesMap.get(packageId);
if(packageBlockSet==null){
return null;
}
for(PackageBlock packageBlock: packageBlockSet){
EntryGroup group=packageBlock.getEntryGroup(resourceId);
if(group!=null && group.pickOne()!=null){
return group;
}
}
return null;
}
private int searchIdAliasLocal(int resourceId) {
for(Set<PackageBlock> packageBlockSet : mLocalPackagesMap.values()){
for(PackageBlock packageBlock:packageBlockSet){
StagedAliasEntry stagedAliasEntry = packageBlock.searchByStagedResId(resourceId);
if(stagedAliasEntry!=null){
return stagedAliasEntry.getFinalizedResId();
}
}
}
return 0;
}
private int searchIdAliasFramework(int resourceId) {
for(Set<PackageBlock> packageBlockSet : mLocalPackagesMap.values()){
for(PackageBlock packageBlock:packageBlockSet){ for(PackageBlock packageBlock:packageBlockSet){
StagedAliasEntry stagedAliasEntry = packageBlock.searchByStagedResId(resourceId); StagedAliasEntry stagedAliasEntry = packageBlock.searchByStagedResId(resourceId);
if(stagedAliasEntry!=null){ if(stagedAliasEntry!=null){