diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-02-02 23:48:07 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-02-02 23:48:07 +0000 |
commit | 20cbd1aa480f86c5ef0d25fa74eab48c590f74a0 (patch) | |
tree | e0fa17261d2eb7418ff78bf72c627553398d29fe | |
parent | bbcf07628c2809b02a9716e542e42038a3bec47f (diff) | |
parent | 1a1bad37d28e963042e8c62af799f592edd72892 (diff) | |
download | google-smali-20cbd1aa480f86c5ef0d25fa74eab48c590f74a0.tar.gz |
Snap for 11400057 from 1a1bad37d28e963042e8c62af799f592edd72892 to simpleperf-release
Change-Id: I85d3aa4a1f2bee401020f153c799518df4cec3ee
-rw-r--r-- | baksmali/Android.bp | 2 | ||||
-rw-r--r-- | baksmali/manifest.txt | 1 | ||||
-rw-r--r-- | dexlib2/src/main/java/com/android/tools/smali/dexlib2/VersionMap.java | 31 | ||||
-rw-r--r-- | dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/DexBackedDexFile.java | 81 | ||||
-rw-r--r-- | dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/ZipDexContainer.java | 98 | ||||
-rw-r--r-- | dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/raw/HeaderItem.java | 3 | ||||
-rwxr-xr-x | scripts/baksmali | 14 | ||||
-rwxr-xr-x | scripts/smali | 14 | ||||
-rw-r--r-- | smali/Android.bp | 2 | ||||
-rw-r--r-- | smali/manifest.txt | 1 |
10 files changed, 134 insertions, 113 deletions
diff --git a/baksmali/Android.bp b/baksmali/Android.bp index ad333f86..6fc3f7ea 100644 --- a/baksmali/Android.bp +++ b/baksmali/Android.bp @@ -32,7 +32,7 @@ java_binary_host { ":third_party-smali-baksmali", ], - // manifest: "manifest.txt", + manifest: "manifest.txt", static_libs: [ "smali-dexlib2", diff --git a/baksmali/manifest.txt b/baksmali/manifest.txt new file mode 100644 index 00000000..b3eba648 --- /dev/null +++ b/baksmali/manifest.txt @@ -0,0 +1 @@ +Main-Class: com.android.tools.smali.baksmali.Main diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/VersionMap.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/VersionMap.java index 5809e6d4..cbc6db25 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/VersionMap.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/VersionMap.java @@ -43,22 +43,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/com/android/tools/smali/dexlib2/dexbacked/DexBackedDexFile.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/DexBackedDexFile.java index 93d75817..7ea7c699 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/DexBackedDexFile.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/DexBackedDexFile.java @@ -74,6 +74,7 @@ public class DexBackedDexFile implements DexFile { @Nonnull private final Opcodes opcodes; + private final int fileSize; private final int stringCount; private final int stringStartOffset; private final int typeCount; @@ -90,6 +91,14 @@ public class DexBackedDexFile implements DexFile { private final int hiddenApiRestrictionsOffset; protected DexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull byte[] buf, int offset, boolean verifyMagic) { + this(opcodes, buf, offset, verifyMagic, 0); + } + + protected DexBackedDexFile(@Nullable Opcodes opcodes, + @Nonnull byte[] buf, + int offset, + boolean verifyMagic, + int header_offset) { dexBuffer = new DexBuffer(buf, offset); dataBuffer = new DexBuffer(buf, offset + getBaseDataOffset()); @@ -101,19 +110,20 @@ public class DexBackedDexFile implements DexFile { this.opcodes = opcodes; } - stringCount = dexBuffer.readSmallUint(HeaderItem.STRING_COUNT_OFFSET); - stringStartOffset = dexBuffer.readSmallUint(HeaderItem.STRING_START_OFFSET); - typeCount = dexBuffer.readSmallUint(HeaderItem.TYPE_COUNT_OFFSET); - typeStartOffset = dexBuffer.readSmallUint(HeaderItem.TYPE_START_OFFSET); - protoCount = dexBuffer.readSmallUint(HeaderItem.PROTO_COUNT_OFFSET); - protoStartOffset = dexBuffer.readSmallUint(HeaderItem.PROTO_START_OFFSET); - fieldCount = dexBuffer.readSmallUint(HeaderItem.FIELD_COUNT_OFFSET); - fieldStartOffset = dexBuffer.readSmallUint(HeaderItem.FIELD_START_OFFSET); - methodCount = dexBuffer.readSmallUint(HeaderItem.METHOD_COUNT_OFFSET); - methodStartOffset = dexBuffer.readSmallUint(HeaderItem.METHOD_START_OFFSET); - classCount = dexBuffer.readSmallUint(HeaderItem.CLASS_COUNT_OFFSET); - classStartOffset = dexBuffer.readSmallUint(HeaderItem.CLASS_START_OFFSET); - mapOffset = dexBuffer.readSmallUint(HeaderItem.MAP_OFFSET); + fileSize = dexBuffer.readSmallUint(header_offset + HeaderItem.FILE_SIZE_OFFSET); + stringCount = dexBuffer.readSmallUint(header_offset + HeaderItem.STRING_COUNT_OFFSET); + stringStartOffset = dexBuffer.readSmallUint(header_offset + HeaderItem.STRING_START_OFFSET); + typeCount = dexBuffer.readSmallUint(header_offset + HeaderItem.TYPE_COUNT_OFFSET); + typeStartOffset = dexBuffer.readSmallUint(header_offset + HeaderItem.TYPE_START_OFFSET); + protoCount = dexBuffer.readSmallUint(header_offset + HeaderItem.PROTO_COUNT_OFFSET); + protoStartOffset = dexBuffer.readSmallUint(header_offset + HeaderItem.PROTO_START_OFFSET); + fieldCount = dexBuffer.readSmallUint(header_offset + HeaderItem.FIELD_COUNT_OFFSET); + fieldStartOffset = dexBuffer.readSmallUint(header_offset + HeaderItem.FIELD_START_OFFSET); + methodCount = dexBuffer.readSmallUint(header_offset + HeaderItem.METHOD_COUNT_OFFSET); + methodStartOffset = dexBuffer.readSmallUint(header_offset + HeaderItem.METHOD_START_OFFSET); + classCount = dexBuffer.readSmallUint(header_offset + HeaderItem.CLASS_COUNT_OFFSET); + classStartOffset = dexBuffer.readSmallUint(header_offset + HeaderItem.CLASS_START_OFFSET); + mapOffset = dexBuffer.readSmallUint(header_offset + HeaderItem.MAP_OFFSET); MapItem mapItem = getMapItemForSection(ItemType.HIDDENAPI_CLASS_DATA_ITEM); if (mapItem != null) { @@ -121,41 +131,13 @@ public class DexBackedDexFile implements DexFile { } else { hiddenApiRestrictionsOffset = DexWriter.NO_OFFSET; } - } - - protected DexBackedDexFile(@Nullable Opcodes opcodes, @Nonnull DexBuffer dexBuffer, @Nonnull DexBuffer dataBuffer, int offset, boolean verifyMagic) { - this.dexBuffer = dexBuffer; - this.dataBuffer = dataBuffer; - - byte[] headerBuf = dexBuffer.readByteRange(offset, HeaderItem.ITEM_SIZE); - - int dexVersion = getVersion(headerBuf, offset, verifyMagic); - if (opcodes == null) { - this.opcodes = getDefaultOpcodes(dexVersion); - } else { - this.opcodes = opcodes; + int container_off = 0; + if (dexVersion >= 41) { + container_off = dexBuffer.readSmallUint(header_offset + HeaderItem.CONTAINER_OFF_OFFSET); } - - stringCount = dexBuffer.readSmallUint(HeaderItem.STRING_COUNT_OFFSET); - stringStartOffset = dexBuffer.readSmallUint(HeaderItem.STRING_START_OFFSET); - typeCount = dexBuffer.readSmallUint(HeaderItem.TYPE_COUNT_OFFSET); - typeStartOffset = dexBuffer.readSmallUint(HeaderItem.TYPE_START_OFFSET); - protoCount = dexBuffer.readSmallUint(HeaderItem.PROTO_COUNT_OFFSET); - protoStartOffset = dexBuffer.readSmallUint(HeaderItem.PROTO_START_OFFSET); - fieldCount = dexBuffer.readSmallUint(HeaderItem.FIELD_COUNT_OFFSET); - fieldStartOffset = dexBuffer.readSmallUint(HeaderItem.FIELD_START_OFFSET); - methodCount = dexBuffer.readSmallUint(HeaderItem.METHOD_COUNT_OFFSET); - methodStartOffset = dexBuffer.readSmallUint(HeaderItem.METHOD_START_OFFSET); - classCount = dexBuffer.readSmallUint(HeaderItem.CLASS_COUNT_OFFSET); - classStartOffset = dexBuffer.readSmallUint(HeaderItem.CLASS_START_OFFSET); - mapOffset = dexBuffer.readSmallUint(HeaderItem.MAP_OFFSET); - - MapItem mapItem = getMapItemForSection(ItemType.HIDDENAPI_CLASS_DATA_ITEM); - if (mapItem != null) { - hiddenApiRestrictionsOffset = mapItem.getOffset(); - } else { - hiddenApiRestrictionsOffset = DexWriter.NO_OFFSET; + if (container_off != header_offset) { + throw new DexUtil.InvalidFile(String.format("Unexpected container offset in header")); } } @@ -167,6 +149,13 @@ public class DexBackedDexFile implements DexFile { return 0; } + /** + * @return Size of single dex file (out of potentially several dex files within a container). + */ + public int getFileSize() { + return fileSize; + } + protected int getVersion(byte[] buf, int offset, boolean verifyMagic) { if (verifyMagic) { return DexUtil.verifyDexHeader(buf, offset); diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/ZipDexContainer.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/ZipDexContainer.java index 78c01786..31d115cc 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/ZipDexContainer.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/ZipDexContainer.java @@ -40,16 +40,19 @@ import com.google.common.collect.Lists; import com.google.common.io.ByteStreams; import com.android.tools.smali.dexlib2.dexbacked.DexBackedDexFile.NotADexFile; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; import java.util.Enumeration; import java.util.List; +import java.util.Map; +import java.util.TreeMap; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * Represents a zip file that contains dex files (i.e. an apk or jar file) @@ -58,6 +61,7 @@ public class ZipDexContainer implements MultiDexContainer<DexBackedDexFile> { private final File zipFilePath; @Nullable private final Opcodes opcodes; + private TreeMap<String, DexBackedDexFile> entries; /** * Constructs a new ZipDexContainer for the given zip file @@ -75,7 +79,14 @@ public class ZipDexContainer implements MultiDexContainer<DexBackedDexFile> { * @return A list of the names of dex files in this zip file */ @Nonnull @Override public List<String> getDexEntryNames() throws IOException { - List<String> entryNames = Lists.newArrayList(); + return new ArrayList<>(getEntries().keySet()); + } + + private Map<String, DexBackedDexFile> getEntries() throws IOException { + if (entries != null) { + return entries; + } + entries = new TreeMap<String, DexBackedDexFile>(); ZipFile zipFile = getZipFile(); try { Enumeration<? extends ZipEntry> entriesEnumeration = zipFile.entries(); @@ -87,10 +98,21 @@ public class ZipDexContainer implements MultiDexContainer<DexBackedDexFile> { continue; } - entryNames.add(entry.getName()); + // There might be several dex files in zip entry since DEX v41. + InputStream inputStream = zipFile.getInputStream(entry); + try { + byte[] buf = ByteStreams.toByteArray(inputStream); + for (int offset = 0, i = 1; offset < buf.length; i++) { + DexBackedDexFile dex = new DexBackedDexFile(opcodes, buf, 0, true, offset); + entries.put(entry.getName() + (i > 1 ? ("/" + i) : ""), dex); + offset += dex.getFileSize(); + }; + } finally { + inputStream.close(); + } } - return entryNames; + return entries; } finally { zipFile.close(); } @@ -100,21 +122,33 @@ public class ZipDexContainer implements MultiDexContainer<DexBackedDexFile> { * Loads a dex file from a specific named entry. * * @param entryName The name of the entry - * @return A ZipDexFile, or null if there is no entry with the given name + * @return A DexEntry, or null if there is no entry with the given name * @throws NotADexFile If the entry isn't a dex file */ @Nullable @Override public DexEntry<DexBackedDexFile> getEntry(@Nonnull String entryName) throws IOException { - ZipFile zipFile = getZipFile(); - try { - ZipEntry entry = zipFile.getEntry(entryName); - if (entry == null) { - return null; - } - - return loadEntry(zipFile, entry); - } finally { - zipFile.close(); - } + DexFile dexFile = getEntries().get(entryName); + if (dexFile == null) { + return null; + } + return new DexEntry() { + @Nonnull + @Override + public String getEntryName() { + return entryName; + } + + @Nonnull + @Override + public DexFile getDexFile() { + return dexFile; + } + + @Nonnull + @Override + public MultiDexContainer getContainer() { + return ZipDexContainer.this; + } + }; } public boolean isZipFile() { @@ -161,36 +195,6 @@ public class ZipDexContainer implements MultiDexContainer<DexBackedDexFile> { } } - @Nonnull - protected DexEntry loadEntry(@Nonnull ZipFile zipFile, @Nonnull ZipEntry zipEntry) throws IOException { - InputStream inputStream = zipFile.getInputStream(zipEntry); - try { - byte[] buf = ByteStreams.toByteArray(inputStream); - - return new DexEntry() { - @Nonnull - @Override - public String getEntryName() { - return zipEntry.getName(); - } - - @Nonnull - @Override - public DexFile getDexFile() { - return new DexBackedDexFile(opcodes, buf); - } - - @Nonnull - @Override - public MultiDexContainer getContainer() { - return ZipDexContainer.this; - } - }; - } finally { - inputStream.close(); - } - } - public static class NotAZipFileException extends RuntimeException { } } diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/raw/HeaderItem.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/raw/HeaderItem.java index 61cc0f39..56bb992f 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/raw/HeaderItem.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/raw/HeaderItem.java @@ -87,6 +87,9 @@ public class HeaderItem { public static final int DATA_SIZE_OFFSET = 104; public static final int DATA_START_OFFSET = 108; + public static final int CONTAINER_SIZE_OFFSET = 112; + public static final int CONTAINER_OFF_OFFSET = 116; + @Nonnull private DexBackedDexFile dexFile; public HeaderItem(@Nonnull DexBackedDexFile dexFile) { diff --git a/scripts/baksmali b/scripts/baksmali index bd3f820e..21622d4d 100755 --- a/scripts/baksmali +++ b/scripts/baksmali @@ -29,9 +29,6 @@ prog="$0" while [ -h "${prog}" ]; do newProg=`/bin/ls -ld "${prog}"` - echo ${newProg} - - newProg=`expr "${newProg}" : ".* -> \(.*\)$"` if expr "x${newProg}" : 'x/' >/dev/null; then prog="${newProg}" @@ -48,10 +45,15 @@ prog="${progdir}"/`basename "${prog}"` cd "${oldwd}" -jarfile=baksmali.jar +jarfile=smali-baksmali.jar libdir="$progdir" -if [ ! -r "$libdir/$jarfile" ] -then + +if [ ! -r "$libdir/$jarfile" ]; then + # set location for the Android tree case + libdir=`dirname "$progdir"`/framework +fi + +if [ ! -r "$libdir/$jarfile" ]; then echo `basename "$prog"`": can't find $jarfile" exit 1 fi diff --git a/scripts/smali b/scripts/smali index 9ede6758..238ff535 100755 --- a/scripts/smali +++ b/scripts/smali @@ -29,9 +29,6 @@ prog="$0" while [ -h "${prog}" ]; do newProg=`/bin/ls -ld "${prog}"` - echo ${newProg} - - newProg=`expr "${newProg}" : ".* -> \(.*\)$"` if expr "x${newProg}" : 'x/' >/dev/null; then prog="${newProg}" @@ -48,10 +45,15 @@ prog="${progdir}"/`basename "${prog}"` cd "${oldwd}" -jarfile=smali.jar +jarfile=android-smali.jar libdir="$progdir" -if [ ! -r "$libdir/$jarfile" ] -then + +if [ ! -r "$libdir/$jarfile" ]; then + # set location for the Android tree case + libdir=`dirname "$progdir"`/framework +fi + +if [ ! -r "$libdir/$jarfile" ]; then echo `basename "$prog"`": can't find $jarfile" exit 1 fi diff --git a/smali/Android.bp b/smali/Android.bp index 9a1d9325..73ec6520 100644 --- a/smali/Android.bp +++ b/smali/Android.bp @@ -31,6 +31,8 @@ java_binary_host { ":third_party-smali", ], + manifest: "manifest.txt", + static_libs: [ "antlr-runtime", "jcommander", diff --git a/smali/manifest.txt b/smali/manifest.txt new file mode 100644 index 00000000..d7879d58 --- /dev/null +++ b/smali/manifest.txt @@ -0,0 +1 @@ +Main-Class: com/android/tools/smali.smali.Main |