Proguard,如何保持构造函数的参数有一些注释?

时间:2018-05-05 12:28:20

标签: proguard android-proguard

如果参数有我的自定义注释,那么构造函数应该保留。

1 个答案:

答案 0 :(得分:0)

好吧,我自己使用注释处理器解决了。

创建一个应用于类的注释,该注释应保留构造函数:

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
annotation class KeepInit

用于项目构建的注释处理器:

fun enclosingType(el: Element): Element {
    var e: Element? = el
    var c: TypeElement?
    do {
        e = e?.enclosingElement
        c = e as? TypeElement
    } while (e != null && c == null)
    return c ?: el
}


val enclosing = enclosingType(elementOfCustomAnnotation)
if (enclosing.annotationMirrors.none { it.annotationType.toString() == "xxx.foo.bar.KeepInit" }) {
    throw Exception("must add @KeepInit to class: $enclosing")
}

保护规则:

-keepclassmembers,allowobfuscation @xxx.foo.bar.KeepInit class * {
    <init>(...);
}

示例:

@KeepInit
class SomeClass(
    @SomeCustomAnnotation("id") private val id: String,
    @SomeCustomAnnotation("title") private val title: String
)