防止 ProGuard 更改 Kotlin 挂起函数签名

问题描述 投票:0回答:1

我正在尝试为 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 - 编译函数的签名与源代码中的相同,我可以在应用程序项目中使用它。

尝试解决问题

  1. 为 ProGuard 添加不同的 keep 属性:
    -keepattributes Signature,LineNumberTable,RuntimeVisibleAnnotations,AnnotationDefault,Code
  2. 将整个包添加到 keep 属性:
    -keep com.some.library.** { *; }
  3. 将 Kotlin 添加到 keep 属性:
-keep class kotlin.** { *; }
-keep class kotlinx.** { *; }
  1. proguard-android-optimize.txt
    替换为
    proguard-android.txt
  2. 禁用 ProGuards 的完整模式:
    android.enableR8.fullMode=false
  3. 创建一个带有外观的单独的 Gradle 模块。该模块不会使用 ProGuard,因此方法签名不会更改。实际上,这是迄今为止我找到的唯一可行的解决方案。

其他信息

  • Android Gradle 插件 - v7.2.2
  • Gradle - v7.4
  • Kotlin - v1.8.21

问题

如何让 ProGuard 保留 Kotlin 挂起方法并防止签名更改?

android kotlin proguard
1个回答
0
投票

正如Proguard Manual for Kotlin中提到的,这对我有用:

-keep class kotlin.Metadata

以上导致我收到警告,我必须保持沉默

-dontwarn java.lang.instrument.ClassFileTransformer
© www.soinside.com 2019 - 2024. All rights reserved.