如何阻止 Proguard 收缩删除注释参数,即使它保留了注释本身?
How to stop Proguard shrink from removing annotation parameters even though it keeps the annotation itself?
我只使用 Proguard(版本 5.2.1)来收缩,而不是混淆或优化。这是我的配置:
-forceprocessing
-dontobfuscate
-dontoptimize
-dontwarn
-dontnote
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-libraryjars <java.home>/lib
-keep class ** extends **.MyRequestHandler
-keep @org.springframework.stereotype.Component class **
-keep @org.aspectj.lang.annotation.Aspect class **
-keep @interface *
我有一个 class,它是一个看起来像这样的 AspectJ 方面:
@Aspect
public class MyAspect {
@Pointcut("execution(* com.amazonaws.services.dynamodb*.*AmazonDynamoDB.*(..))")
public void myPointCut() {
}
@Around(value = "myPointCut()")
public Object logExecution(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println(joinPoint);
return joinPoint.proceed();
}
}
当我通过 Proguard 提供我的应用程序,然后反编译生成的 class 文件时,它是这样的:
@Aspect
public class MyAspect {
@Pointcut("execution(* com.amazonaws.services.dynamodb*.*AmazonDynamoDB.*(..))")
public void myPointCut() {
}
@Around
public Object logExecution(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println(joinPoint);
return joinPoint.proceed();
}
}
请注意 @Around
注释中的 "value" 参数丢失了!这是非常奇怪的行为......我几乎认为这是 Proguard 中的一个错误。它保留了注释本身,而不是参数……尽管很奇怪,它保留了 @Pointcut
注释中的参数。有谁知道如何解决这个问题?
提醒一下,我只收缩,-keepattributes
配置只是为了混淆,所以请不要有人回应说-keepattributes *Annotation*
会修理它。我试过了,没有效果。
我发现了这个类似的问题 (annotations having no effect in proguard),这是我获得 -keep @interface *
配置的地方。此设置应该保留所有注释,它似乎正在这样做,但由于某种原因它没有保留所有参数。我尝试了很多变体,例如:
-keep @interface **
-keep @interface* *
-keep @interface.On *
-keep @interface.* *
-keepclassmembers class ** { @org.aspectj.lang.annotation.Around ; }
-keepclassmembers class ** { @org.aspectj.lang.annotation.Around.On ; }
-keepclassmembers class ** { @org.aspectj.lang.annotation.Around.* ; }
其中一些方法只会导致 Proguard 抛出错误,而那些不会抛出错误的方法则没有任何效果。请帮忙!
答案已发布在此 ProGuard 错误报告中:https://sourceforge.net/p/proguard/bugs/700/
您只需更改此配置值:
-keep @interface *
为此:
-keep @interface * {*;}
这看起来仍然像是 ProGuard 中的一个错误,因为我显然在使用这些注释参数,并且我告诉 ProGuard 保留 类 和注释,所以它不应该删除它们。 .. 但这是解决方法。
我只使用 Proguard(版本 5.2.1)来收缩,而不是混淆或优化。这是我的配置:
-forceprocessing
-dontobfuscate
-dontoptimize
-dontwarn
-dontnote
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-libraryjars <java.home>/lib
-keep class ** extends **.MyRequestHandler
-keep @org.springframework.stereotype.Component class **
-keep @org.aspectj.lang.annotation.Aspect class **
-keep @interface *
我有一个 class,它是一个看起来像这样的 AspectJ 方面:
@Aspect
public class MyAspect {
@Pointcut("execution(* com.amazonaws.services.dynamodb*.*AmazonDynamoDB.*(..))")
public void myPointCut() {
}
@Around(value = "myPointCut()")
public Object logExecution(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println(joinPoint);
return joinPoint.proceed();
}
}
当我通过 Proguard 提供我的应用程序,然后反编译生成的 class 文件时,它是这样的:
@Aspect
public class MyAspect {
@Pointcut("execution(* com.amazonaws.services.dynamodb*.*AmazonDynamoDB.*(..))")
public void myPointCut() {
}
@Around
public Object logExecution(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println(joinPoint);
return joinPoint.proceed();
}
}
请注意 @Around
注释中的 "value" 参数丢失了!这是非常奇怪的行为......我几乎认为这是 Proguard 中的一个错误。它保留了注释本身,而不是参数……尽管很奇怪,它保留了 @Pointcut
注释中的参数。有谁知道如何解决这个问题?
提醒一下,我只收缩,-keepattributes
配置只是为了混淆,所以请不要有人回应说-keepattributes *Annotation*
会修理它。我试过了,没有效果。
我发现了这个类似的问题 (annotations having no effect in proguard),这是我获得 -keep @interface *
配置的地方。此设置应该保留所有注释,它似乎正在这样做,但由于某种原因它没有保留所有参数。我尝试了很多变体,例如:
-keep @interface **
-keep @interface* *
-keep @interface.On *
-keep @interface.* *
-keepclassmembers class ** { @org.aspectj.lang.annotation.Around ; }
-keepclassmembers class ** { @org.aspectj.lang.annotation.Around.On ; }
-keepclassmembers class ** { @org.aspectj.lang.annotation.Around.* ; }
其中一些方法只会导致 Proguard 抛出错误,而那些不会抛出错误的方法则没有任何效果。请帮忙!
答案已发布在此 ProGuard 错误报告中:https://sourceforge.net/p/proguard/bugs/700/
您只需更改此配置值:
-keep @interface *
为此:
-keep @interface * {*;}
这看起来仍然像是 ProGuard 中的一个错误,因为我显然在使用这些注释参数,并且我告诉 ProGuard 保留 类 和注释,所以它不应该删除它们。 .. 但这是解决方法。