mirror of
https://github.com/revanced/ARSCLib.git
synced 2025-04-30 06:14:25 +02:00
fix error decompiling android frameworks api > 32
This commit is contained in:
parent
57fadc12c0
commit
c2da1c776d
@ -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){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user