org.jf.dexlib2.util.TypeUtils Java Examples

The following examples show how to use org.jf.dexlib2.util.TypeUtils. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: MethodAnalyzer.java    From ZjDroid with Apache License 2.0 5 votes vote down vote up
private void propagateParameterTypes(int parameterStartRegister) {
    int i=0;
    for (MethodParameter parameter: method.getParameters()) {
        if (TypeUtils.isWideType(parameter)) {
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getWideRegisterType(parameter, true));
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getWideRegisterType(parameter, false));
        } else {
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getRegisterType(classPath, parameter));
        }
    }
}
 
Example #2
Source File: MethodDefinition.java    From ZjDroid with Apache License 2.0 5 votes vote down vote up
private static void writeParameters(IndentingWriter writer, Method method,
                                    List<? extends MethodParameter> parameters,
                                    baksmaliOptions options) throws IOException {
    boolean isStatic = AccessFlags.STATIC.isSet(method.getAccessFlags());
    int registerNumber = isStatic?0:1;
    for (MethodParameter parameter: parameters) {
        String parameterType = parameter.getType();
        String parameterName = parameter.getName();
        Collection<? extends Annotation> annotations = parameter.getAnnotations();
        if (parameterName != null || annotations.size() != 0) {
            writer.write(".param p");
            writer.printSignedIntAsDec(registerNumber);

            if (parameterName != null && options.outputDebugInfo) {
                writer.write(", ");
                ReferenceFormatter.writeStringReference(writer, parameterName);
            }
            writer.write("    # ");
            writer.write(parameterType);
            writer.write("\n");
            if (annotations.size() > 0) {
                writer.indent(4);
                AnnotationFormatter.writeTo(writer, annotations);
                writer.deindent(4);
                writer.write(".end param\n");
            }
        }

        registerNumber++;
        if (TypeUtils.isWideType(parameterType)) {
            registerNumber++;
        }
    }
}
 
Example #3
Source File: MethodDefinition.java    From atlas with Apache License 2.0 5 votes vote down vote up
private static void writeParameters(IndentingWriter writer, Method method,
                                    List<? extends MethodParameter> parameters,
                                    BaksmaliOptions options) throws IOException {
    boolean isStatic = AccessFlags.STATIC.isSet(method.getAccessFlags());
    int registerNumber = isStatic ? 0 : 1;
    for (MethodParameter parameter : parameters) {
        String parameterType = parameter.getType();
        String parameterName = parameter.getName();
        Collection<? extends Annotation> annotations = parameter.getAnnotations();
        if (parameterName != null || annotations.size() != 0) {
            writer.write(".param p");
            writer.printSignedIntAsDec(registerNumber);

            if (parameterName != null && options.debugInfo) {
                writer.write(", ");
                ReferenceFormatter.writeStringReference(writer, parameterName);
            }
            writer.write("    # ");
            writer.write(parameterType);
            writer.write("\n");
            if (annotations.size() > 0) {
                writer.indent(4);

                String containingClass = null;
                if (options.implicitReferences) {
                    containingClass = method.getDefiningClass();
                }
                AnnotationFormatter.writeTo(writer, annotations, containingClass);
                writer.deindent(4);
                writer.write(".end param\n");
            }
        }

        registerNumber++;
        if (TypeUtils.isWideType(parameterType)) {
            registerNumber++;
        }
    }
}
 
Example #4
Source File: MethodAnalyzer.java    From zjdroid with Apache License 2.0 5 votes vote down vote up
private void propagateParameterTypes(int parameterStartRegister) {
    int i=0;
    for (MethodParameter parameter: method.getParameters()) {
        if (TypeUtils.isWideType(parameter)) {
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getWideRegisterType(parameter, true));
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getWideRegisterType(parameter, false));
        } else {
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getRegisterType(classPath, parameter));
        }
    }
}
 
Example #5
Source File: MethodDefinition.java    From zjdroid with Apache License 2.0 5 votes vote down vote up
private static void writeParameters(IndentingWriter writer, Method method,
                                    List<? extends MethodParameter> parameters,
                                    baksmaliOptions options) throws IOException {
    boolean isStatic = AccessFlags.STATIC.isSet(method.getAccessFlags());
    int registerNumber = isStatic?0:1;
    for (MethodParameter parameter: parameters) {
        String parameterType = parameter.getType();
        String parameterName = parameter.getName();
        Collection<? extends Annotation> annotations = parameter.getAnnotations();
        if (parameterName != null || annotations.size() != 0) {
            writer.write(".param p");
            writer.printSignedIntAsDec(registerNumber);

            if (parameterName != null && options.outputDebugInfo) {
                writer.write(", ");
                ReferenceFormatter.writeStringReference(writer, parameterName);
            }
            writer.write("    # ");
            writer.write(parameterType);
            writer.write("\n");
            if (annotations.size() > 0) {
                writer.indent(4);
                AnnotationFormatter.writeTo(writer, annotations);
                writer.deindent(4);
                writer.write(".end param\n");
            }
        }

        registerNumber++;
        if (TypeUtils.isWideType(parameterType)) {
            registerNumber++;
        }
    }
}
 
