【发布时间】:2016-02-06 11:16:27
【问题描述】:
我正在尝试将 Kotlin 添加到我的项目中,我需要使用 proguard。我应该在 proguard 中添加哪些规则来支持 Kotlin?
谢谢
【问题讨论】:
-
请提供更多信息,例如你尝试了哪些规则,它是如何工作的,你得到了什么错误,等等。
我正在尝试将 Kotlin 添加到我的项目中,我需要使用 proguard。我应该在 proguard 中添加哪些规则来支持 Kotlin?
谢谢
【问题讨论】:
你不需要做任何特别的事情。 Kotlin 开箱即用地与 ProGuard 一起工作。但是在使用 ProGuard 处理您的应用程序时,您可能会遇到一些奇怪的错误。在这种情况下,只需添加
-dontwarn kotlin.**
此外,如果您想在运行时摆脱空检查,您可以使用以下规则:
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
static void checkParameterIsNotNull(java.lang.Object, java.lang.String);
}
【讨论】:
kotlinc -X 产生-Xno-param-assertions、-Xno-receiver-assertions 和-Xno-call-assertions;另见source code
internal 类和成员与 public 类和成员。它将它们视为public,因为它们在字节码中被标记为public。
-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'
【讨论】:
proguard-rules.pro?
在 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);
}
【讨论】:
如果你使用 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'
}
}
}
【讨论】:
签入您的build.gradle。您是否包括:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
【讨论】: