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

时间:2018-04-22 03:13:56

标签: 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();
    }

}

请注意&#34;值&#34;缺少@Around注释中的参数!这是非常奇怪的行为......我几乎认为这是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 class ** { @org.aspectj.lang.annotation.Around ; }
  6. -keepclassmembers class ** { @org.aspectj.lang.annotation.Around.On ; }
  7. -keepclassmembers class ** { @org.aspectj.lang.annotation.Around.* ; }
  8. 其中一些方法只会导致Proguard抛出错误,而那些不会产生任何影响的错误。请帮忙!

0 个答案:

没有答案