Example #6
Source File: MethodAnalyzer.java    From HeyGirl with Apache License 2.0 5 votes vote down vote up
private void propagateParameterTypes(int parameterStartRegister) {
    int i=0;
    for (MethodParameter parameter: method.getParameters()) {
        if (TypeUtils.isWideType(parameter)) {
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getWideRegisterType(parameter, true));
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getWideRegisterType(parameter, false));
        } else {
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getRegisterType(classPath, parameter));
        }
    }
}
 
Example #7
Source File: MethodDefinition.java    From HeyGirl with Apache License 2.0 5 votes vote down vote up
private static void writeParameters(IndentingWriter writer, Method method,
                                    List<? extends MethodParameter> parameters,
                                    baksmaliOptions options) throws IOException {
    boolean isStatic = AccessFlags.STATIC.isSet(method.getAccessFlags());
    int registerNumber = isStatic?0:1;
    for (MethodParameter parameter: parameters) {
        String parameterType = parameter.getType();
        String parameterName = parameter.getName();
        Collection<? extends Annotation> annotations = parameter.getAnnotations();
        if (parameterName != null || annotations.size() != 0) {
            writer.write(".param p");
            writer.printSignedIntAsDec(registerNumber);

            if (parameterName != null && options.outputDebugInfo) {
                writer.write(", ");
                ReferenceFormatter.writeStringReference(writer, parameterName);
            }
            writer.write("    # ");
            writer.write(parameterType);
            writer.write("\n");
            if (annotations.size() > 0) {
                writer.indent(4);
                AnnotationFormatter.writeTo(writer, annotations);
                writer.deindent(4);
                writer.write(".end param\n");
            }
        }

        registerNumber++;
        if (TypeUtils.isWideType(parameterType)) {
            registerNumber++;
        }
    }
}
 
Example #8
Source File: MethodAnalyzer.java    From ZjDroid with Apache License 2.0 5 votes vote down vote up
private void propagateParameterTypes(int parameterStartRegister) {
    int i=0;
    for (MethodParameter parameter: method.getParameters()) {
        if (TypeUtils.isWideType(parameter)) {
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getWideRegisterType(parameter, true));
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getWideRegisterType(parameter, false));
        } else {
            setPostRegisterTypeAndPropagateChanges(startOfMethod, parameterStartRegister + i++,
                    RegisterType.getRegisterType(classPath, parameter));
        }
    }
}
 
Example #9
Source File: MethodDefinition.java    From ZjDroid with Apache License 2.0 5 votes vote down vote up
private static void writeParameters(IndentingWriter writer, Method method,
                                    List<? extends MethodParameter> parameters,
                                    baksmaliOptions options) throws IOException {
    boolean isStatic = AccessFlags.STATIC.isSet(method.getAccessFlags());
    int registerNumber = isStatic?0:1;
    for (MethodParameter parameter: parameters) {
        String parameterType = parameter.getType();
        String parameterName = parameter.getName();
        Collection<? extends Annotation> annotations = parameter.getAnnotations();
        if (parameterName != null || annotations.size() != 0) {
            writer.write(".param p");
            writer.printSignedIntAsDec(registerNumber);

            if (parameterName != null && options.outputDebugInfo) {
                writer.write(", ");
                ReferenceFormatter.writeStringReference(writer, parameterName);
            }
            writer.write("    # ");
            writer.write(parameterType);
            writer.write("\n");
            if (annotations.size() > 0) {
                writer.indent(4);
                AnnotationFormatter.writeTo(writer, annotations);
                writer.deindent(4);
                writer.write(".end param\n");
            }
        }

        registerNumber++;
        if (TypeUtils.isWideType(parameterType)) {
            registerNumber++;
        }
    }
}
 
