use of org.jf.dexlib2.iface.Annotation in project atlas by alibaba.
the class AndFixFilterImpl method filterClass.
@Override
public boolean filterClass(ClassDiffInfo classDiffInfo) throws PatchException {
boolean isInnerclass = false;
DexBackedClassDef dexBackedClassDef = classDiffInfo.getClassDef();
if (classDiffInfo.getType().equals(DiffType.ADD)) {
return false;
// if (dexBackedClassDef.getAnnotations().size() > 0) {
// Set<? extends Annotation> annotations = dexBackedClassDef.getAnnotations();
// for (Annotation dexBackedAnnotation : annotations) {
// if (dexBackedAnnotation.getType().equals("dalvik/annotation/EnclosingClass;"))
// throw new PatchException("can't add member class:" + dexBackedClassDef.getType());
// }
// }
// String className = DexDiffer.getDalvikClassName(dexBackedClassDef.getType());
// MappingParser mappingParser = new MappingParser(APatchTool.mappingFile);
// String outterClassName = mappingParser.getOuterClass(className);
// if (!className.equals(outterClassName)) {
// isInnerclass = true;
// if (SmaliDiffUtils.diff(diffInfo, outterClassName, className, outFile)) {
// classDiffInfo.setType(DiffType.NONE);
// return true;
// } else {
// throw new PatchException("can't add anonymous class;" + dexBackedClassDef.getType());
// }
// }
// throw new PatchException("can't add class:" + dexBackedClassDef.getType());
} else if (classDiffInfo.getType().equals(DiffType.MODIFY)) {
if (classDiffInfo.getName().endsWith(".R") || classDiffInfo.getName().contains(".R$")) {
return true;
}
Set<MethodDiffInfo> needFilterMethod = new HashSet<MethodDiffInfo>();
Set<FieldDiffInfo> needFilterField = new HashSet<FieldDiffInfo>();
if (classDiffInfo.getModifyMethods().size() > 0) {
for (MethodDiffInfo methodDiffInfo : classDiffInfo.getModifyMethods()) {
if (filterMethod(methodDiffInfo)) {
System.out.println(methodDiffInfo.getBackedMethod().getDefiningClass() + ":" + methodDiffInfo.getBackedMethod().getName() + " is filtered!");
needFilterMethod.add(methodDiffInfo);
}
}
}
classDiffInfo.getModifyMethods().removeAll(needFilterMethod);
if (classDiffInfo.getModifyFields().size() > 0) {
for (FieldDiffInfo fieldDiffInfo : classDiffInfo.getModifyFields()) {
if (filterField(fieldDiffInfo)) {
needFilterField.add(fieldDiffInfo);
}
}
}
classDiffInfo.getModifyFields().removeAll(needFilterField);
if (classDiffInfo.getModifyFields().size() == 0 && classDiffInfo.getModifyMethods().size() == 0) {
classDiffInfo.setType(DiffType.NONE);
return true;
}
}
return false;
}
use of org.jf.dexlib2.iface.Annotation in project atlas by alibaba.
the class ApkPatch method getMethodAnnotaionPrepareClasses.
public static void getMethodAnnotaionPrepareClasses(DexDiffInfo dexDiffInfo, Set<String> prepareclasses) {
for (DexBackedMethod method : dexDiffInfo.getModifiedMethods()) {
Set<? extends Annotation> annotations = method.getAnnotations();
if (annotations == null) {
continue;
}
for (Annotation annotation : annotations) {
String type = annotation.getType();
if (type != null && type.startsWith("L") && type.endsWith(";")) {
prepareclasses.add(type.substring(1, type.length() - 1).replace('/', '.'));
System.out.println("prepare class: " + type);
}
Set<? extends AnnotationElement> elements = annotation.getElements();
for (AnnotationElement dexBackedAnnotationElement : elements) {
if (dexBackedAnnotationElement.getValue() instanceof DexBackedArrayEncodedValue) {
List<? extends EncodedValue> values = ((DexBackedArrayEncodedValue) dexBackedAnnotationElement.getValue()).getValue();
for (EncodedValue encodedValue : values) {
if (encodedValue instanceof TypeEncodedValue) {
prepareclasses.add(((TypeEncodedValue) encodedValue).getValue().substring(1, ((TypeEncodedValue) encodedValue).getValue().length() - 1).replace('/', '.'));
System.out.println("prepare class: " + ((TypeEncodedValue) encodedValue).getValue());
}
}
} else if (dexBackedAnnotationElement.getValue() instanceof DexBackedTypeEncodedValue) {
String value = ((DexBackedTypeEncodedValue) dexBackedAnnotationElement.getValue()).getValue();
prepareclasses.add(value.substring(1, value.length() - 1).replace('/', '.'));
System.out.println("prepare class: " + value);
}
}
}
}
}
use of org.jf.dexlib2.iface.Annotation in project atlas by alibaba.
the class ApkPatch method getClassAnnotaionPrepareClasses.
public static void getClassAnnotaionPrepareClasses(DexBackedClassDef classDef, Set<String> prepareclasses, DexDiffInfo dexDiffInfo) {
for (DexBackedClassDef modifyClasses : dexDiffInfo.getModifiedClasses()) {
if (classDef.getType().equals(modifyClasses.getType())) {
if (classDef.getAnnotations() != null) {
Set<? extends DexBackedAnnotation> annotations = classDef.getAnnotations();
for (DexBackedAnnotation annotation : annotations) {
String type = annotation.getType();
if (type != null && type.startsWith("L") && type.endsWith(";")) {
prepareclasses.add(type.substring(1, type.length() - 1).replace('/', '.'));
System.out.println("prepare class: " + type);
}
Set<? extends DexBackedAnnotationElement> elements = annotation.getElements();
for (DexBackedAnnotationElement dexBackedAnnotationElement : elements) {
if (dexBackedAnnotationElement.getValue() instanceof DexBackedArrayEncodedValue) {
List<? extends EncodedValue> values = ((DexBackedArrayEncodedValue) dexBackedAnnotationElement.getValue()).getValue();
for (EncodedValue encodedValue : values) {
if (encodedValue instanceof TypeEncodedValue) {
prepareclasses.add(((TypeEncodedValue) encodedValue).getValue().substring(1, ((TypeEncodedValue) encodedValue).getValue().length() - 1).replace('/', '.'));
System.out.println("prepare class: " + ((TypeEncodedValue) encodedValue).getValue());
}
}
} else if (dexBackedAnnotationElement.getValue() instanceof DexBackedTypeEncodedValue) {
String value = ((DexBackedTypeEncodedValue) dexBackedAnnotationElement.getValue()).getValue();
prepareclasses.add(value.substring(1, value.length() - 1).replace('/', '.'));
System.out.println("prepare class: " + value);
} else if (dexBackedAnnotationElement.getValue() instanceof DexBackedAnnotationEncodedValue) {
String value = ((DexBackedAnnotationEncodedValue) dexBackedAnnotationElement.getValue()).getType();
}
}
}
}
}
}
}
use of org.jf.dexlib2.iface.Annotation in project atlas by alibaba.
the class MethodDefinition method writeParameters.
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);
String containingClass = null;
if (options.useImplicitReferences) {
containingClass = method.getDefiningClass();
}
AnnotationFormatter.writeTo(writer, annotations, containingClass);
writer.deindent(4);
writer.write(".end param\n");
}
}
registerNumber++;
if (TypeUtils.isWideType(parameterType)) {
registerNumber++;
}
}
}
use of org.jf.dexlib2.iface.Annotation in project atlas by alibaba.
the class AnnotationFormatter method writeTo.
public static void writeTo(@Nonnull IndentingWriter writer, @Nonnull Collection<? extends Annotation> annotations, @Nullable String containingClass, MethodReplaceAnnotation methodReplaceAnnotation) throws IOException {
boolean first = true;
for (Annotation annotation : annotations) {
if (!first) {
writer.write('\n');
}
first = false;
writeTo(writer, annotation, containingClass);
}
if (null != methodReplaceAnnotation) {
writeTo(writer, methodReplaceAnnotation, containingClass);
}
}
Aggregations