diff --git a/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java b/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java index d26c375..07077cf 100755 --- a/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java +++ b/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java @@ -22,6 +22,7 @@ import com.reandroid.arsc.chunk.SpecBlock; import com.reandroid.arsc.chunk.TypeBlock; import com.reandroid.arsc.container.SpecTypePair; import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.header.TypeHeader; import com.reandroid.arsc.io.BlockReader; import com.reandroid.arsc.item.TypeString; import com.reandroid.arsc.value.Entry; @@ -243,6 +244,11 @@ public class TypeBlockArray extends BlockArray if(chunkType!=ChunkType.TYPE){ return false; } + TypeHeader typeHeader = reader.readTypeHeader(); + int id = getTypeId(); + if(id!=0 && typeHeader.getId().unsignedInt() != id){ + return false; + } int pos=reader.getPosition(); TypeBlock typeBlock=createNext(); typeBlock.readBytes(reader); diff --git a/src/main/java/com/reandroid/arsc/container/PackageBody.java b/src/main/java/com/reandroid/arsc/container/PackageBody.java index c5e43b2..651f34e 100755 --- a/src/main/java/com/reandroid/arsc/container/PackageBody.java +++ b/src/main/java/com/reandroid/arsc/container/PackageBody.java @@ -18,6 +18,8 @@ package com.reandroid.arsc.container; import com.reandroid.arsc.chunk.*; import com.reandroid.arsc.array.SpecTypePairArray; import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.header.SpecHeader; +import com.reandroid.arsc.header.TypeHeader; import com.reandroid.arsc.io.BlockReader; import com.reandroid.arsc.list.OverlayableList; import com.reandroid.arsc.list.StagedAliasList; @@ -83,6 +85,8 @@ public class PackageBody extends FixedBlockContainer { ChunkType chunkType=headerBlock.getChunkType(); if(chunkType==ChunkType.SPEC){ readSpecBlock(reader); + }else if(chunkType==ChunkType.TYPE){ + readTypeBlock(reader); }else if(chunkType==ChunkType.LIBRARY){ readLibraryBlock(reader); }else if(chunkType==ChunkType.OVERLAYABLE){ @@ -97,8 +101,15 @@ public class PackageBody extends FixedBlockContainer { return pos!=reader.getPosition(); } private void readSpecBlock(BlockReader reader) throws IOException{ - SpecTypePair specTypePair=mSpecTypePairArray.createNext(); - specTypePair.readBytes(reader); + SpecHeader specHeader = reader.readSpecHeader(); + SpecTypePair specTypePair = mSpecTypePairArray.getOrCreate(specHeader.getId().get()); + specTypePair.getSpecBlock().readBytes(reader); + } + private void readTypeBlock(BlockReader reader) throws IOException{ + TypeHeader typeHeader = reader.readTypeHeader(); + SpecTypePair specTypePair = mSpecTypePairArray.getOrCreate(typeHeader.getId().get()); + TypeBlock typeBlock = specTypePair.getTypeBlockArray().createNext(); + typeBlock.readBytes(reader); } private void readLibraryBlock(BlockReader reader) throws IOException{ LibraryBlock libraryBlock=new LibraryBlock(); diff --git a/src/main/java/com/reandroid/arsc/container/SpecTypePair.java b/src/main/java/com/reandroid/arsc/container/SpecTypePair.java index f14854f..b922aae 100755 --- a/src/main/java/com/reandroid/arsc/container/SpecTypePair.java +++ b/src/main/java/com/reandroid/arsc/container/SpecTypePair.java @@ -173,11 +173,14 @@ public class SpecTypePair extends BlockContainer return; } ChunkType chunkType=headerBlock.getChunkType(); + if(chunkType == ChunkType.TYPE){ + mTypeBlockArray.readBytes(reader); + return; + } if(chunkType!=ChunkType.SPEC){ readUnexpectedNonSpecBlock(reader, headerBlock); } mSpecBlock.readBytes(reader); - mTypeBlockArray.readBytes(reader); } private void readUnexpectedNonSpecBlock(BlockReader reader, HeaderBlock headerBlock) throws IOException{ throw new IOException("Unexpected block: "+headerBlock.toString()+", Should be: "+ChunkType.SPEC); diff --git a/src/main/java/com/reandroid/arsc/io/BlockReader.java b/src/main/java/com/reandroid/arsc/io/BlockReader.java index a80ed6d..c8d3104 100755 --- a/src/main/java/com/reandroid/arsc/io/BlockReader.java +++ b/src/main/java/com/reandroid/arsc/io/BlockReader.java @@ -15,8 +15,9 @@ */ package com.reandroid.arsc.io; -import com.reandroid.arsc.header.HeaderBlock; import com.reandroid.arsc.header.InfoHeader; +import com.reandroid.arsc.header.SpecHeader; +import com.reandroid.arsc.header.TypeHeader; import java.io.*; @@ -56,6 +57,26 @@ import java.io.*; readFully(bts); seek(pos); return toShort(bts, 0); + } + public SpecHeader readSpecHeader() throws IOException{ + SpecHeader specHeader = new SpecHeader(); + if(available() < specHeader.countBytes()){ + return null; + } + int pos = getPosition(); + specHeader.readBytes(this); + seek(pos); + return specHeader; + } + public TypeHeader readTypeHeader() throws IOException{ + TypeHeader typeHeader = new TypeHeader(); + if(available() < typeHeader.countBytes()){ + return null; + } + int pos = getPosition(); + typeHeader.readBytes(this); + seek(pos); + return typeHeader; } public InfoHeader readHeaderBlock() throws IOException { InfoHeader infoHeader = new InfoHeader();