Example #10
Source File: MethodDefinition.java    From ZjDroid with Apache License 2.0 4 votes vote down vote up
public void writeTo(IndentingWriter writer) throws IOException {
    int parameterRegisterCount = 0;
    if (!AccessFlags.STATIC.isSet(method.getAccessFlags())) {
        parameterRegisterCount++;
    }

    writer.write(".method ");
    writeAccessFlags(writer, method.getAccessFlags());
    writer.write(method.getName());
    writer.write("(");
    for (MethodParameter parameter: methodParameters) {
        String type = parameter.getType();
        writer.write(type);
        parameterRegisterCount++;
        if (TypeUtils.isWideType(type)) {
            parameterRegisterCount++;
        }
    }
    writer.write(")");
    writer.write(method.getReturnType());
    writer.write('\n');

    writer.indent(4);
    if (classDef.options.useLocalsDirective) {
        writer.write(".locals ");
        writer.printSignedIntAsDec(methodImpl.getRegisterCount() - parameterRegisterCount);
    } else {
        writer.write(".registers ");
        writer.printSignedIntAsDec(methodImpl.getRegisterCount());
    }
    writer.write('\n');
    writeParameters(writer, method, methodParameters, classDef.options);

    if (registerFormatter == null) {
        registerFormatter = new RegisterFormatter(classDef.options, methodImpl.getRegisterCount(),
                parameterRegisterCount);
    }

    AnnotationFormatter.writeTo(writer, method.getAnnotations());

    writer.write('\n');

    List<MethodItem> methodItems = getMethodItems();
    for (MethodItem methodItem: methodItems) {
        if (methodItem.writeTo(writer)) {
            writer.write('\n');
        }
    }
    writer.deindent(4);
    writer.write(".end method\n");
}
 
Example #11
Source File: MethodDefinition.java    From atlas with Apache License 2.0 4 votes vote down vote up
public void writeTo(IndentingWriter writer) throws IOException {
    int parameterRegisterCount = 0;
    if (!AccessFlags.STATIC.isSet(method.getAccessFlags())) {
        parameterRegisterCount++;
    }

    writer.write(".method ");
    writeAccessFlags(writer, method.getAccessFlags());
    writer.write(method.getName());
    writer.write("(");
    for (MethodParameter parameter : methodParameters) {
        String type = parameter.getType();
        writer.write(type);
        parameterRegisterCount++;
        if (TypeUtils.isWideType(type)) {
            parameterRegisterCount++;
        }
    }
    writer.write(")");
    writer.write(method.getReturnType());
    writer.write('\n');

    writer.indent(4);
    if (classDef.options.localsDirective) {
        writer.write(".locals ");
        int registerCount = methodImpl.getRegisterCount() - parameterRegisterCount;
        writer.printSignedIntAsDec(registerCount);
    } else {
        writer.write(".registers ");
        writer.printSignedIntAsDec(methodImpl.getRegisterCount());
    }
    writer.write('\n');
    writeParameters(writer, method, methodParameters, classDef.options);

    if (registerFormatter == null) {
        registerFormatter = new RegisterFormatter(classDef.options, methodImpl.getRegisterCount(),
                parameterRegisterCount);
    }

    String containingClass = null;
    if (classDef.options.implicitReferences) {
        containingClass = method.getDefiningClass();
    }
    //如果是修改的方法,需要添加ReplaceAnnotation
    if (DexDiffInfo.modifiedMethods.contains(method)) {
        MethodReplaceAnnotation replaceAnnotation = new MethodReplaceAnnotation(method.getDefiningClass(), method.getName());
        AnnotationFormatter.writeTo(writer, method.getAnnotations(), containingClass, replaceAnnotation);
    } else {
        AnnotationFormatter.writeTo(writer, method.getAnnotations(), containingClass);
    }

    writer.write('\n');

    boolean first = true;
    boolean writeCheckCast = false;
    List<MethodItem> methodItems = getMethodItems();
    for (MethodItem methodItem : methodItems) {
        if (first) {
            first = false;
            if (!fullMethod && !(methodItem instanceof EndPrologueMethodItem) && !DexDiffInfo.addedClasses.contains(classDef.getClassDef())) {
                if (!AccessFlags.STATIC.isSet(method.getAccessFlags())) {
                    writer.write("check-cast p0, " + method.getDefiningClass());
                    writer.write('\n');
                    writeCheckCast = true;

                }
            }

        }
        if (methodItem.writeTo(writer)) {
            writer.write('\n');
        }

        if (!writeCheckCast && !fullMethod && !DexDiffInfo.addedClasses.contains(classDef.getClassDef())) {
            if (!AccessFlags.STATIC.isSet(method.getAccessFlags())) {
                if (methodItem instanceof EndPrologueMethodItem) {
                    writer.write("check-cast p0, " + method.getDefiningClass());
                    writer.write('\n');
                    writeCheckCast = true;
                }
            }


        }
    }
    writer.deindent(4);
    writer.write(".end method\n");
}
 
