search entries with alias resource ids

This commit is contained in:
REAndroid 2022-12-30 07:46:17 -05:00
parent fe96d22846
commit 4b6dc12622
3 changed files with 92 additions and 30 deletions

View File

@ -227,8 +227,25 @@ package com.reandroid.lib.arsc.chunk;
public Collection<EntryGroup> listEntryGroup(){
return getEntriesGroupMap().values();
}
public EntryGroup getEntryGroup(int resId){
return getEntriesGroupMap().get(resId);
/**
* Searches entries by resource id from local map, then if not find
* search by alias resource id
* */
public EntryGroup getEntryGroup(int resourceId){
if(resourceId==0){
return null;
}
EntryGroup entryGroup=getEntriesGroupMap().get(resourceId);
if(entryGroup!=null){
return entryGroup;
}
StagedAliasEntry stagedAliasEntry = searchByStagedResId(resourceId);
if(stagedAliasEntry!=null){
return getEntriesGroupMap()
.get(stagedAliasEntry.getFinalizedResId());
}
return null;
}
public void updateEntry(EntryBlock entryBlock){
if(entryBlock==null||entryBlock.isNull()){

View File

@ -22,6 +22,7 @@ import com.reandroid.lib.arsc.header.HeaderBlock;
import com.reandroid.lib.arsc.io.BlockReader;
import com.reandroid.lib.arsc.item.IntegerItem;
import com.reandroid.lib.arsc.pool.TableStringPool;
import com.reandroid.lib.arsc.value.StagedAliasEntry;
import com.reandroid.lib.common.Frameworks;
import com.reandroid.lib.json.JSONConvert;
import com.reandroid.lib.json.JSONArray;
@ -111,23 +112,35 @@ public class TableBlock extends BaseChunk implements JSONConvert<JSONObject> {
if(resourceId==0){
return null;
}
int pkgId=resourceId>>24;
pkgId=pkgId&0xff;
PackageBlock packageBlock=getPackageBlockById(pkgId);
if(packageBlock!=null){
EntryGroup entryGroup=packageBlock.getEntryGroup(resourceId);
int aliasId = searchResourceIdAlias(resourceId);
for(PackageBlock packageBlock:listPackages()){
EntryGroup entryGroup = packageBlock.getEntryGroup(resourceId);
if(entryGroup!=null){
return entryGroup;
}
entryGroup = packageBlock.getEntryGroup(aliasId);
if(entryGroup!=null){
return entryGroup;
}
}
for(TableBlock tableBlock:getFrameWorks()){
EntryGroup entryGroup= tableBlock.search(resourceId);
EntryGroup entryGroup = tableBlock.search(resourceId);
if(entryGroup!=null){
return entryGroup;
}
}
return null;
}
public int searchResourceIdAlias(int resourceId){
for(PackageBlock packageBlock:listPackages()){
StagedAliasEntry stagedAliasEntry =
packageBlock.searchByStagedResId(resourceId);
if(stagedAliasEntry!=null){
return stagedAliasEntry.getFinalizedResId();
}
}
return 0;
}
public Set<TableBlock> getFrameWorks(){
return mFrameWorks;
}

View File

@ -20,6 +20,7 @@ import com.reandroid.lib.arsc.chunk.TableBlock;
import com.reandroid.lib.arsc.group.EntryGroup;
import com.reandroid.lib.arsc.item.TableString;
import com.reandroid.lib.arsc.value.EntryBlock;
import com.reandroid.lib.arsc.value.StagedAliasEntry;
import java.util.*;
@ -90,34 +91,19 @@ public class TableEntryStore implements EntryStore{
}
@Override
public List<EntryGroup> getEntryGroups(int resourceId) {
List<EntryGroup> results=new ArrayList<>();
int pkgId = (resourceId>>24)&0xff;
Set<PackageBlock> packageBlockSet = mPackagesMap.get(pkgId);
if(packageBlockSet==null){
List<EntryGroup> results = searchEntryGroups(resourceId);
if(results.size()>0){
return results;
}
for(PackageBlock packageBlock: packageBlockSet){
EntryGroup group=packageBlock.getEntryGroup(resourceId);
if(group!=null){
results.add(group);
}
}
return results;
return searchEntryGroups(searchIdAlias(resourceId));
}
@Override
public EntryGroup getEntryGroup(int resourceId) {
int pkgId = (resourceId>>24)&0xff;
Set<PackageBlock> packageBlockSet = mPackagesMap.get(pkgId);
if(packageBlockSet==null){
return null;
EntryGroup entryGroup = searchEntryGroup(resourceId);
if(entryGroup!=null){
return entryGroup;
}
for(PackageBlock packageBlock: packageBlockSet){
EntryGroup group=packageBlock.getEntryGroup(resourceId);
if(group!=null && group.pickOne()!=null){
return group;
}
}
return null;
return searchEntryGroup(searchIdAlias(resourceId));
}
@Override
public List<PackageBlock> getPackageBlocks(byte packageId) {
@ -140,4 +126,50 @@ public class TableEntryStore implements EntryStore{
}
return results;
}
private List<EntryGroup> searchEntryGroups(int resourceId) {
if(resourceId==0){
return new ArrayList<>();
}
List<EntryGroup> results=new ArrayList<>();
int pkgId = (resourceId>>24)&0xff;
Set<PackageBlock> packageBlockSet = mPackagesMap.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 searchEntryGroup(int resourceId) {
if(resourceId==0){
return null;
}
int packageId = (resourceId>>24)&0xff;
Set<PackageBlock> packageBlockSet = mPackagesMap.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 searchIdAlias(int resourceId) {
for(Set<PackageBlock> packageBlockSet : mPackagesMap.values()){
for(PackageBlock packageBlock:packageBlockSet){
StagedAliasEntry stagedAliasEntry = packageBlock.searchByStagedResId(resourceId);
if(stagedAliasEntry!=null){
return stagedAliasEntry.getFinalizedResId();
}
}
}
return 0;
}
}