【问题标题】:How to use Kotlin with Proguard如何将 Kotlin 与 Proguard 一起使用
【发布时间】:2016-02-06 11:16:27
【问题描述】:

我正在尝试将 Kotlin 添加到我的项目中,我需要使用 proguard。我应该在 proguard 中添加哪些规则来支持 Kotlin?

谢谢

【问题讨论】:

  • 请提供更多信息,例如你尝试了哪些规则,它是如何工作的,你得到了什么错误,等等。

标签: android proguard kotlin


【解决方案1】:

你不需要做任何特别的事情。 Kotlin 开箱即用地与 ProGuard 一起工作。但是在使用 ProGuard 处理您的应用程序时,您可能会遇到一些奇怪的错误。在这种情况下,只需添加

-dontwarn kotlin.**

此外,如果您想在运行时摆脱空检查,您可以使用以下规则:

-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
    static void checkParameterIsNotNull(java.lang.Object, java.lang.String);
}

【讨论】:

  • 我相信 kotlinc 的标志设置了 null 检查的策略。不需要proguard。
  • 你在哪里找到关于国旗的东西?我非常想尝试,但似乎无法在任何地方找到它:/
  • @daemontus kotlinc -X 产生-Xno-param-assertions-Xno-receiver-assertions-Xno-call-assertions;另见source code
  • Kotlin 可与 Proguard 一起使用,但 Proguard 尚未与 Kotlin 有效协作。 Proguard 中的 Kotlin 支持目前仍处于测试阶段。例如。 Proguard 无法区分 internal 类和成员与 public 类和成员。它将它们视为public,因为它们在字节码中被标记为public
【解决方案2】:
-keep class kotlin.** { *; }
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.**
-keepclassmembers class **$WhenMappings {
    <fields>;
}
-keepclassmembers class kotlin.Metadata {
    public <methods>;
}
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
    static void checkParameterIsNotNull(java.lang.Object, java.lang.String);
}

构建等级:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

https://kotlinlang.org/docs/tutorials/kotlin-android.html

【讨论】:

  • 我应该在哪里添加第一个?在proguard-rules.pro?
  • @c-是的。将其添加到您的 proguard-rules 文件中
【解决方案3】:

在 Kotlin 1.0.2 中,EAP proguard 在枚举映射时会被删除,所以我必须明确地保留它们,所以

-keepclassmembers class **$WhenMappings {
    <fields>;
}

足以进行正确的混淆。虽然如果你想要一些性能改进,你也可以添加

-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
    static void checkParameterIsNotNull(java.lang.Object, java.lang.String);
}

【讨论】:

    【解决方案4】:

    如果你使用 android studio,proguards 是默认的。但是您应该为您的代码安全和代码启用“启用代码收缩”和“启用资源收缩”选项优化。

    打开您的 gradile 文件并检查以下内容。

    android {
        buildTypes {
            release {
                // Enables code shrinking, obfuscation, and optimization for only
                // your project's release build type.
                minifyEnabled true
    
                // Enables resource shrinking, which is performed by the
                // Android Gradle plugin.
                shrinkResources true
    
                // Includes the default ProGuard rules files that are packaged with
                // the Android Gradle plugin. To learn more, go to the section about
                // R8 configuration files.
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    }
    

    来源:https://developer.android.com/studio/build/shrink-code

    【讨论】:

      【解决方案5】:

      签入您的build.gradle。您是否包括:

      implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多