private Opcode getInvokeOp(int classAccessFlags, int methodAccessFlags, boolean isRange) { Opcode invokeOp; boolean isInterface = Modifier.isInterface(classAccessFlags); if (isInterface) { invokeOp = isRange ? Opcode.INVOKE_INTERFACE_RANGE : Opcode.INVOKE_INTERFACE; return invokeOp; } boolean isStatic = Modifier.isStatic(methodAccessFlags); boolean isPrivate = Modifier.isPrivate(methodAccessFlags); boolean isConstructor = (methodAccessFlags & AccessFlags.CONSTRUCTOR.getValue()) != 0; if (isStatic) { invokeOp = isRange ? Opcode.INVOKE_STATIC_RANGE : Opcode.INVOKE_STATIC; } else if (isPrivate || isConstructor) { invokeOp = isRange ? Opcode.INVOKE_DIRECT_RANGE : Opcode.INVOKE_DIRECT; } else { invokeOp = isRange ? Opcode.INVOKE_VIRTUAL_RANGE : Opcode.INVOKE_VIRTUAL; } return invokeOp; }
private static void writeAccessFlags(IndentingWriter writer, int accessFlags) throws IOException { for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForMethod(accessFlags)) { writer.write(accessFlag.toString()); writer.write(' '); } }
value |= AccessFlags.getAccessFlag(ACCESS_SPEC15.getText()).getValue();
method_stack.peek().isStatic = AccessFlags.STATIC.isSet(accessFlags); method_stack.peek().methodParameterRegisters = MethodUtil.getParameterRegisterCount((method_name_and_prototype69!=null?((smaliTreeWalker.method_name_and_prototype_return)method_name_and_prototype69).parameters:null), method_stack.peek().isStatic); boolean isNative = false; if ((accessFlags & AccessFlags.ABSTRACT.getValue()) != 0) { isAbstract = true; } else if ((accessFlags & AccessFlags.NATIVE.getValue()) != 0) { isNative = true;
private static void writeAccessFlags(IndentingWriter writer, int accessFlags) throws IOException { for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForField(accessFlags)) { writer.write(accessFlag.toString()); writer.write(' '); } } }
private void writeAccessFlags(IndentingWriter writer) throws IOException { for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForClass(classDef.getAccessFlags())) { writer.write(accessFlag.toString()); writer.write(' '); } }
public static String formatAccessFlagsForField(int accessFlagValue) { return formatAccessFlags(getAccessFlagsForField(accessFlagValue)); }
public static String formatAccessFlagsForClass(int accessFlagValue) { return formatAccessFlags(getAccessFlagsForClass(accessFlagValue)); }
public static String formatAccessFlagsForMethod(int accessFlagValue) { return formatAccessFlags(getAccessFlagsForMethod(accessFlagValue)); }
private int annotateEncodedField(@Nonnull AnnotatedBytes out, @Nonnull RawDexFile dexFile, @Nonnull DexReader reader, int previousIndex) { // large values may be used for the index delta, which cause the cumulative index to overflow upon // addition, effectively allowing out of order entries. int indexDelta = reader.readLargeUleb128(); int fieldIndex = previousIndex + indexDelta; out.annotateTo(reader.getOffset(), "field_idx_diff = %d: %s", indexDelta, FieldIdItem.getReferenceAnnotation(dexFile, fieldIndex)); int accessFlags = reader.readSmallUleb128(); out.annotateTo(reader.getOffset(), "access_flags = 0x%x: %s", accessFlags, Joiner.on('|').join(AccessFlags.getAccessFlagsForField(accessFlags))); return fieldIndex; }
private static String formatAccessFlags(AccessFlags[] accessFlags) { int size = 0; for (AccessFlags accessFlag: accessFlags) { size += accessFlag.toString().length() + 1; } StringBuilder sb = new StringBuilder(size); for (AccessFlags accessFlag: accessFlags) { sb.append(accessFlag.toString()); sb.append(" "); } if (accessFlags.length > 0) { sb.delete(sb.length() - 1, sb.length()); } return sb.toString(); }
private int annotateEncodedMethod(@Nonnull AnnotatedBytes out, @Nonnull RawDexFile dexFile, @Nonnull DexReader reader, int previousIndex) { // large values may be used for the index delta, which cause the cumulative index to overflow upon // addition, effectively allowing out of order entries. int indexDelta = reader.readLargeUleb128(); int methodIndex = previousIndex + indexDelta; out.annotateTo(reader.getOffset(), "method_idx_diff = %d: %s", indexDelta, MethodIdItem.getReferenceAnnotation(dexFile, methodIndex)); int accessFlags = reader.readSmallUleb128(); out.annotateTo(reader.getOffset(), "access_flags = 0x%x: %s", accessFlags, Joiner.on('|').join(AccessFlags.getAccessFlagsForMethod(accessFlags))); int codeOffset = reader.readSmallUleb128(); if (codeOffset == 0) { out.annotateTo(reader.getOffset(), "code_off = code_item[NO_OFFSET]"); } else { out.annotateTo(reader.getOffset(), "code_off = code_item[0x%x]", codeOffset); addCodeItemIdentity(codeOffset, MethodIdItem.asString(dexFile, methodIndex)); } return methodIndex; }
Joiner.on('|').join(AccessFlags.getAccessFlagsForClass(accessFlags)));
@Test public void should_remove_final_modifier_from_the_given_class() throws IOException { ImmutableClassDef def = new ImmutableClassDef("Lfoo/Bar;", AccessFlags.FINAL.getValue(), "Ljava/lang/Object;", null, null, null, null, null); byte[] bytecode = DexPoolUtils.toBytecode(new ImmutableDexFile(Opcodes.getDefault(), Collections.singleton(def))); DexRewriter rewriter = new DexRewriter(new FinalModifierRemoverModule()); ClassDef out = rewriter.getClassDefRewriter() .rewrite(new DexBackedDexFile(null, bytecode) .getClasses() .iterator() .next()); assertFalse(AccessFlags.FINAL.isSet(out.getAccessFlags())); }
private static void writeAccessFlags(IndentingWriter writer, int accessFlags) throws IOException { for (AccessFlags accessFlag : AccessFlags.getAccessFlagsForField(accessFlags)) { writer.write(accessFlag.toString()); writer.write(' '); } } }
private void writeAccessFlags(IndentingWriter writer) throws IOException { for (AccessFlags accessFlag : AccessFlags.getAccessFlagsForClass(classDef.getAccessFlags())) { writer.write(accessFlag.toString()); writer.write(' '); } }
value |= AccessFlags.getAccessFlag(ACCESS_SPEC15.getText()).getValue();
public static String formatAccessFlagsForField(int accessFlagValue) { return formatAccessFlags(getAccessFlagsForField(accessFlagValue)); }
public static String formatAccessFlagsForClass(int accessFlagValue) { return formatAccessFlags(getAccessFlagsForClass(accessFlagValue)); }