java - 如何阻止 Proguard 收缩删除注释参数,即使它保留注释本身?

标签 java parameters annotations proguard shrink

我只是使用 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 *

我有一个类,它是一个 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 提供应用程序,然后反编译生成的类文件时,它是这样的:

@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 * 配置的地方。此设置应该保留所有注释,它似乎正在这样做,但由于某种原因它没有保留所有参数。我尝试了很多变体,例如:

  1. -keep @interface **
  2. -keep @interface* *
  3. -keep @interface.On *
  4. -keep @interface.* *
  5. -keepclassmembers 类 ** { @org.aspectj.lang.annotation.Around ; }
  6. -keepclassmembers 类 ** { @org.aspectj.lang.annotation.Around.On ; }
  7. -keepclassmembers 类 ** { @org.aspectj.lang.annotation.Around.* ; }

其中一些方法只会导致 Proguard 抛出错误,而那些不会的方法则不会产生任何效果。请帮忙!

最佳答案

答案已发布在此 ProGuard 错误报告中:https://sourceforge.net/p/proguard/bugs/700/

您只需更改此配置值:

-keep @interface *

对此:

-keep @interface * {*;}

这看起来仍然是 ProGuard 中的一个错误,因为我显然正在使用这些注释参数,并且我告诉 ProGuard 保留类和注释,所以它不应该删除它们......但这就是解决方法。

关于java - 如何阻止 Proguard 收缩删除注释参数,即使它保留注释本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49962163/

相关文章:

java - 在实例化一个类的同时编写它?

PHP - ini_set() 期望参数 2 是字符串,给定整数

c - 如何在 C 中声明常量数组参数?

java - 读取注解的属性

java - Spring : @Repository annotation for DAO

java - OPENGL ES glRotatef

java - 为什么Guava InputSupplier/OutputSupplier没有扩展Supplier接口(interface)?

java - 异步 Servlet 是否允许更大的并发性?

c# - LINQ/ Entity Framework : parameterless constructor issue

java - Hiber 缓存 : Cache all fixed data permanently