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.TableBlock;
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.StagedAliasEntry;
import java.util.*;
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(){
this.mPackagesMap = new HashMap<>();
this.mLocalPackagesMap = new HashMap<>();
this.mFrameworkPackagesMap = new HashMap<>();
}
public String getEntryName(int resourceId){
@ -59,53 +61,87 @@ public class TableEntryStore implements EntryStore{
if(packageBlock==null){
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)){
return;
}
packageBlockSet.add(packageBlock);
}
private Set<PackageBlock> getOrCreate(int packageId){
private Set<PackageBlock> getOrCreateLocal(int packageId){
Integer id=packageId;
Set<PackageBlock> packageBlockSet=mPackagesMap.get(id);
Set<PackageBlock> packageBlockSet = mLocalPackagesMap.get(id);
if(packageBlockSet==null){
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;
}
@Override
public List<EntryGroup> getEntryGroups(int resourceId) {
List<EntryGroup> results = searchEntryGroups(resourceId);
List<EntryGroup> results = searchEntryGroupsLocal(resourceId);
if(results.size()>0){
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
public EntryGroup getEntryGroup(int resourceId) {
EntryGroup entryGroup = searchEntryGroup(resourceId);
if(entryGroup!=null){
return entryGroup;
EntryGroup entryGroup = searchEntryLocal(resourceId);
if(entryGroup==null){
entryGroup = searchEntryLocal(searchIdAliasLocal(resourceId));
}
return searchEntryGroup(searchIdAlias(resourceId));
if(entryGroup==null){
entryGroup = searchEntryFramework(resourceId);
}
if(entryGroup==null){
entryGroup = searchEntryFramework(searchIdAliasFramework(resourceId));
}
return entryGroup;
}
@Override
public List<PackageBlock> getPackageBlocks(int packageId) {
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){
results.addAll(packageBlockSet);
}
return results;
}
private List<EntryGroup> searchEntryGroups(int resourceId) {
private List<EntryGroup> searchEntryGroupsLocal(int resourceId) {
if(resourceId==0){
return new ArrayList<>();
}
List<EntryGroup> results=new ArrayList<>();
int pkgId = (resourceId>>24)&0xff;
Set<PackageBlock> packageBlockSet = mPackagesMap.get(pkgId);
Set<PackageBlock> packageBlockSet = mLocalPackagesMap.get(pkgId);
if(packageBlockSet==null){
return results;
}
@ -117,12 +153,27 @@ public class TableEntryStore implements EntryStore{
}
return results;
}
private EntryGroup searchEntryGroup(int resourceId) {
private List<EntryGroup> searchEntryGroupsFramework(int resourceId) {
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;
Set<PackageBlock> packageBlockSet = mPackagesMap.get(packageId);
Set<PackageBlock> packageBlockSet = mLocalPackagesMap.get(packageId);
if(packageBlockSet==null){
return null;
}
@ -134,8 +185,33 @@ public class TableEntryStore implements EntryStore{
}
return null;
}
private int searchIdAlias(int resourceId) {
for(Set<PackageBlock> packageBlockSet : mPackagesMap.values()){
private EntryGroup searchEntryFramework(int resourceId) {
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){
StagedAliasEntry stagedAliasEntry = packageBlock.searchByStagedResId(resourceId);
if(stagedAliasEntry!=null){