diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/PackageBlock.java b/src/main/java/com/reandroid/lib/arsc/chunk/PackageBlock.java index 9ece395..80e9062 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/PackageBlock.java +++ b/src/main/java/com/reandroid/lib/arsc/chunk/PackageBlock.java @@ -227,8 +227,25 @@ package com.reandroid.lib.arsc.chunk; public Collection 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()){ diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/TableBlock.java b/src/main/java/com/reandroid/lib/arsc/chunk/TableBlock.java index 0bb481f..c9bcca3 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/TableBlock.java +++ b/src/main/java/com/reandroid/lib/arsc/chunk/TableBlock.java @@ -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 { 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 getFrameWorks(){ return mFrameWorks; } diff --git a/src/main/java/com/reandroid/lib/common/TableEntryStore.java b/src/main/java/com/reandroid/lib/common/TableEntryStore.java index 5f93257..e2d025e 100755 --- a/src/main/java/com/reandroid/lib/common/TableEntryStore.java +++ b/src/main/java/com/reandroid/lib/common/TableEntryStore.java @@ -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 getEntryGroups(int resourceId) { - List results=new ArrayList<>(); - int pkgId = (resourceId>>24)&0xff; - Set packageBlockSet = mPackagesMap.get(pkgId); - if(packageBlockSet==null){ + List 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 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 getPackageBlocks(byte packageId) { @@ -140,4 +126,50 @@ public class TableEntryStore implements EntryStore{ } return results; } + private List searchEntryGroups(int resourceId) { + if(resourceId==0){ + return new ArrayList<>(); + } + List results=new ArrayList<>(); + int pkgId = (resourceId>>24)&0xff; + Set 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 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 packageBlockSet : mPackagesMap.values()){ + for(PackageBlock packageBlock:packageBlockSet){ + StagedAliasEntry stagedAliasEntry = packageBlock.searchByStagedResId(resourceId); + if(stagedAliasEntry!=null){ + return stagedAliasEntry.getFinalizedResId(); + } + } + } + return 0; + } }