Example #12
Source File: MethodDefinition.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
public void writeTo(IndentingWriter writer) throws IOException {
    int parameterRegisterCount = 0;
    if (!AccessFlags.STATIC.isSet(method.getAccessFlags())) {
        parameterRegisterCount++;
    }

    writer.write(".method ");
    writeAccessFlags(writer, method.getAccessFlags());
    writer.write(method.getName());
    writer.write("(");
    for (MethodParameter parameter: methodParameters) {
        String type = parameter.getType();
        writer.write(type);
        parameterRegisterCount++;
        if (TypeUtils.isWideType(type)) {
            parameterRegisterCount++;
        }
    }
    writer.write(")");
    writer.write(method.getReturnType());
    writer.write('\n');

    writer.indent(4);
    if (classDef.options.useLocalsDirective) {
        writer.write(".locals ");
        writer.printSignedIntAsDec(methodImpl.getRegisterCount() - parameterRegisterCount);
    } else {
        writer.write(".registers ");
        writer.printSignedIntAsDec(methodImpl.getRegisterCount());
    }
    writer.write('\n');
    writeParameters(writer, method, methodParameters, classDef.options);

    if (registerFormatter == null) {
        registerFormatter = new RegisterFormatter(classDef.options, methodImpl.getRegisterCount(),
                parameterRegisterCount);
    }

    AnnotationFormatter.writeTo(writer, method.getAnnotations());

    writer.write('\n');

    List<MethodItem> methodItems = getMethodItems();
    for (MethodItem methodItem: methodItems) {
        if (methodItem.writeTo(writer)) {
            writer.write('\n');
        }
    }
    writer.deindent(4);
    writer.write(".end method\n");
}
 
Example #13
Source File: MethodDefinition.java    From HeyGirl with Apache License 2.0 4 votes vote down vote up
public void writeTo(IndentingWriter writer) throws IOException {
    int parameterRegisterCount = 0;
    if (!AccessFlags.STATIC.isSet(method.getAccessFlags())) {
        parameterRegisterCount++;
    }

    writer.write(".method ");
    writeAccessFlags(writer, method.getAccessFlags());
    writer.write(method.getName());
    writer.write("(");
    for (MethodParameter parameter: methodParameters) {
        String type = parameter.getType();
        writer.write(type);
        parameterRegisterCount++;
        if (TypeUtils.isWideType(type)) {
            parameterRegisterCount++;
        }
    }
    writer.write(")");
    writer.write(method.getReturnType());
    writer.write('\n');

    writer.indent(4);
    if (classDef.options.useLocalsDirective) {
        writer.write(".locals ");
        writer.printSignedIntAsDec(methodImpl.getRegisterCount() - parameterRegisterCount);
    } else {
        writer.write(".registers ");
        writer.printSignedIntAsDec(methodImpl.getRegisterCount());
    }
    writer.write('\n');
    writeParameters(writer, method, methodParameters, classDef.options);

    if (registerFormatter == null) {
        registerFormatter = new RegisterFormatter(classDef.options, methodImpl.getRegisterCount(),
                parameterRegisterCount);
    }

    AnnotationFormatter.writeTo(writer, method.getAnnotations());

    writer.write('\n');

    List<MethodItem> methodItems = getMethodItems();
    for (MethodItem methodItem: methodItems) {
        if (methodItem.writeTo(writer)) {
            writer.write('\n');
        }
    }
    writer.deindent(4);
    writer.write(".end method\n");
}
 
Example #14
Source File: MethodDefinition.java    From ZjDroid with Apache License 2.0 4 votes vote down vote up
public void writeTo(IndentingWriter writer) throws IOException {
    int parameterRegisterCount = 0;
    if (!AccessFlags.STATIC.isSet(method.getAccessFlags())) {
        parameterRegisterCount++;
    }

    writer.write(".method ");
    writeAccessFlags(writer, method.getAccessFlags());
    writer.write(method.getName());
    writer.write("(");
    for (MethodParameter parameter: methodParameters) {
        String type = parameter.getType();
        writer.write(type);
        parameterRegisterCount++;
        if (TypeUtils.isWideType(type)) {
            parameterRegisterCount++;
        }
    }
    writer.write(")");
    writer.write(method.getReturnType());
    writer.write('\n');

    writer.indent(4);
    if (classDef.options.useLocalsDirective) {
        writer.write(".locals ");
        writer.printSignedIntAsDec(methodImpl.getRegisterCount() - parameterRegisterCount);
    } else {
        writer.write(".registers ");
        writer.printSignedIntAsDec(methodImpl.getRegisterCount());
    }
    writer.write('\n');
    writeParameters(writer, method, methodParameters, classDef.options);

    if (registerFormatter == null) {
        registerFormatter = new RegisterFormatter(classDef.options, methodImpl.getRegisterCount(),
                parameterRegisterCount);
    }

    AnnotationFormatter.writeTo(writer, method.getAnnotations());

    writer.write('\n');

    List<MethodItem> methodItems = getMethodItems();
    for (MethodItem methodItem: methodItems) {
        if (methodItem.writeTo(writer)) {
            writer.write('\n');
        }
    }
    writer.deindent(4);
    writer.write(".end method\n");
}