From cd006ce78ec905da9515e3cbc33a5b767cbcf48d Mon Sep 17 00:00:00 2001 From: Skylot Date: Wed, 4 Nov 2020 21:02:13 +0000 Subject: [PATCH] fix: improve resource type detection and remove deprecated method --- .../src/main/java/jadx/api/ResourceType.java | 31 ++++++++++++++++--- .../src/main/java/jadx/gui/JadxWrapper.java | 5 --- .../java/jadx/gui/treemodel/ApkSignature.java | 17 ++++++++-- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/jadx-core/src/main/java/jadx/api/ResourceType.java b/jadx-core/src/main/java/jadx/api/ResourceType.java index 157bde9ea..d139c07e0 100644 --- a/jadx-core/src/main/java/jadx/api/ResourceType.java +++ b/jadx-core/src/main/java/jadx/api/ResourceType.java @@ -1,14 +1,20 @@ package jadx.api; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +import jadx.core.utils.exceptions.JadxRuntimeException; + public enum ResourceType { CODE(".dex", ".jar", ".class"), - MANIFEST("AndroidManifest.xml"), XML(".xml"), ARSC(".arsc"), FONT(".ttf", ".otf"), IMG(".png", ".gif", ".jpg"), MEDIA(".mp3", ".wav"), LIB(".so"), + MANIFEST, UNKNOWN; private final String[] exts; @@ -21,14 +27,31 @@ public enum ResourceType { return exts; } - public static ResourceType getFileType(String fileName) { + private static final Map EXT_MAP = new HashMap<>(); + + static { for (ResourceType type : ResourceType.values()) { for (String ext : type.getExts()) { - if (fileName.toLowerCase().endsWith(ext)) { - return type; + ResourceType prev = EXT_MAP.put(ext, type); + if (prev != null) { + throw new JadxRuntimeException("Duplicate extension in ResourceType: " + ext); } } } + } + + public static ResourceType getFileType(String fileName) { + int dot = fileName.lastIndexOf('.'); + if (dot != -1) { + String ext = fileName.substring(dot).toLowerCase(Locale.ROOT); + ResourceType resType = EXT_MAP.get(ext); + if (resType != null) { + if (resType == XML && fileName.equals("AndroidManifest.xml")) { + return MANIFEST; + } + return resType; + } + } return UNKNOWN; } } diff --git a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java index 880e019ac..c70a329f4 100644 --- a/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java +++ b/jadx-gui/src/main/java/jadx/gui/JadxWrapper.java @@ -143,11 +143,6 @@ public class JadxWrapper { return decompiler.getResources(); } - @Deprecated - public File getOpenFile() { - return openPaths.get(0).toFile(); - } - public List getOpenPaths() { return openPaths; } diff --git a/jadx-gui/src/main/java/jadx/gui/treemodel/ApkSignature.java b/jadx-gui/src/main/java/jadx/gui/treemodel/ApkSignature.java index 56e2af3e2..3555b2e8d 100644 --- a/jadx-gui/src/main/java/jadx/gui/treemodel/ApkSignature.java +++ b/jadx-gui/src/main/java/jadx/gui/treemodel/ApkSignature.java @@ -15,6 +15,8 @@ import org.slf4j.LoggerFactory; import com.android.apksig.ApkVerifier; +import jadx.api.ResourceFile; +import jadx.api.ResourceType; import jadx.gui.JadxWrapper; import jadx.gui.utils.CertificateManager; import jadx.gui.utils.NLS; @@ -33,11 +35,20 @@ public class ApkSignature extends JNode { public static ApkSignature getApkSignature(JadxWrapper wrapper) { // Only show the ApkSignature node if an AndroidManifest.xml is present. // Without a manifest the Google ApkVerifier refuses to work. - if (wrapper.getResources().stream().noneMatch(r -> "AndroidManifest.xml".equals(r.getOriginalName()))) { + File apkFile = null; + for (ResourceFile resFile : wrapper.getResources()) { + if (resFile.getType() == ResourceType.MANIFEST) { + ResourceFile.ZipRef zipRef = resFile.getZipRef(); + if (zipRef != null) { + apkFile = zipRef.getZipFile(); + break; + } + } + } + if (apkFile == null) { return null; } - File openFile = wrapper.getOpenFile(); - return new ApkSignature(openFile); + return new ApkSignature(apkFile); } public ApkSignature(File openFile) {