Skip to content

Commit

Permalink
Add workaround for invalid signatures
Browse files Browse the repository at this point in the history
cherry-pick from

ThexXTURBOXx@f1da047
  • Loading branch information
ThexXTURBOXx authored and pxb1988 committed Oct 30, 2021
1 parent c577db0 commit 5e4c90f
Showing 1 changed file with 25 additions and 4 deletions.
29 changes: 25 additions & 4 deletions dex-translator/src/main/java/com/googlecode/d2j/dex/Dex2Asm.java
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,16 @@ private static MethodVisitor collectBasicMethodInfo(DexMethodNode methodNode, Cl
// clear ACC_DECLARED_SYNCHRONIZED and ACC_CONSTRUCTOR from method flags
final int cleanFlag = ~((DexConstants.ACC_DECLARED_SYNCHRONIZED | DexConstants.ACC_CONSTRUCTOR));
access &= cleanFlag;
return cv.visitMethod(access, methodNode.method.getName(), methodNode.method.getDesc(), signature, xthrows);
try {
return cv.visitMethod(access, methodNode.method.getName(), methodNode.method.getDesc(), signature, xthrows);
} catch (StringIndexOutOfBoundsException | IllegalArgumentException e) {
System.err.println("Applying workaround to method "
+ methodNode.method.getOwner() + "#" + methodNode.method.getName()
+ " with original signature " + signature
+ " by changing its types to java.lang.Object.");
return cv.visitMethod(access, methodNode.method.getName(), methodNode.method.getDesc(),
"(Ljava/lang/Object;)Ljava/lang/Object;", xthrows);
}
}

protected static Map<String, Clz> collectClzInfo(DexFileNode fileNode) {
Expand Down Expand Up @@ -523,9 +532,21 @@ public void convertField(DexClassNode classNode, DexFieldNode fieldNode, ClassVi
}
}
Object value = convertConstantValue(fieldNode.cst);
final int FieldCleanFlag = ~DexConstants.ACC_DECLARED_SYNCHRONIZED;
FieldVisitor fv = cv.visitField(fieldNode.access & FieldCleanFlag, fieldNode.field.getName(),
fieldNode.field.getType(), signature, value);

final int fieldCleanFlag = ~((DexConstants.ACC_DECLARED_SYNCHRONIZED | Opcodes.ACC_SYNTHETIC));
FieldVisitor fv;
try {
fv = cv.visitField(fieldNode.access & fieldCleanFlag, fieldNode.field.getName(),
fieldNode.field.getType(), signature, value);
} catch (StringIndexOutOfBoundsException | IllegalArgumentException e) {
System.err.println("Applying workaround to field "
+ classNode.className + "#" + fieldNode.field.getName()
+ " with original signature " + signature
+ " by changing its type to java.lang.Object.");
fv = cv.visitField(fieldNode.access & fieldCleanFlag, fieldNode.field.getName(),
fieldNode.field.getType(), "Ljava/lang/Object;", value);
}

if (fv == null) {
return;
}
Expand Down

0 comments on commit 5e4c90f

Please sign in to comment.