feat: replace constants in annotations of method arguments (PR #2358)

This commit is contained in:
nitram84
2024-12-04 18:06:13 +01:00
committed by GitHub
parent cc0cb6a3d3
commit 828cad3287
2 changed files with 50 additions and 1 deletions
@@ -14,6 +14,7 @@ import jadx.api.plugins.input.data.annotations.EncodedType;
import jadx.api.plugins.input.data.annotations.EncodedValue;
import jadx.api.plugins.input.data.annotations.IAnnotation;
import jadx.api.plugins.input.data.attributes.JadxAttrType;
import jadx.api.plugins.input.data.attributes.types.AnnotationMethodParamsAttr;
import jadx.api.plugins.input.data.attributes.types.AnnotationsAttr;
import jadx.core.dex.attributes.AFlag;
import jadx.core.dex.attributes.AType;
@@ -279,12 +280,27 @@ public class ModVisitor extends AbstractVisitor {
if (cls.root().getArgs().isReplaceConsts()) {
replaceConstsInAnnotationForAttrNode(cls, cls);
cls.getFields().forEach(f -> replaceConstsInAnnotationForAttrNode(cls, f));
cls.getMethods().forEach(m -> replaceConstsInAnnotationForAttrNode(cls, m));
cls.getMethods().forEach((m) -> {
replaceConstsInAnnotationForAttrNode(cls, m);
replaceConstsInAnnotationForMethodParamsAttr(cls, m);
});
}
}
private void replaceConstsInAnnotationForMethodParamsAttr(ClassNode cls, MethodNode m) {
AnnotationMethodParamsAttr paramsAnnotation = m.get(JadxAttrType.ANNOTATION_MTH_PARAMETERS);
if (paramsAnnotation == null) {
return;
}
paramsAnnotation.getParamList().forEach(annotationsList -> replaceConstsInAnnotationsAttr(cls, annotationsList));
}
private void replaceConstsInAnnotationForAttrNode(ClassNode parentCls, AttrNode attrNode) {
AnnotationsAttr annotationsList = attrNode.get(JadxAttrType.ANNOTATION_LIST);
replaceConstsInAnnotationsAttr(parentCls, annotationsList);
}
private void replaceConstsInAnnotationsAttr(ClassNode parentCls, AnnotationsAttr annotationsList) {
if (annotationsList == null) {
return;
}
@@ -0,0 +1,33 @@
package jadx.tests.integration.android;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import org.junit.jupiter.api.Test;
import jadx.tests.api.IntegrationTest;
import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat;
public class TestResConstReplace3 extends IntegrationTest {
@Retention(RetentionPolicy.RUNTIME)
public @interface UsesAndroidResource {
int value() default 0;
}
@UsesAndroidResource(17039370 /* android.R.string.ok */)
public static class TestCls {
public void test(@UsesAndroidResource(17039370 /* android.R.string.ok */) int i) {
}
}
@Test
public void test() {
disableCompilation();
assertThat(getClassNode(TestCls.class))
.code()
.containsOne("import android.R;")
.countString(2, "@TestResConstReplace3.UsesAndroidResource(R.string.ok)");
}
}