From ac2686b3fcfe7964d9ae3da36f75104bf49d247a Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Tue, 9 Apr 2013 23:41:27 -0700 Subject: [PATCH] Add the ability to parse dependencies from odex files --- .../dexlib2/dexbacked/DexBackedOdexFile.java | 28 +++++++++++++++++++ .../dexlib2/dexbacked/raw/OdexHeaderItem.java | 5 ++++ 2 files changed, 33 insertions(+) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java index 5a0e9274..11b9daf1 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java @@ -33,15 +33,22 @@ package org.jf.dexlib2.dexbacked; import com.google.common.io.ByteStreams; import org.jf.dexlib2.dexbacked.raw.OdexHeaderItem; +import org.jf.dexlib2.dexbacked.util.VariableSizeList; import javax.annotation.Nonnull; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.List; public class DexBackedOdexFile extends DexBackedDexFile { + private static final int DEPENDENCY_COUNT_OFFSET = 12; + private static final int DEPENDENCY_START_OFFSET = 16; + private final byte[] odexBuf; + public DexBackedOdexFile(@Nonnull byte[] odexBuf, byte[] dexBuf) { super(dexBuf); @@ -52,6 +59,27 @@ public class DexBackedOdexFile extends DexBackedDexFile { return true; } + public List getDependencies() { + final int dexOffset = OdexHeaderItem.getDexOffset(odexBuf); + final int dependencyOffset = OdexHeaderItem.getDependenciesOffset(odexBuf) - dexOffset; + + BaseDexBuffer buf = new BaseDexBuffer(this.buf); + int dependencyCount = buf.readInt(dependencyOffset + DEPENDENCY_COUNT_OFFSET); + + return new VariableSizeList(this, dependencyOffset + DEPENDENCY_START_OFFSET, dependencyCount) { + @Override protected String readNextItem(@Nonnull DexReader reader, int index) { + int length = reader.readInt(); + int offset = reader.getOffset(); + reader.moveRelative(length + 20); + try { + return new String(DexBackedOdexFile.this.buf, offset, length-1, "US-ASCII"); + } catch (UnsupportedEncodingException ex) { + throw new RuntimeException(ex); + } + } + }; + } + public static DexBackedOdexFile fromInputStream(@Nonnull InputStream is) throws IOException { if (!is.markSupported()) { throw new IllegalArgumentException("InputStream must support mark"); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java index b8fe5a59..4e91736f 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java @@ -82,4 +82,9 @@ public class OdexHeaderItem { BaseDexBuffer bdb = new BaseDexBuffer(buf); return bdb.readSmallUint(DEX_OFFSET); } + + public static int getDependenciesOffset(byte[] buf) { + BaseDexBuffer bdb = new BaseDexBuffer(buf); + return bdb.readSmallUint(DEPENDENCIES_OFFSET); + } }