gpt4 book ai didi

java - 如何保留包含特定成员的类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:49:39 25 4
gpt4 key购买 nike

我只想保留类,其中包含用 @Keep 注释的方法,以及这些方法。即使未使用这些方法(和所属类)也应保留。

我在.pro-file中写的是:

-keepclassmembers class * {
@Keep *;
}

-keepclasseswithmembers class * {
@Keep *;
}

但它会缩减带有@Keep 方法的类(如果它们未被使用)。

然后我试试这个:

-keep class * {
@Keep *;
}

它只保留所有类。

那么,我应该在 .pro-file 中写什么呢?

更新 1:示例感谢您的回答。但是我已经使用了完全限定的注解名称并包含了带有注解的 JAR,但它并没有达到我想要的效果。所以,我准备了一个样本。

我有 2 个 JAR:

example.jar/

  example/
code/
more/
A.class

lib.jar/

  example/
lib/
Keep.class

A.java:

package example.code.more;

import example.lib.*;

public class A {
@Keep
void foo() {}
}

Keep.java:

package example.lib;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface Keep {

}

Proguard 配置,example.pro:

-injars  example.jar
-injars lib.jar
-outjars obfuscated.jar

-libraryjars <java.home>/lib/rt.jar

-printmapping rt.map

-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

-printseeds
-overloadaggressively
-dontoptimize
-keeppackagenames example.lib.**

-keepattributes *Annotation*

-keepclassmembers class * extends java.lang.Enum {
public static **[] values();
public static ** valueOf(java.lang.String);
}

-keep class example.lib.* { *; }
-keep class * extends java.lang.annotation.Annotation { *; }


-keepclassmembers class * {
@example.lib.Keep *;
}

-keepclasseswithmembers class * {
@example.lib.Keep *;
}

看,包名是正确的,所有的 JAR 都包含在内。

生成的 map 文件:

example.lib.Keep -> example.lib.Keep:

因此,A.class 被删除了。我做错了什么?

最佳答案

就像 ProGuard 发行版中的 examples/annotations/lib/annotations.pro 一样,您应该指定完全限定的名称。此外,选项 -keepclasseswithmembers 不能与“*”通配符很好地结合——请改用“ ”通配符:

-keepclasseswithmembers class * {
@proguard.annotation.Keep <methods>;
}

你也不能忘记阅读包含注释类的 jar:

-libraryjars annotations.jar 

关于java - 如何保留包含特定成员的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6548213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com