我正在尝试为 Android 库创建一个外观。基本上,外观是一个带有一系列挂起方法的 Kotlin 接口:
interface Facade {
suspend fun doSomeWork(): String
}
由于它是一个外观,我想防止它混淆,所以这是我的
proguard-rules.pro
文件:
-keep interface com.some.library.Facade { *; }
问题
然后我尝试将该库连接到我的应用程序项目。这里出现了问题 - 我无法使用
Facade#doSomeWork
作为挂起函数,因为它的签名已更改。我尝试反编译库工件并检查编译的类:
public interface Facade {
@Nullable
Object doSomeWork(@NotNull Continuation<? super String> var1);
}
但是,如果我禁用 ProGuard - 编译函数的签名与源代码中的相同,我可以在应用程序项目中使用它。
尝试解决问题
-keepattributes Signature,LineNumberTable,RuntimeVisibleAnnotations,AnnotationDefault,Code
。-keep com.some.library.** { *; }
。-keep class kotlin.** { *; }
-keep class kotlinx.** { *; }
proguard-android-optimize.txt
替换为 proguard-android.txt
。android.enableR8.fullMode=false
。其他信息
问题
如何让 ProGuard 保留 Kotlin 挂起方法并防止签名更改?
正如Proguard Manual for Kotlin中提到的,这对我有用:
-keep class kotlin.Metadata
以上导致我收到警告,我必须保持沉默:
-dontwarn java.lang.instrument.ClassFileTransformer