From c2da1c776d9622ed56469a933ecf39f97c52496c Mon Sep 17 00:00:00 2001 From: REAndroid Date: Tue, 7 Mar 2023 15:05:23 -0500 Subject: [PATCH] fix error decompiling android frameworks api > 32 --- .../com/reandroid/common/TableEntryStore.java | 118 ++++++++++++++---- 1 file changed, 97 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/reandroid/common/TableEntryStore.java b/src/main/java/com/reandroid/common/TableEntryStore.java index 59647e3..8404410 100755 --- a/src/main/java/com/reandroid/common/TableEntryStore.java +++ b/src/main/java/com/reandroid/common/TableEntryStore.java @@ -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> mPackagesMap; + private final Map> mLocalPackagesMap; + private final Map> 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 packageBlockSet=getOrCreate(packageBlock.getId()); + Set 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 getOrCreate(int packageId){ + private Set getOrCreateLocal(int packageId){ Integer id=packageId; - Set packageBlockSet=mPackagesMap.get(id); + Set packageBlockSet = mLocalPackagesMap.get(id); if(packageBlockSet==null){ packageBlockSet=new HashSet<>(); - mPackagesMap.put(id, packageBlockSet); + mLocalPackagesMap.put(id, packageBlockSet); + } + return packageBlockSet; + } + private Set getOrCreateFrameworks(int packageId){ + Integer id=packageId; + Set packageBlockSet = mFrameworkPackagesMap.get(id); + if(packageBlockSet==null){ + packageBlockSet=new HashSet<>(); + mFrameworkPackagesMap.put(id, packageBlockSet); } return packageBlockSet; } @Override public List getEntryGroups(int resourceId) { - List results = searchEntryGroups(resourceId); + List 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 getPackageBlocks(int packageId) { List results=new ArrayList<>(); - Set packageBlockSet = mPackagesMap.get(0xff & packageId); + packageId = 0xff & packageId; + Set packageBlockSet = mLocalPackagesMap.get(packageId); + if(packageBlockSet==null){ + packageBlockSet = mFrameworkPackagesMap.get(packageId); + } if(packageBlockSet!=null){ results.addAll(packageBlockSet); } return results; } - private List searchEntryGroups(int resourceId) { + private List searchEntryGroupsLocal(int resourceId) { if(resourceId==0){ return new ArrayList<>(); } List results=new ArrayList<>(); int pkgId = (resourceId>>24)&0xff; - Set packageBlockSet = mPackagesMap.get(pkgId); + Set 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 searchEntryGroupsFramework(int resourceId) { if(resourceId==0){ - return null; + return new ArrayList<>(); } + List results=new ArrayList<>(); + int pkgId = (resourceId>>24)&0xff; + Set 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 packageBlockSet = mPackagesMap.get(packageId); + Set 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 packageBlockSet : mPackagesMap.values()){ + private EntryGroup searchEntryFramework(int resourceId) { + int packageId = (resourceId>>24)&0xff; + Set 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 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 packageBlockSet : mLocalPackagesMap.values()){ for(PackageBlock packageBlock:packageBlockSet){ StagedAliasEntry stagedAliasEntry = packageBlock.searchByStagedResId(resourceId); if(stagedAliasEntry!=null){