From c360d663ab4a077493037923ddf3f8bf59f30974 Mon Sep 17 00:00:00 2001 From: David Srbecky Date: Tue, 19 Sep 2023 17:13:49 +0100 Subject: Add partial support for dex containers (DEX v41). Accept the new format as long as the container has just one dex file. Test: atest ClasspathFetcherTest Change-Id: Ie320fb1b1ab4e0af843b4377f184e17fc46dfa5a --- .../src/main/java/org/jf/dexlib2/VersionMap.java | 31 +++++++++++++++++----- .../org/jf/dexlib2/dexbacked/DexBackedDexFile.java | 10 +++++++ .../org/jf/dexlib2/dexbacked/raw/HeaderItem.java | 3 +++ 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java b/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java index 791fffae..13a9fea1 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/VersionMap.java @@ -44,22 +44,39 @@ public class VersionMap { return 27; case 39: return 28; + case 40: + return 34; + case 41: + return 35; default: return NO_VERSION; } } public static int mapApiToDexVersion(int api) { - if (api <= 23) { + if (api <= 23) { // Android M/6 return 35; } - if (api <= 25) { - return 37; - } - if (api <= 27) { - return 38; + switch (api) { + case 24: // Android N/7 + case 25: // Android N/7.1 + return 37; + case 26: // Android O/8 + case 27: // Android O/8.1 + return 38; + case 28: // Android P/9 + return 39; + case 29: // Android Q/10 + case 30: // Android R/11 + case 31: // Android S/12 + case 32: // Android S/12.1 + case 33: // Android T/13 + case 34: // Android U/14 + return 40; + case 35: // Android V/15 + return 41; } - return 39; + return NO_VERSION; } public static int mapArtVersionToApi(int artVersion) { diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java index 664428b9..210552c3 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java @@ -100,6 +100,16 @@ public class DexBackedDexFile extends BaseDexBuffer implements DexFile { classCount = readSmallUint(HeaderItem.CLASS_COUNT_OFFSET); classStartOffset = readSmallUint(HeaderItem.CLASS_START_OFFSET); mapOffset = readSmallUint(HeaderItem.MAP_OFFSET); + + if (dexVersion >= 41) { + // Reject non-trivial dex container (i.e. multiples dex files in the same physical file). + int container_off = readSmallUint(HeaderItem.CONTAINER_OFF_OFFSET); + int container_size = readSmallUint(HeaderItem.CONTAINER_SIZE_OFFSET); + int file_size = readSmallUint(HeaderItem.FILE_SIZE_OFFSET); + if (container_off != 0 || container_size != file_size) { + throw new DexUtil.UnsupportedFile(String.format("Dex container is not supported")); + } + } } public DexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull BaseDexBuffer buf) { diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java index 619357aa..e6859b48 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java @@ -83,6 +83,9 @@ public class HeaderItem { public static final int CLASS_COUNT_OFFSET = 96; public static final int CLASS_START_OFFSET = 100; + public static final int CONTAINER_SIZE_OFFSET = 112; + public static final int CONTAINER_OFF_OFFSET = 116; + @Nonnull private RawDexFile dexFile; public HeaderItem(@Nonnull RawDexFile dexFile) { -- cgit v1.2.3