diff --git a/.gitignore b/.gitignore index aa724b7..643d213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,15 @@ -*.iml -.gradle -/local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -.DS_Store -/build -/captures -.externalNativeBuild -.cxx -local.properties +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/README.md b/README.md index d60ddae..7e856c0 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -Pairip Reverse Tools +Pairip Reverse Tools diff --git a/antik/src/main/java/com/antik/DexPatcher/Translation/MethodT/MethodMaker.java b/antik/src/main/java/com/antik/DexPatcher/Translation/MethodT/MethodMaker.java new file mode 100644 index 0000000..5b90040 --- /dev/null +++ b/antik/src/main/java/com/antik/DexPatcher/Translation/MethodT/MethodMaker.java @@ -0,0 +1,137 @@ +package com.antik.DexPatcher.Translation.MethodT; + +import com.antik.DexPatcher.Translation.TranslationData; +import com.antik.DexPatcher.Translation.antik.PairipClass; + +import org.jf.dexlib2.AccessFlags; +import org.jf.dexlib2.Opcode; +import org.jf.dexlib2.builder.Label; +import org.jf.dexlib2.builder.MethodImplementationBuilder; +import org.jf.dexlib2.builder.instruction.*; +import org.jf.dexlib2.iface.Method; +import org.jf.dexlib2.immutable.ImmutableMethod; +import org.jf.dexlib2.immutable.reference.ImmutableFieldReference; +import org.jf.dexlib2.immutable.reference.ImmutableMethodReference; +import org.jf.dexlib2.immutable.reference.ImmutableStringReference; +import org.jf.dexlib2.immutable.reference.ImmutableTypeReference; + +import java.util.Collections; +import java.util.Map; + +public class MethodMaker { + + public static ImmutableMethod createCleanConstructor(Method method, String superclass) { + MethodImplementationBuilder builder = new MethodImplementationBuilder(method.getParameters().size() + 1); + builder.addInstruction(new BuilderInstruction35c(Opcode.INVOKE_DIRECT, 1, 0, 0, 0, 0, 0, new ImmutableMethodReference(superclass, "", null, "V"))); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + return new ImmutableMethod(method.getDefiningClass(), method.getName(), method.getParameters(), method.getReturnType(), method.getAccessFlags(), method.getAnnotations(), method.getHiddenApiRestrictions(), builder.getMethodImplementation()); + } + + public static ImmutableMethod createPrivateConstructor(String className, String superclass) { + MethodImplementationBuilder builder = new MethodImplementationBuilder(1); + builder.addInstruction(new BuilderInstruction35c(Opcode.INVOKE_DIRECT, 1, 0, 0, 0, 0, 0, new ImmutableMethodReference(superclass, "", null, "V"))); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + return new ImmutableMethod(className, "", null, "V", AccessFlags.PRIVATE.getValue() | AccessFlags.CONSTRUCTOR.getValue(), null, null, builder.getMethodImplementation()); + } + + public static ImmutableMethod createReturnNull(Method method) { + MethodImplementationBuilder builder = new MethodImplementationBuilder(2); + builder.addInstruction(new BuilderInstruction11n(Opcode.CONST_4, 0, 0)); + builder.addInstruction(new BuilderInstruction11x(Opcode.RETURN_OBJECT, 0)); + return new ImmutableMethod(method.getDefiningClass(), method.getName(), method.getParameters(), method.getReturnType(), method.getAccessFlags(), method.getAnnotations(), method.getHiddenApiRestrictions(), builder.getMethodImplementation()); + } + + public static ImmutableMethod createReturnVoid(Method method) { + MethodImplementationBuilder builder = new MethodImplementationBuilder(2); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + return new ImmutableMethod(method.getDefiningClass(), method.getName(), method.getParameters(), method.getReturnType(), method.getAccessFlags(), method.getAnnotations(), method.getHiddenApiRestrictions(), builder.getMethodImplementation()); + } + + public static ImmutableMethod createLaunch(boolean hasMethods) { + MethodImplementationBuilder builder = new MethodImplementationBuilder(3); + String startupLauncher = PairipClass.STARTUP_LAUNCHER.type; + + builder.addInstruction(new BuilderInstruction21c(Opcode.CONST_CLASS, 0, new ImmutableTypeReference(startupLauncher))); + builder.addInstruction(new BuilderInstruction11x(Opcode.MONITOR_ENTER, 0)); + + Label tryStart = builder.addLabel("try_start"); + builder.addInstruction(new BuilderInstruction21c(Opcode.SGET_BOOLEAN, 1, new ImmutableFieldReference(startupLauncher, "launchCalled", "Z"))); + Label tryEnd = builder.addLabel("try_end"); + + builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 1, builder.getLabel("cond_false"))); + builder.addInstruction(new BuilderInstruction11x(Opcode.MONITOR_EXIT, 0)); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + builder.addLabel("cond_false"); + builder.addInstruction(new BuilderInstruction11n(Opcode.CONST_4, 1, 1)); + + Label tryStart2 = builder.addLabel("try_start_2"); + builder.addInstruction(new BuilderInstruction21c(Opcode.SPUT_BOOLEAN, 1, new ImmutableFieldReference(startupLauncher, "launchCalled", "Z"))); + builder.addInstruction(new BuilderInstruction35c(Opcode.INVOKE_STATIC, 0, 0, 0, 0, 0, 0, new ImmutableMethodReference(startupLauncher, "restoreString", null, "V"))); + + if (hasMethods) { + builder.addInstruction(new BuilderInstruction35c(Opcode.INVOKE_STATIC, 0, 0, 0, 0, 0, 0, new ImmutableMethodReference(startupLauncher, "restoreMethod", null, "V"))); + } + Label tryEnd2 = builder.addLabel("try_end_2"); + + builder.addInstruction(new BuilderInstruction11x(Opcode.MONITOR_EXIT, 0)); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + Label catchAll = builder.addLabel("catchall"); + builder.addInstruction(new BuilderInstruction11x(Opcode.MOVE_EXCEPTION, 1)); + Label tryStart3 = builder.addLabel("try_start_3"); + builder.addInstruction(new BuilderInstruction11x(Opcode.MONITOR_EXIT, 0)); + Label tryEnd3 = builder.addLabel("try_end_3"); + builder.addInstruction(new BuilderInstruction11x(Opcode.THROW, 1)); + + builder.addCatch(tryStart, tryEnd, catchAll); + builder.addCatch(tryStart2, tryEnd2, catchAll); + builder.addCatch(tryStart3, tryEnd3, catchAll); + + return new ImmutableMethod(startupLauncher, "launch", null, "V", AccessFlags.STATIC.getValue() | AccessFlags.PUBLIC.getValue() | AccessFlags.DECLARED_SYNCHRONIZED.getValue(), null, null, builder.getMethodImplementation()); + } + + public static ImmutableMethod createRestoreString(TranslationData data) { + MethodImplementationBuilder builder = new MethodImplementationBuilder(1); + String startupLauncher = PairipClass.STARTUP_LAUNCHER.type; + + for (Map.Entry entry : data.entries.entrySet()) { + if ("java.lang.String".equals(entry.getValue().type)) { + String targetClass = TranslationData.normalizeClassName(entry.getKey()); + for (Map.Entry field : entry.getValue().fields.entrySet()) { + builder.addInstruction(new BuilderInstruction21c(Opcode.CONST_STRING, 0, new ImmutableStringReference(field.getValue()))); + builder.addInstruction(new BuilderInstruction21c(Opcode.SPUT_OBJECT, 0, new ImmutableFieldReference(targetClass, field.getKey(), "Ljava/lang/String;"))); + } + } + } + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + return new ImmutableMethod(startupLauncher, "restoreString", null, "V", AccessFlags.STATIC.getValue() | AccessFlags.PRIVATE.getValue(), null, null, builder.getMethodImplementation()); + } + + public static ImmutableMethod createRestoreMethod(TranslationData data) { + MethodImplementationBuilder builder = new MethodImplementationBuilder(1); + String startupLauncher = PairipClass.STARTUP_LAUNCHER.type; + + for (Map.Entry entry : data.entries.entrySet()) { + if ("java.lang.reflect.Method".equals(entry.getValue().type)) { + String targetClass = TranslationData.normalizeClassName(entry.getKey()); + for (Map.Entry field : entry.getValue().fields.entrySet()) { + builder.addInstruction(new BuilderInstruction21c(Opcode.CONST_STRING, 0, new ImmutableStringReference(field.getValue()))); + builder.addInstruction(new BuilderInstruction35c(Opcode.INVOKE_STATIC, 1, 0, 0, 0, 0, 0, new ImmutableMethodReference("Lcom/pairip/RestoreMethod;", "get", Collections.singletonList("Ljava/lang/String;"), "Ljava/lang/reflect/Method;"))); + builder.addInstruction(new BuilderInstruction11x(Opcode.MOVE_RESULT_OBJECT, 0)); + builder.addInstruction(new BuilderInstruction21c(Opcode.SPUT_OBJECT, 0, new ImmutableFieldReference(targetClass, field.getKey(), "Ljava/lang/reflect/Method;"))); + } + } + } + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + return new ImmutableMethod(startupLauncher, "restoreMethod", null, "V", AccessFlags.STATIC.getValue() | AccessFlags.PRIVATE.getValue(), null, null, builder.getMethodImplementation()); + } + + public static ImmutableMethod createClinit() { + MethodImplementationBuilder builder = new MethodImplementationBuilder(1); + builder.addInstruction(new BuilderInstruction21c(Opcode.CONST_STRING, 0, new ImmutableStringReference("Pairip Patcher v1.3.10"))); + builder.addInstruction(new BuilderInstruction35c(Opcode.INVOKE_STATIC, 0, 0, 0, 0, 0, 0, new ImmutableMethodReference(PairipClass.STARTUP_LAUNCHER.type, "launch", null, "V"))); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + return new ImmutableMethod(PairipClass.APPLICATION.type, "", null, "V", AccessFlags.STATIC.getValue() | AccessFlags.CONSTRUCTOR.getValue(), null, null, builder.getMethodImplementation()); + } +} diff --git a/antik/src/main/java/com/antik/DexPatcher/Translation/MethodT/RestoreMethodMaker.java b/antik/src/main/java/com/antik/DexPatcher/Translation/MethodT/RestoreMethodMaker.java new file mode 100644 index 0000000..1d50f60 --- /dev/null +++ b/antik/src/main/java/com/antik/DexPatcher/Translation/MethodT/RestoreMethodMaker.java @@ -0,0 +1,43 @@ +package com.antik.DexPatcher.Translation.MethodT; + +import org.jf.dexlib2.AccessFlags; +import org.jf.dexlib2.Opcode; +import org.jf.dexlib2.builder.MethodImplementationBuilder; +import org.jf.dexlib2.builder.instruction.*; +import org.jf.dexlib2.immutable.ImmutableClassDef; +import org.jf.dexlib2.immutable.ImmutableMethod; +import org.jf.dexlib2.immutable.ImmutableMethodParameter; + +import java.util.Collections; + +public class RestoreMethodMaker { + + public static ImmutableClassDef createRestoreMethodClass() { + String type = "Lcom/pairip/RestoreMethod;"; + MethodImplementationBuilder builder = new MethodImplementationBuilder(3); + builder.addInstruction(new BuilderInstruction11n(Opcode.CONST_4, 0, 0)); + builder.addInstruction(new BuilderInstruction11x(Opcode.RETURN_OBJECT, 0)); + + ImmutableMethod getMethod = new ImmutableMethod( + type, + "get", + Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/String;", null, null)), + "Ljava/lang/reflect/Method;", + AccessFlags.PUBLIC.getValue() | AccessFlags.STATIC.getValue(), + null, + null, + builder.getMethodImplementation()); + + return new ImmutableClassDef( + type, + AccessFlags.PUBLIC.getValue(), + "Ljava/lang/Object;", + null, + null, + null, + null, + null, + Collections.singletonList(getMethod), + null); + } +} diff --git a/antik/src/main/java/com/antik/DexPatcher/Translation/TranslationData.java b/antik/src/main/java/com/antik/DexPatcher/Translation/TranslationData.java new file mode 100644 index 0000000..196b5cd --- /dev/null +++ b/antik/src/main/java/com/antik/DexPatcher/Translation/TranslationData.java @@ -0,0 +1,65 @@ +package com.antik.DexPatcher.Translation; + +import com.reandroid.json.JSONObject; +import java.io.File; +import java.nio.file.Files; +import java.util.HashMap; +import java.util.Map; + +public class TranslationData { + public static class Entry { + public final String type; + public final Map fields; + + public Entry(String type, Map fields) { + this.type = type; + this.fields = fields; + } + } + + public final Map entries = new HashMap<>(); + public boolean hasMethods = false; + + public TranslationData(File jsonFile) throws Exception { + String content = new String(Files.readAllBytes(jsonFile.toPath())); + JSONObject json = new JSONObject(content); + for (String className : json.keySet()) { + String rawClassName = className.trim(); + JSONObject classObj = json.getJSONObject(className); + String type = normalizeFieldType(classObj.getString("type")); + if ("java.lang.reflect.Method".equals(type)) { + hasMethods = true; + } + JSONObject fieldsObj = classObj.getJSONObject("fields"); + Map fields = new HashMap<>(); + for (String fieldName : fieldsObj.keySet()) { + fields.put(fieldName, fieldsObj.getString(fieldName)); + } + entries.put(rawClassName, new Entry(type, fields)); + } + } + + public static String normalizeClassName(String className) { + String normalized = className.trim(); + if (normalized.isEmpty()) { + return normalized; + } + if (normalized.startsWith("L") && normalized.endsWith(";")) { + return "L" + normalized.substring(1, normalized.length() - 1).replace('.', '/').replace('\\', '/') + ";"; + } + if (normalized.startsWith("[")) { + return normalized.replace('.', '/').replace('\\', '/'); + } + return "L" + normalized.replace('.', '/').replace('\\', '/') + ";"; + } + + private static String normalizeFieldType(String type) { + if ("Ljava/lang/String;".equals(type)) { + return "java.lang.String"; + } + if ("Ljava/lang/reflect/Method;".equals(type)) { + return "java.lang.reflect.Method"; + } + return type; + } +} diff --git a/antik/src/main/java/com/antik/DexPatcher/Translation/TranslationPatcher.java b/antik/src/main/java/com/antik/DexPatcher/Translation/TranslationPatcher.java new file mode 100644 index 0000000..61f4066 --- /dev/null +++ b/antik/src/main/java/com/antik/DexPatcher/Translation/TranslationPatcher.java @@ -0,0 +1,343 @@ +package com.antik.DexPatcher.Translation; + +import com.antik.DexPatcher.Translation.antik.PairipClass; +import com.antik.Main; +import com.reandroid.apk.ApkModule; +import com.reandroid.archive.ByteInputSource; +import com.reandroid.archive.InputSource; +import org.jf.dexlib2.DexFileFactory; +import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.iface.ClassDef; +import org.jf.dexlib2.iface.DexFile; +import org.jf.dexlib2.writer.io.MemoryDataStore; +import org.jf.dexlib2.writer.pool.DexPool; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class TranslationPatcher { + + private static final byte[] DEX_MAGIC = new byte[]{0x64, 0x65, 0x78, 0x0A}; + private static final byte[] PAIRIP_ASSET_HEADER = new byte[]{0x00, 0x49, 0x41, 0x50, 0x02}; + + public static void patch(ApkModule m, File jsonFile) throws Exception { + System.out.println("[INFO] Loading translation file: " + jsonFile.getName()); + TranslationData data = new TranslationData(jsonFile); + TranslationRewriter rewriter = new TranslationRewriter(data); + + List dexNames = new ArrayList<>(); + for (InputSource s : m.getInputSources()) { + if (s.getName().endsWith(".dex")) { + dexNames.add(s.getName()); + } + } + + Set existingDexNames = new HashSet<>(dexNames); + Set existingClassTypes = new HashSet<>(); + for (String dn : dexNames) { + InputSource s = m.getInputSource(dn); + if (s == null) continue; + try (InputStream input = s.openStream()) { + DexFile dexFile = loadDexFile(readAllBytes(input), "trans_scan"); + for (ClassDef classDef : dexFile.getClasses()) { + existingClassTypes.add(classDef.getType()); + } + } + } + + List extraDexes = new ArrayList<>(); + if (data.hasMethods) { + extraDexes.addAll(collectEmbeddedAssetDexes(m, existingClassTypes)); + PendingDex restoreMethodDex = loadRestoreMethodDex(existingClassTypes); + if (restoreMethodDex != null) { + extraDexes.add(restoreMethodDex); + } + } + + for (String dn : dexNames) { + InputSource s = m.getInputSource(dn); + if (s == null) continue; + + byte[] d_bs; + try (InputStream i = s.openStream()) { + d_bs = readAllBytes(i); + } + + DexFile d_f = loadDexFile(d_bs, "trans"); + + List cds = new ArrayList<>(); + boolean mod = false; + + for (ClassDef cd : d_f.getClasses()) { + String type = cd.getType(); + if (type.startsWith("Lcom/pairip/")) { + if (PairipClass.contains(type)) { + System.out.println("[INFO] Patching " + type + " in " + dn); + cds.add(rewriter.rewrite(cd)); + mod = true; + } else if (!type.equals("Lcom/pairip/PairipLog;") && !type.equals("Lcom/pairip/RestoreMethod;")) { + System.out.println("[INFO] Removing class: " + type); + mod = true; + } else { + cds.add(cd); + } + } else { + cds.add(cd); + } + } + + if (mod) { + MemoryDataStore ds = new MemoryDataStore(); + DexPool dp = new DexPool(Opcodes.getDefault()); + for (ClassDef c : cds) { + dp.internClass(c); + } + dp.writeTo(ds); + byte[] r_bs = Arrays.copyOf(ds.getData(), ds.getSize()); + m.add(new ByteInputSource(r_bs, dn)); + System.out.println("[BUILD] Patched translation in " + dn); + } + } + + int nextDexNumber = nextDexNumber(existingDexNames); + for (PendingDex pendingDex : extraDexes) { + if (!pendingDex.canAddAgainst(existingClassTypes)) { + if (!pendingDex.isFullyPresentIn(existingClassTypes)) { + System.err.println("[WARN] Skipping " + pendingDex.sourceName + " due to partial class overlap"); + } + continue; + } + + String dexEntryName = nextDexEntryName(existingDexNames, nextDexNumber); + nextDexNumber = dexNumberOf(dexEntryName) + 1; + m.add(new ByteInputSource(pendingDex.dexBytes, dexEntryName)); + existingDexNames.add(dexEntryName); + existingClassTypes.addAll(pendingDex.classTypes); + System.out.println("[INFO] Added " + dexEntryName + " from " + pendingDex.sourceName); + } + + List libFiles = new ArrayList<>(); + for (InputSource source : m.getInputSources()) { + if (source.getName().contains("libpairipcore.so")) { + libFiles.add(source.getName()); + } + } + for (String libFile : libFiles) { + try { + m.getZipEntryMap().remove(libFile); + System.out.println("[INFO] Removing lib: " + libFile); + } catch (Exception e) { + System.err.println("[WARN] Could not remove lib: " + libFile); + } + } + } + + private static byte[] readAllBytes(InputStream input) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buf = new byte[8192]; + int len; + while ((len = input.read(buf)) != -1) { + baos.write(buf, 0, len); + } + return baos.toByteArray(); + } + + private static DexFile loadDexFile(byte[] dexBytes, String prefix) throws Exception { + File tempDex = File.createTempFile(prefix, ".dex"); + try { + Files.write(tempDex.toPath(), dexBytes); + return DexFileFactory.loadDexFile(tempDex, Opcodes.getDefault()); + } finally { + tempDex.delete(); + } + } + + private static List collectEmbeddedAssetDexes(ApkModule module, Set existingClassTypes) throws Exception { + List pendingDexes = new ArrayList<>(); + for (InputSource source : module.getInputSources()) { + if (!isTopLevelAsset(source.getName())) { + continue; + } + + byte[] assetBytes; + try (InputStream input = source.openStream()) { + assetBytes = readAllBytes(input); + } + + if (!startsWith(assetBytes, PAIRIP_ASSET_HEADER)) { + continue; + } + + int dexStart = findEmbeddedDexStart(assetBytes); + if (dexStart < 0) { + continue; + } + + try { + byte[] dexBytes = extractEmbeddedDex(assetBytes, dexStart); + PendingDex pendingDex = pendingDexFromBytes(source.getName(), dexBytes, "asset_dex"); + if (!pendingDex.isFullyPresentIn(existingClassTypes)) { + pendingDexes.add(pendingDex); + } + } catch (Exception ignored) { + } + } + + pendingDexes.sort((left, right) -> { + int bySize = Integer.compare(right.classTypes.size(), left.classTypes.size()); + if (bySize != 0) { + return bySize; + } + return left.sourceName.compareTo(right.sourceName); + }); + return pendingDexes; + } + + private static PendingDex loadRestoreMethodDex(Set existingClassTypes) throws Exception { + try (InputStream input = Main.class.getResourceAsStream("/restoreMethod.dex")) { + if (input == null) { + throw new FileNotFoundException("Missing resource: /restoreMethod.dex"); + } + PendingDex pendingDex = pendingDexFromBytes("restoreMethod.dex", readAllBytes(input), "restore_method"); + System.out.println("[INFO] Loaded classes from restoreMethod.dex"); + return pendingDex.isFullyPresentIn(existingClassTypes) ? null : pendingDex; + } + } + + private static PendingDex pendingDexFromBytes(String sourceName, byte[] dexBytes, String prefix) throws Exception { + DexFile dexFile = loadDexFile(dexBytes, prefix); + Set classTypes = new HashSet<>(); + for (ClassDef classDef : dexFile.getClasses()) { + classTypes.add(classDef.getType()); + } + return new PendingDex(sourceName, dexBytes, classTypes); + } + + private static boolean isTopLevelAsset(String entryName) { + if (!entryName.startsWith("assets/")) { + return false; + } + return entryName.indexOf('/', "assets/".length()) < 0; + } + + private static boolean startsWith(byte[] bytes, byte[] prefix) { + if (bytes.length < prefix.length) { + return false; + } + for (int i = 0; i < prefix.length; i++) { + if (bytes[i] != prefix[i]) { + return false; + } + } + return true; + } + + private static int findEmbeddedDexStart(byte[] bytes) { + for (int i = 0; i <= bytes.length - DEX_MAGIC.length; i++) { + boolean matches = true; + for (int j = 0; j < DEX_MAGIC.length; j++) { + if (bytes[i + j] != DEX_MAGIC[j]) { + matches = false; + break; + } + } + if (matches) { + return i; + } + } + return -1; + } + + private static byte[] extractEmbeddedDex(byte[] assetBytes, int dexStart) { + int headerOffset = dexStart + 0x20; + if (headerOffset + 4 > assetBytes.length) { + throw new IllegalArgumentException("Embedded dex header truncated"); + } + + int declaredFileSize = readLittleEndianInt(assetBytes, headerOffset); + if (declaredFileSize <= 0) { + throw new IllegalArgumentException("Embedded dex declared invalid file size: " + declaredFileSize); + } + + int dexEnd = dexStart + declaredFileSize; + if (dexEnd > assetBytes.length) { + throw new IllegalArgumentException("Embedded dex declared size exceeds asset bounds: " + declaredFileSize); + } + + return Arrays.copyOfRange(assetBytes, dexStart, dexEnd); + } + + private static int readLittleEndianInt(byte[] bytes, int offset) { + return (bytes[offset] & 0xFF) | ((bytes[offset + 1] & 0xFF) << 8) | ((bytes[offset + 2] & 0xFF) << 16) | ((bytes[offset + 3] & 0xFF) << 24); + } + + private static int nextDexNumber(Set dexEntryNames) { + int next = 1; + for (String name : dexEntryNames) { + next = Math.max(next, dexNumberOf(name) + 1); + } + return next; + } + + private static int dexNumberOf(String dexEntryName) { + if ("classes.dex".equals(dexEntryName)) { + return 1; + } + if (!dexEntryName.startsWith("classes") || !dexEntryName.endsWith(".dex")) { + return -1; + } + String middle = dexEntryName.substring("classes".length(), dexEntryName.length() - ".dex".length()); + if (middle.isEmpty()) { + return 1; + } + try { + return Integer.parseInt(middle); + } catch (NumberFormatException ignored) { + return -1; + } + } + + private static String nextDexEntryName(Set dexEntryNames, int startNumber) { + int number = Math.max(startNumber, 1); + while (true) { + String candidate = number == 1 ? "classes.dex" : "classes" + number + ".dex"; + if (!dexEntryNames.contains(candidate)) { + return candidate; + } + number++; + } + } + + private static final class PendingDex { + private final String sourceName; + private final byte[] dexBytes; + private final Set classTypes; + + private PendingDex(String sourceName, byte[] dexBytes, Set classTypes) { + this.sourceName = sourceName; + this.dexBytes = dexBytes; + this.classTypes = classTypes; + } + + private boolean isFullyPresentIn(Set existingClassTypes) { + return existingClassTypes.containsAll(classTypes); + } + + private boolean canAddAgainst(Set existingClassTypes) { + for (String classType : classTypes) { + if (existingClassTypes.contains(classType)) { + return false; + } + } + return true; + } + } +} diff --git a/antik/src/main/java/com/antik/DexPatcher/Translation/TranslationRewriter.java b/antik/src/main/java/com/antik/DexPatcher/Translation/TranslationRewriter.java new file mode 100644 index 0000000..1151e8d --- /dev/null +++ b/antik/src/main/java/com/antik/DexPatcher/Translation/TranslationRewriter.java @@ -0,0 +1,92 @@ +package com.antik.DexPatcher.Translation; + +import com.antik.DexPatcher.Translation.MethodT.MethodMaker; +import com.antik.DexPatcher.Translation.antik.PairipClass; + +import org.jf.dexlib2.AccessFlags; +import org.jf.dexlib2.iface.ClassDef; +import org.jf.dexlib2.iface.Method; +import org.jf.dexlib2.immutable.ImmutableClassDef; +import org.jf.dexlib2.immutable.ImmutableField; +import org.jf.dexlib2.immutable.value.ImmutableBooleanEncodedValue; + +import java.util.ArrayList; +import java.util.List; + +public class TranslationRewriter { + private final TranslationData data; + + public TranslationRewriter(TranslationData data) { + this.data = data; + } + + public ClassDef rewrite(ClassDef cd) { + String type = cd.getType(); + + if (PairipClass.APPLICATION.type.equals(type)) { + return patchApplication(cd); + } else if (PairipClass.STARTUP_LAUNCHER.type.equals(type)) { + return patchStartupLauncher(cd); + } else if (PairipClass.VM_RUNNER.type.equals(type)) { + return patchVMRunner(cd); + } else if (PairipClass.LICENSE_CLIENT_V3.type.equals(type)) { + return patchLicenseClient(cd); + } + + return cd; + } + + private ClassDef patchApplication(ClassDef cd) { + List methods = new ArrayList<>(); + for (Method m : cd.getMethods()) { + if ("".equals(m.getName())) { + methods.add(MethodMaker.createCleanConstructor(m, cd.getSuperclass())); + } + } + methods.add(MethodMaker.createClinit()); + return new ImmutableClassDef(cd.getType(), cd.getAccessFlags(), cd.getSuperclass(), cd.getInterfaces(), cd.getSourceFile(), cd.getAnnotations(), cd.getStaticFields(), cd.getInstanceFields(), methods, null); + } + + private ClassDef patchVMRunner(ClassDef cd) { + List methods = new ArrayList<>(); + methods.add(MethodMaker.createPrivateConstructor(cd.getType(), cd.getSuperclass())); + + for (Method m : cd.getMethods()) { + if ("invoke".equals(m.getName())) { + methods.add(MethodMaker.createReturnNull(m)); + } + } + return new ImmutableClassDef(cd.getType(), AccessFlags.PUBLIC.getValue(), cd.getSuperclass(), cd.getInterfaces(), cd.getSourceFile(), null, null, null, methods, null); + } + + private ClassDef patchLicenseClient(ClassDef cd) { + List methods = new ArrayList<>(); + for (Method m : cd.getMethods()) { + if ("".equals(m.getName())) { + methods.add(MethodMaker.createCleanConstructor(m, cd.getSuperclass())); + } else if ("onActivityCreate".equals(m.getName())) { + methods.add(MethodMaker.createReturnVoid(m)); + } + } + return new ImmutableClassDef(cd.getType(), cd.getAccessFlags(), cd.getSuperclass(), cd.getInterfaces(), cd.getSourceFile(), cd.getAnnotations(), cd.getStaticFields(), cd.getInstanceFields(), methods, null); + } + + private ClassDef patchStartupLauncher(ClassDef cd) { + List methods = new ArrayList<>(); + for (Method m : cd.getMethods()) { + if ("".equals(m.getName())) { + methods.add(m); + } + } + methods.add(MethodMaker.createLaunch(data.hasMethods)); + methods.add(MethodMaker.createRestoreString(data)); + if (data.hasMethods) { + methods.add(MethodMaker.createRestoreMethod(data)); + } + + List fields = new ArrayList<>(); + fields.add(new ImmutableField(cd.getType(), "launchCalled", "Z", AccessFlags.STATIC.getValue() | AccessFlags.PRIVATE.getValue(), ImmutableBooleanEncodedValue.FALSE_VALUE, null, null)); + + return new ImmutableClassDef(cd.getType(), cd.getAccessFlags(), cd.getSuperclass(), cd.getInterfaces(), cd.getSourceFile(), cd.getAnnotations(), fields, cd.getInstanceFields(), methods, null); + } +} diff --git a/antik/src/main/java/com/antik/DexPatcher/Translation/antik/PairipClass.java b/antik/src/main/java/com/antik/DexPatcher/Translation/antik/PairipClass.java new file mode 100644 index 0000000..3d7f154 --- /dev/null +++ b/antik/src/main/java/com/antik/DexPatcher/Translation/antik/PairipClass.java @@ -0,0 +1,21 @@ +package com.antik.DexPatcher.Translation.antik; + +public enum PairipClass { + VM_RUNNER("Lcom/pairip/VMRunner;"), + APPLICATION("Lcom/pairip/application/Application;"), + STARTUP_LAUNCHER("Lcom/pairip/StartupLauncher;"), + LICENSE_CLIENT_V3("Lcom/pairip/licensecheck3/LicenseClientV3;"); + + public final String type; + + PairipClass(String type) { + this.type = type; + } + + public static boolean contains(String type) { + for (PairipClass pc : values()) { + if (pc.type.equals(type)) return true; + } + return false; + } +} diff --git a/antik/src/main/java/com/antik/Main.java b/antik/src/main/java/com/antik/Main.java index f1e312e..0f10645 100644 --- a/antik/src/main/java/com/antik/Main.java +++ b/antik/src/main/java/com/antik/Main.java @@ -1,157 +1,158 @@ package com.antik; import com.antik.DexPatcher.DexPatcher; +import com.antik.DexPatcher.Translation.TranslationPatcher; import com.antik.crc32.crc32; import com.antik.manifest.manifestP; import com.antik.ui.*; import com.antik.utils.*; import com.reandroid.apk.ApkBundle; import com.reandroid.apk.ApkModule; +import com.reandroid.archive.WriteProgress; import java.io.*; import java.nio.file.Files; -/* - * Created by aantik - * 3/20/2026 6:20 PM - * - * ⋆ ႔ ႔ - * ᠸ^ ^ ⸝⸝ - * |、˜〵 - * じしˍ,)⁐̤ᐷ - * - * Fox Mode 🍺 - */ - -/** - * - * @life is butterfly flyfly - * I am a professional Android Developer - * - */ - public class Main { - public static void main(String[] a) { + public static void main(String[] args) { - if (a.length < 2 || !"-i".equals(a[0])) - { + if (args.length < 2) { help.help(); return; } - String P_ta = a[1]; - File I_pa = new File(P_ta); + String inputPath = null; + String translatePath = null; - if (!I_pa.exists()) { - System.err.println("Input file not found : " + P_ta); + for (int i = 0; i < args.length; i++) { + if ("-i".equals(args[i]) && i + 1 < args.length) { + inputPath = args[i + 1]; + } else if ("-t".equals(args[i]) && i + 1 < args.length) { + translatePath = args[i + 1]; + } + } + + if (inputPath == null) { + help.help(); + return; + } + + File inputApk = new File(inputPath); + + if (!inputApk.exists()) { + System.err.println("Input file not found: " + inputPath); return; } banner.banner(); - File T_Dir = null; + File tempDir = null; try { + ApkModule module; + File mergedApkFile; - T_Dir = Files.createTempDirectory("antik_merge").toFile(); - - - System.out.println("[MERGE] Extracting APKs..."); - AntikUtils.ex_apks(I_pa, T_Dir); - - System.out.println("[MERGE] Merging APK..."); - ApkBundle bd = new ApkBundle(); - bd.loadApkDirectory(T_Dir); - - - ApkModule Sp_T = bd.mergeModules(); - - - System.out.println("[INFO] Patching AndroidManifest.xml"); - - try { - manifestP.patch(Sp_T); - } catch (Exception e) { - System.err.println("[ERROR] Manifest patching failed: " + e.getMessage()); - e.printStackTrace(); - } - - - - String o = I_pa.getName(); - - int d = o.lastIndexOf('.'); - - if (d > 0) { - o = o.substring(0, d) + "_merged.apk"; + if (inputPath.endsWith(".apk")) { + System.out.println("[INFO] Loading APK..."); + module = ApkModule.loadApkFile(inputApk); + mergedApkFile = inputApk; } else { - o = o + "_merged.apk"; - } + tempDir = Files.createTempDirectory("antik_merge").toFile(); + System.out.println("[MERGE] Extracting APKS..."); + AntikUtils.ex_apks(inputApk, tempDir); + System.out.println("[MERGE] Merging APK..."); + ApkBundle bundle = new ApkBundle(); + bundle.loadApkDirectory(tempDir); + module = bundle.mergeModules(); - File o_f = new File(output.get_out(I_pa, o)); - - int T_tl = Sp_T.getZipEntryMap().size(); - - if (Sp_T.hasTableBlock()) { - T_tl = T_tl - 1; - } - - int[] c = {0}; - final int T_l = T_tl; - Sp_T.writeApk(o_f, new com.reandroid.archive.WriteProgress() { - @Override - public void onCompressFile(String p, int m, long w) { - c[0]++; - loading.progress(c[0], T_l); + System.out.println("[INFO] Patching AndroidManifest.xml"); + try { + manifestP.patch(module); + } catch (Exception e) { + System.err.println("[ERROR] Manifest patching failed: " + e.getMessage()); } - }); - loading.progress(T_l, T_l); + String name = inputApk.getName(); + int dot = name.lastIndexOf('.'); + name = (dot > 0 ? name.substring(0, dot) : name) + "_merged.apk"; + mergedApkFile = new File(output.get_out(inputApk, name)); - System.out.println(); - System.out.println("[MERGE] APK merged successfully.."); - - String pkg = "unknown"; - try { - pkg = Sp_T.getPackageName(); - System.out.println("[INFO] Package Name: " + pkg); - } catch (Exception ignored) {} - - String p_n = I_pa.getName(); - int d2 = p_n.lastIndexOf('.'); - if (d2 > 0) { - p_n = p_n.substring(0, d2) + "_pairip.apk"; - } else { - p_n = p_n + "_pairip.apk"; - } - File Pai_Dir = new File(output.get_out(I_pa, p_n)); - - System.out.println("[INFO] Patching classes.dex"); - try { - DexPatcher.patch(Sp_T); - } catch (Exception e) { - System.err.println("[ERROR] Patching failed: " + e.getMessage()); + System.out.println("[BUILD] Writing merged APK..."); + writeWithProgress(module, mergedApkFile); + System.out.println("\n[MERGE] APK merged successfully: " + mergedApkFile.getAbsolutePath()); } - System.out.println("[BUILD] Building APK..."); - Sp_T.writeApk(Pai_Dir); - crc32.patch(o_f, Pai_Dir); + if (translatePath != null) { + File jsonFile = new File(translatePath); + if (jsonFile.exists()) { + System.out.println("[INFO] Starting Translation Patch..."); + TranslationPatcher.patch(module, jsonFile); + + String tn = mergedApkFile.getName(); + int td = tn.lastIndexOf('.'); + tn = (td > 0 ? tn.substring(0, td) : tn) + "_translated.apk"; + File transFile = new File(output.get_out(inputApk, tn)); + + System.out.println("[BUILD] Building Translated APK..."); + writeSilently(module, transFile); + System.out.println("[BUILD] Translated APK built at: " + transFile.getAbsolutePath()); + } else { + System.err.println("[ERROR] Translation file not found: " + translatePath); + } + } else if (!inputPath.endsWith(".apk")) { + // Default logging patch only if merging and no translation requested + System.out.println("[INFO] Patching classes.dex for logging..."); + try { + DexPatcher.patch(module); + } catch (Exception e) { + System.err.println("[ERROR] Patching failed: " + e.getMessage()); + } + + String pn = mergedApkFile.getName(); + int pd = pn.lastIndexOf('.'); + pn = (pd > 0 ? pn.substring(0, pd) : pn) + "_pairip.apk"; + File paiFile = new File(output.get_out(inputApk, pn)); + + System.out.println("[BUILD] Building Logging APK..."); + writeSilently(module, paiFile); + crc32.patch(mergedApkFile, paiFile); + System.out.println("[BUILD] Logging APK built at: " + paiFile.getAbsolutePath()); + } - System.out.println("[BUILD] APK built successfully at " + Pai_Dir.getAbsolutePath()); System.out.println("[BUILD] Process completed"); - System.out.println("--------------------------------------"); - System.out.println("⚠️ DO NOT use the pairip app (" + Pai_Dir.getAbsolutePath() + ") for translation."); - System.out.println("It is incomplete and intended for logging only."); - System.out.println("Please use the merged app instead (" + o_f.getAbsolutePath() + ")."); - System.out.println("--------------------------------------"); - } catch (Exception e) { - System.err.println("[ERROR] Merge failed: " + e.getMessage()); + System.err.println("[ERROR] Process failed: " + e.getMessage()); + e.printStackTrace(); } finally { - if (T_Dir != null) { - deleteDir.del_dir(T_Dir); + if (tempDir != null) { + deleteDir.del_dir(tempDir); } } } -} + + private static void writeWithProgress(ApkModule module, File file) throws IOException { + int total = module.getZipEntryMap().size(); + if (module.hasTableBlock()) { + total--; + } + int[] count = {0}; + final int finalTotal = total; + module.writeApk(file, new WriteProgress() { + @Override + public void onCompressFile(String path, int method, long length) { + count[0]++; + loading.progress(count[0], finalTotal); + } + }); + loading.progress(finalTotal, finalTotal); + } + + private static void writeSilently(ApkModule module, File file) throws IOException { + module.writeApk(file, new WriteProgress() { + @Override + public void onCompressFile(String path, int method, long length) { + } + }); + } +} diff --git a/antik/src/main/java/com/antik/Opcode.java b/antik/src/main/java/com/antik/Opcode.java new file mode 100644 index 0000000..7138f18 --- /dev/null +++ b/antik/src/main/java/com/antik/Opcode.java @@ -0,0 +1,289 @@ +package com.antik; + + +import com.google.common.collect.ImmutableRangeMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Range; +import com.google.common.collect.RangeMap; + +import org.jf.dexlib2.Format; +import org.jf.dexlib2.ReferenceType; + +import javax.annotation.Nonnull; +import java.util.List; + +public enum Opcode { + /* NOP(0x00, "nop", ReferenceType.NONE, Format.Format10x, org.jf.dexlib2.Opcode.CAN_CONTINUE), + MOVE(0x01, "move", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MOVE_FROM16(0x02, "move/from16", ReferenceType.NONE, Format.Format22x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MOVE_16(0x03, "move/16", ReferenceType.NONE, Format.Format32x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MOVE_WIDE(0x04, "move-wide", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + MOVE_WIDE_FROM16(0x05, "move-wide/from16", ReferenceType.NONE, Format.Format22x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + MOVE_WIDE_16(0x06, "move-wide/16", ReferenceType.NONE, Format.Format32x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + MOVE_OBJECT(0x07, "move-object", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MOVE_OBJECT_FROM16(0x08, "move-object/from16", ReferenceType.NONE, Format.Format22x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MOVE_OBJECT_16(0x09, "move-object/16", ReferenceType.NONE, Format.Format32x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MOVE_RESULT(0x0a, "move-result", ReferenceType.NONE, Format.Format11x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MOVE_RESULT_WIDE(0x0b, "move-result-wide", ReferenceType.NONE, Format.Format11x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + MOVE_RESULT_OBJECT(0x0c, "move-result-object", ReferenceType.NONE, Format.Format11x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MOVE_EXCEPTION(0x0d, "move-exception", ReferenceType.NONE, Format.Format11x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + RETURN_VOID(0x0e, "return-void", ReferenceType.NONE, Format.Format10x), + RETURN(0x0f, "return", ReferenceType.NONE, Format.Format11x), + RETURN_WIDE(0x10, "return-wide", ReferenceType.NONE, Format.Format11x), + RETURN_OBJECT(0x11, "return-object", ReferenceType.NONE, Format.Format11x), + CONST_4(0x12, "const/4", ReferenceType.NONE, Format.Format11n, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + CONST_16(0x13, "const/16", ReferenceType.NONE, Format.Format21s, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + CONST(0x14, "const", ReferenceType.NONE, Format.Format31i, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + CONST_HIGH16(0x15, "const/high16", ReferenceType.NONE, Format.Format21ih, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + CONST_WIDE_16(0x16, "const-wide/16", ReferenceType.NONE, Format.Format21s, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + CONST_WIDE_32(0x17, "const-wide/32", ReferenceType.NONE, Format.Format31i, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + CONST_WIDE(0x18, "const-wide", ReferenceType.NONE, Format.Format51l, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + CONST_WIDE_HIGH16(0x19, "const-wide/high16", ReferenceType.NONE, Format.Format21lh, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + CONST_STRING(0x1a, "const-string", ReferenceType.STRING, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + CONST_STRING_JUMBO(0x1b, "const-string/jumbo", ReferenceType.STRING, Format.Format31c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + CONST_CLASS(0x1c, "const-class", ReferenceType.TYPE, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MONITOR_ENTER(0x1d, "monitor-enter", ReferenceType.NONE, Format.Format11x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + MONITOR_EXIT(0x1e, "monitor-exit", ReferenceType.NONE, Format.Format11x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + CHECK_CAST(0x1f, "check-cast", ReferenceType.TYPE, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + INSTANCE_OF(0x20, "instance-of", ReferenceType.TYPE, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + ARRAY_LENGTH(0x21, "array-length", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + NEW_INSTANCE(0x22, "new-instance", ReferenceType.TYPE, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + NEW_ARRAY(0x23, "new-array", ReferenceType.TYPE, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + FILLED_NEW_ARRAY(0x24, "filled-new-array", ReferenceType.TYPE, Format.Format35c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + FILLED_NEW_ARRAY_RANGE(0x25, "filled-new-array/range", ReferenceType.TYPE, Format.Format3rc, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + FILL_ARRAY_DATA(0x26, "fill-array-data", ReferenceType.NONE, Format.Format31t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + THROW(0x27, "throw", ReferenceType.NONE, Format.Format11x, org.jf.dexlib2.Opcode.CAN_THROW), + GOTO(0x28, "goto", ReferenceType.NONE, Format.Format10t), + GOTO_16(0x29, "goto/16", ReferenceType.NONE, Format.Format20t), + GOTO_32(0x2a, "goto/32", ReferenceType.NONE, Format.Format30t), + PACKED_SWITCH(0x2b, "packed-switch", ReferenceType.NONE, Format.Format31t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + SPARSE_SWITCH(0x2c, "sparse-switch", ReferenceType.NONE, Format.Format31t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + CMPL_FLOAT(0x2d, "cmpl-float", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + CMPG_FLOAT(0x2e, "cmpg-float", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + CMPL_DOUBLE(0x2f, "cmpl-double", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + CMPG_DOUBLE(0x30, "cmpg-double", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + CMP_LONG(0x31, "cmp-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IF_EQ(0x32, "if-eq", ReferenceType.NONE, Format.Format22t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + IF_NE(0x33, "if-ne", ReferenceType.NONE, Format.Format22t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + IF_LT(0x34, "if-lt", ReferenceType.NONE, Format.Format22t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + IF_GE(0x35, "if-ge", ReferenceType.NONE, Format.Format22t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + IF_GT(0x36, "if-gt", ReferenceType.NONE, Format.Format22t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + IF_LE(0x37, "if-le", ReferenceType.NONE, Format.Format22t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + IF_EQZ(0x38, "if-eqz", ReferenceType.NONE, Format.Format21t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + IF_NEZ(0x39, "if-nez", ReferenceType.NONE, Format.Format21t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + IF_LTZ(0x3a, "if-ltz", ReferenceType.NONE, Format.Format21t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + IF_GEZ(0x3b, "if-gez", ReferenceType.NONE, Format.Format21t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + IF_GTZ(0x3c, "if-gtz", ReferenceType.NONE, Format.Format21t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + IF_LEZ(0x3d, "if-lez", ReferenceType.NONE, Format.Format21t, org.jf.dexlib2.Opcode.CAN_CONTINUE), + AGET(0x44, "aget", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + AGET_WIDE(0x45, "aget-wide", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + AGET_OBJECT(0x46, "aget-object", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + AGET_BOOLEAN(0x47, "aget-boolean", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + AGET_BYTE(0x48, "aget-byte", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + AGET_CHAR(0x49, "aget-char", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + AGET_SHORT(0x4a, "aget-short", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + APUT(0x4b, "aput", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + APUT_WIDE(0x4c, "aput-wide", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + APUT_OBJECT(0x4d, "aput-object", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + APUT_BOOLEAN(0x4e, "aput-boolean", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + APUT_BYTE(0x4f, "aput-byte", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + APUT_CHAR(0x50, "aput-char", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + APUT_SHORT(0x51, "aput-short", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + IGET(0x52, "iget", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IGET_WIDE(0x53, "iget-wide", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + IGET_OBJECT(0x54, "iget-object", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IGET_BOOLEAN(0x55, "iget-boolean", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IGET_BYTE(0x56, "iget-byte", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IGET_CHAR(0x57, "iget-char", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IGET_SHORT(0x58, "iget-short", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IPUT(0x59, "iput", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + IPUT_WIDE(0x5a, "iput-wide", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + IPUT_OBJECT(0x5b, "iput-object", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + IPUT_BOOLEAN(0x5c, "iput-boolean", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + IPUT_BYTE(0x5d, "iput-byte", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + IPUT_CHAR(0x5e, "iput-char", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + IPUT_SHORT(0x5f, "iput-short", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + SGET(0x60, "sget", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SGET_WIDE(0x61, "sget-wide", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SGET_OBJECT(0x62, "sget-object", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SGET_BOOLEAN(0x63, "sget-boolean", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SGET_BYTE(0x64, "sget-byte", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SGET_CHAR(0x65, "sget-char", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SGET_SHORT(0x66, "sget-short", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SPUT(0x67, "sput", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SPUT_WIDE(0x68, "sput-wide", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SPUT_OBJECT(0x69, "sput-object", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SPUT_BOOLEAN(0x6a, "sput-boolean", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SPUT_BYTE(0x6b, "sput-byte", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SPUT_CHAR(0x6c, "sput-char", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SPUT_SHORT(0x6d, "sput-short", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + INVOKE_VIRTUAL(0x6e, "invoke-virtual", ReferenceType.METHOD, Format.Format35c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_SUPER(0x6f, "invoke-super", ReferenceType.METHOD, Format.Format35c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_DIRECT(0x70, "invoke-direct", ReferenceType.METHOD, Format.Format35c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT | org.jf.dexlib2.Opcode.CAN_INITIALIZE_REFERENCE), + INVOKE_STATIC(0x71, "invoke-static", ReferenceType.METHOD, Format.Format35c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_INTERFACE(0x72, "invoke-interface", ReferenceType.METHOD, Format.Format35c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_VIRTUAL_RANGE(0x74, "invoke-virtual/range", ReferenceType.METHOD, Format.Format3rc, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_SUPER_RANGE(0x75, "invoke-super/range", ReferenceType.METHOD, Format.Format3rc, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_DIRECT_RANGE(0x76, "invoke-direct/range", ReferenceType.METHOD, Format.Format3rc, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT | org.jf.dexlib2.Opcode.CAN_INITIALIZE_REFERENCE), + INVOKE_STATIC_RANGE(0x77, "invoke-static/range", ReferenceType.METHOD, Format.Format3rc, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_INTERFACE_RANGE(0x78, "invoke-interface/range", ReferenceType.METHOD, Format.Format3rc, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + NEG_INT(0x7b, "neg-int", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + NOT_INT(0x7c, "not-int", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + NEG_LONG(0x7d, "neg-long", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + NOT_LONG(0x7e, "not-long", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + NEG_FLOAT(0x7f, "neg-float", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + NEG_DOUBLE(0x80, "neg-double", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + INT_TO_LONG(0x81, "int-to-long", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + INT_TO_FLOAT(0x82, "int-to-float", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + INT_TO_DOUBLE(0x83, "int-to-double", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + LONG_TO_INT(0x84, "long-to-int", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + LONG_TO_FLOAT(0x85, "long-to-float", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + LONG_TO_DOUBLE(0x86, "long-to-double", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + FLOAT_TO_INT(0x87, "float-to-int", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + FLOAT_TO_LONG(0x88, "float-to-long", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + FLOAT_TO_DOUBLE(0x89, "float-to-double", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + DOUBLE_TO_INT(0x8a, "double-to-int", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + DOUBLE_TO_LONG(0x8b, "double-to-long", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + DOUBLE_TO_FLOAT(0x8c, "double-to-float", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + INT_TO_BYTE(0x8d, "int-to-byte", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + INT_TO_CHAR(0x8e, "int-to-char", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + INT_TO_SHORT(0x8f, "int-to-short", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + ADD_INT(0x90, "add-int", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + SUB_INT(0x91, "sub-int", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MUL_INT(0x92, "mul-int", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + DIV_INT(0x93, "div-int", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + REM_INT(0x94, "rem-int", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + AND_INT(0x95, "and-int", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + OR_INT(0x96, "or-int", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + XOR_INT(0x97, "xor-int", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + SHL_INT(0x98, "shl-int", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + SHR_INT(0x99, "shr-int", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + USHR_INT(0x9a, "ushr-int", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + ADD_LONG(0x9b, "add-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + SUB_LONG(0x9c, "sub-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + MUL_LONG(0x9d, "mul-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + DIV_LONG(0x9e, "div-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + REM_LONG(0x9f, "rem-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + AND_LONG(0xa0, "and-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + OR_LONG(0xa1, "or-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + XOR_LONG(0xa2, "xor-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + SHL_LONG(0xa3, "shl-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + SHR_LONG(0xa4, "shr-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + USHR_LONG(0xa5, "ushr-long", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + ADD_FLOAT(0xa6, "add-float", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + SUB_FLOAT(0xa7, "sub-float", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MUL_FLOAT(0xa8, "mul-float", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + DIV_FLOAT(0xa9, "div-float", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + REM_FLOAT(0xaa, "rem-float", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + ADD_DOUBLE(0xab, "add-double", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + SUB_DOUBLE(0xac, "sub-double", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + MUL_DOUBLE(0xad, "mul-double", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + DIV_DOUBLE(0xae, "div-double", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + REM_DOUBLE(0xaf, "rem-double", ReferenceType.NONE, Format.Format23x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + ADD_INT_2ADDR(0xb0, "add-int/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + SUB_INT_2ADDR(0xb1, "sub-int/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MUL_INT_2ADDR(0xb2, "mul-int/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + DIV_INT_2ADDR(0xb3, "div-int/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + REM_INT_2ADDR(0xb4, "rem-int/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + AND_INT_2ADDR(0xb5, "and-int/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + OR_INT_2ADDR(0xb6, "or-int/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + XOR_INT_2ADDR(0xb7, "xor-int/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + SHL_INT_2ADDR(0xb8, "shl-int/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + SHR_INT_2ADDR(0xb9, "shr-int/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + USHR_INT_2ADDR(0xba, "ushr-int/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + ADD_LONG_2ADDR(0xbb, "add-long/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + SUB_LONG_2ADDR(0xbc, "sub-long/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + MUL_LONG_2ADDR(0xbd, "mul-long/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + DIV_LONG_2ADDR(0xbe, "div-long/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + REM_LONG_2ADDR(0xbf, "rem-long/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + AND_LONG_2ADDR(0xc0, "and-long/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + OR_LONG_2ADDR(0xc1, "or-long/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + XOR_LONG_2ADDR(0xc2, "xor-long/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + SHL_LONG_2ADDR(0xc3, "shl-long/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + SHR_LONG_2ADDR(0xc4, "shr-long/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + USHR_LONG_2ADDR(0xc5, "ushr-long/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + ADD_FLOAT_2ADDR(0xc6, "add-float/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + SUB_FLOAT_2ADDR(0xc7, "sub-float/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MUL_FLOAT_2ADDR(0xc8, "mul-float/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + DIV_FLOAT_2ADDR(0xc9, "div-float/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + REM_FLOAT_2ADDR(0xca, "rem-float/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + ADD_DOUBLE_2ADDR(0xcb, "add-double/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + SUB_DOUBLE_2ADDR(0xcc, "sub-double/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + MUL_DOUBLE_2ADDR(0xcd, "mul-double/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + DIV_DOUBLE_2ADDR(0xce, "div-double/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + REM_DOUBLE_2ADDR(0xcf, "rem-double/2addr", ReferenceType.NONE, Format.Format12x, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + ADD_INT_LIT16(0xd0, "add-int/lit16", ReferenceType.NONE, Format.Format22s, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + RSUB_INT(0xd1, "rsub-int", ReferenceType.NONE, Format.Format22s, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MUL_INT_LIT16(0xd2, "mul-int/lit16", ReferenceType.NONE, Format.Format22s, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + DIV_INT_LIT16(0xd3, "div-int/lit16", ReferenceType.NONE, Format.Format22s, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + REM_INT_LIT16(0xd4, "rem-int/lit16", ReferenceType.NONE, Format.Format22s, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + AND_INT_LIT16(0xd5, "and-int/lit16", ReferenceType.NONE, Format.Format22s, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + OR_INT_LIT16(0xd6, "or-int/lit16", ReferenceType.NONE, Format.Format22s, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + XOR_INT_LIT16(0xd7, "xor-int/lit16", ReferenceType.NONE, Format.Format22s, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + ADD_INT_LIT8(0xd8, "add-int/lit8", ReferenceType.NONE, Format.Format22b, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + RSUB_INT_LIT8(0xd9, "rsub-int/lit8", ReferenceType.NONE, Format.Format22b, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + MUL_INT_LIT8(0xda, "mul-int/lit8", ReferenceType.NONE, Format.Format22b, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + DIV_INT_LIT8(0xdb, "div-int/lit8", ReferenceType.NONE, Format.Format22b, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + REM_INT_LIT8(0xdc, "rem-int/lit8", ReferenceType.NONE, Format.Format22b, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + AND_INT_LIT8(0xdd, "and-int/lit8", ReferenceType.NONE, Format.Format22b, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + OR_INT_LIT8(0xde, "or-int/lit8", ReferenceType.NONE, Format.Format22b, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + XOR_INT_LIT8(0xdf, "xor-int/lit8", ReferenceType.NONE, Format.Format22b, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + SHL_INT_LIT8(0xe0, "shl-int/lit8", ReferenceType.NONE, Format.Format22b, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + SHR_INT_LIT8(0xe1, "shr-int/lit8", ReferenceType.NONE, Format.Format22b, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + USHR_INT_LIT8(0xe2, "ushr-int/lit8", ReferenceType.NONE, Format.Format22b, org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + + IGET_VOLATILE(firstApi(0xe3, 9), "iget-volatile", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IPUT_VOLATILE(firstApi(0xe4, 9), "iput-volatile", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + SGET_VOLATILE(firstApi(0xe5, 9), "sget-volatile", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SPUT_VOLATILE(firstApi(0xe6, 9), "sput-volatile", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + IGET_OBJECT_VOLATILE(firstApi(0xe7, 9), "iget-object-volatile", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IGET_WIDE_VOLATILE(firstApi(0xe8, 9), "iget-wide-volatile", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + IPUT_WIDE_VOLATILE(firstApi(0xe9, 9), "iput-wide-volatile", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + SGET_WIDE_VOLATILE(firstApi(0xea, 9), "sget-wide-volatile", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SPUT_WIDE_VOLATILE(firstApi(0xeb, 9), "sput-wide-volatile", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + + THROW_VERIFICATION_ERROR(firstApi(0xed, 5), "throw-verification-error", ReferenceType.NONE, Format.Format20bc, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW), + EXECUTE_INLINE(allApis(0xee), "execute-inline", ReferenceType.NONE, Format.Format35mi, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + EXECUTE_INLINE_RANGE(firstApi(0xef, 8), "execute-inline/range", ReferenceType.NONE, Format.Format3rmi, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_DIRECT_EMPTY(lastApi(0xf0, 13), "invoke-direct-empty", ReferenceType.METHOD, Format.Format35c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT | org.jf.dexlib2.Opcode.CAN_INITIALIZE_REFERENCE), + INVOKE_OBJECT_INIT_RANGE(firstApi(0xf0, 14), "invoke-object-init/range", ReferenceType.METHOD, Format.Format3rc, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT | org.jf.dexlib2.Opcode.CAN_INITIALIZE_REFERENCE), + RETURN_VOID_BARRIER(combine(firstApi(0xf1, 11), lastArtVersion(0x73, 59)), "return-void-barrier", ReferenceType.NONE, Format.Format10x, org.jf.dexlib2.Opcode.ODEX_ONLY), + RETURN_VOID_NO_BARRIER(firstArtVersion(0x73, 60), "return-void-no-barrier", ReferenceType.NONE, Format.Format10x, org.jf.dexlib2.Opcode.ODEX_ONLY), + IGET_QUICK(combine(allApis(0xf2), allArtVersions(0xe3)), "iget-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IGET_WIDE_QUICK(combine(allApis(0xf3), allArtVersions(0xe4)), "iget-wide-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.SETS_WIDE_REGISTER), + IGET_OBJECT_QUICK(combine(allApis(0xf4), allArtVersions(0xe5)), "iget-object-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IPUT_QUICK(combine(allApis(0xf5), allArtVersions(0xe6)), "iput-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + IPUT_WIDE_QUICK(combine(allApis(0xf6), allArtVersions(0xe7)), "iput-wide-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + IPUT_OBJECT_QUICK(combine(allApis(0xf7), allArtVersions(0xe8)), "iput-object-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + IPUT_BOOLEAN_QUICK(allArtVersions(0xeb), "iput-boolean-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR), + IPUT_BYTE_QUICK(allArtVersions(0xec), "iput-byte-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR), + IPUT_CHAR_QUICK(allArtVersions(0xed), "iput-char-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR), + IPUT_SHORT_QUICK(allArtVersions(0xee), "iput-short-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR), + IGET_BOOLEAN_QUICK(allArtVersions(0xef), "iget-boolean-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IGET_BYTE_QUICK(allArtVersions(0xf0), "iget-byte-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IGET_CHAR_QUICK(allArtVersions(0xf1), "iget-char-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + IGET_SHORT_QUICK(allArtVersions(0xf2), "iget-short-quick", ReferenceType.NONE, Format.Format22cs, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.QUICK_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + + INVOKE_VIRTUAL_QUICK(combine(allApis(0xf8), allArtVersions(0xe9)), "invoke-virtual-quick", ReferenceType.NONE, Format.Format35ms, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_VIRTUAL_QUICK_RANGE(combine(allApis(0xf9), allArtVersions(0xea)), "invoke-virtual-quick/range", ReferenceType.NONE, Format.Format3rms, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_SUPER_QUICK(lastApi(0xfa, 25), "invoke-super-quick", ReferenceType.NONE, Format.Format35ms, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_SUPER_QUICK_RANGE(lastApi(0xfb, 25), "invoke-super-quick/range", ReferenceType.NONE, Format.Format3rms, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + + IPUT_OBJECT_VOLATILE(firstApi(0xfc, 9), "iput-object-volatile", ReferenceType.FIELD, Format.Format22c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE), + SGET_OBJECT_VOLATILE(firstApi(0xfd, 9), "sget-object-volatile", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + SPUT_OBJECT_VOLATILE(betweenApi(0xfe, 9, 19), "sput-object-volatile", ReferenceType.FIELD, Format.Format21c, org.jf.dexlib2.Opcode.ODEX_ONLY | org.jf.dexlib2.Opcode.VOLATILE_FIELD_ACCESSOR | org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.STATIC_FIELD_ACCESSOR), + + PACKED_SWITCH_PAYLOAD(0x100, "packed-switch-payload", ReferenceType.NONE, Format.PackedSwitchPayload, 0), + SPARSE_SWITCH_PAYLOAD(0x200, "sparse-switch-payload", ReferenceType.NONE, Format.SparseSwitchPayload, 0), + ARRAY_PAYLOAD(0x300, "array-payload", ReferenceType.NONE, Format.ArrayPayload, 0), + + INVOKE_POLYMORPHIC(firstArtVersion(0xfa, 87), "invoke-polymorphic", ReferenceType.METHOD, ReferenceType.METHOD_PROTO, Format.Format45cc, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_POLYMORPHIC_RANGE(firstArtVersion(0xfb, 87), "invoke-polymorphic/range", ReferenceType.METHOD, ReferenceType.METHOD_PROTO, Format.Format4rcc, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + + INVOKE_CUSTOM(firstArtVersion(0xfc, 111), "invoke-custom", ReferenceType.CALL_SITE, Format.Format35c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + INVOKE_CUSTOM_RANGE(firstArtVersion(0xfd, 111), "invoke-custom/range", ReferenceType.CALL_SITE, Format.Format3rc, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_RESULT), + + CONST_METHOD_HANDLE(firstArtVersion(0xfe, 134), "const-method-handle", ReferenceType.METHOD_HANDLE, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER), + CONST_METHOD_TYPE(firstArtVersion(0xff, 134), "const-method-type", ReferenceType.METHOD_PROTO, Format.Format21c, org.jf.dexlib2.Opcode.CAN_THROW | org.jf.dexlib2.Opcode.CAN_CONTINUE | org.jf.dexlib2.Opcode.SETS_REGISTER); +}*/ +} diff --git a/antik/src/main/java/com/antik/ui/help.java b/antik/src/main/java/com/antik/ui/help.java index 767ca00..b5f437b 100644 --- a/antik/src/main/java/com/antik/ui/help.java +++ b/antik/src/main/java/com/antik/ui/help.java @@ -3,6 +3,7 @@ package com.antik.ui; public class help { public static void help() { - System.out.println("java -jar antik.jar -i "); + System.out.println("java -jar RePairip.jar -i "); + System.out.println("java -jar RePairip.jar -i -t "); } } diff --git a/build.gradle.kts b/build.gradle.kts index 4f298e6..c5f6068 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,2 +1,2 @@ -plugins { -} +plugins { +} diff --git a/gradle.properties b/gradle.properties index 73cc41b..d52ef4e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,17 +1,17 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. For more details, visit -# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects -# org.gradle.parallel=true -# When enabled, the Configuration Cache allows Gradle to skip the configuration -# phase entirely if nothing that affects the build configuration (such as build scripts) -# has changed. Additionally, Gradle applies performance optimizations to task execution. +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. For more details, visit +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects +# org.gradle.parallel=true +# When enabled, the Configuration Cache allows Gradle to skip the configuration +# phase entirely if nothing that affects the build configuration (such as build scripts) +# has changed. Additionally, Gradle applies performance optimizations to task execution. org.gradle.configuration-cache=true \ No newline at end of file diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties index 6c1139e..1291126 100644 --- a/gradle/gradle-daemon-jvm.properties +++ b/gradle/gradle-daemon-jvm.properties @@ -1,12 +1,12 @@ -#This file is generated by updateDaemonJvm -toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect -toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect -toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect -toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect -toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/73bcfb608d1fde9fb62e462f834a3299/redirect -toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/846ee0d876d26a26f37aa1ce8de73224/redirect -toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect -toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect -toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/9482ddec596298c84656d31d16652665/redirect -toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/39701d92e1756bb2f141eb67cd4c660e/redirect -toolchainVersion=21 +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/73bcfb608d1fde9fb62e462f834a3299/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/846ee0d876d26a26f37aa1ce8de73224/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/9482ddec596298c84656d31d16652665/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/39701d92e1756bb2f141eb67cd4c660e/redirect +toolchainVersion=21 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c730470..87bc765 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,15 +1,15 @@ -[versions] -junit = "4.13.2" -dexlib2 = "2.5.2" -reandroid-arsclib = "V1.3.8" -guava = "33.2.1-jre" -shadow = "8.3.5" - -[libraries] -junit = { group = "junit", name = "junit", version.ref = "junit" } -dexlib2 = { group = "org.smali", name = "dexlib2", version.ref = "dexlib2" } -reandroid-arsclib = { group = "com.github.REAndroid", name = "ARSCLib", version.ref = "reandroid-arsclib" } -guava = { group = "com.google.guava", name = "guava", version.ref = "guava" } - -[plugins] -shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } +[versions] +junit = "4.13.2" +dexlib2 = "2.5.2" +reandroid-arsclib = "V1.3.8" +guava = "33.2.1-jre" +shadow = "8.3.5" + +[libraries] +junit = { group = "junit", name = "junit", version.ref = "junit" } +dexlib2 = { group = "org.smali", name = "dexlib2", version.ref = "dexlib2" } +reandroid-arsclib = { group = "com.github.REAndroid", name = "ARSCLib", version.ref = "reandroid-arsclib" } +guava = { group = "com.google.guava", name = "guava", version.ref = "guava" } + +[plugins] +shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } diff --git a/gradlew b/gradlew index ef07e01..c026f59 100644 --- a/gradlew +++ b/gradlew @@ -1,251 +1,251 @@ -#!/bin/sh - -# -# Copyright © 2015 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH="\\\"\\\"" - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/settings.gradle.kts b/settings.gradle.kts index 1479afd..f4d1e17 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,28 +1,28 @@ -pluginManagement { - repositories { - google { - content { - includeGroupByRegex("com\\.android.*") - includeGroupByRegex("com\\.google.*") - includeGroupByRegex("androidx.*") - } - } - mavenCentral() - gradlePluginPortal() - } -} -plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" -} -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { - google() - mavenCentral() - maven { url = uri("https://jitpack.io") } - } -} - -rootProject.name = "RePairip" -include(":antik") - +pluginManagement { + repositories { + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } + mavenCentral() + gradlePluginPortal() + } +} +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven { url = uri("https://jitpack.io") } + } +} + +rootProject.name = "RePairip" +include(":antik") +