android - 如何使用 Kotlin 为 Android 版本构建配置 ProGuard
问题描述
我将 Kotlin 1.2.71 添加到我的 Android (Java) 应用程序项目中。该项目是为 Java 8 配置的:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
以下是 Kotlin 的变化:
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.71"
...
apply plugin: "kotlin-android"
apply plugin: "kotlin-android-extensions"
apply plugin: "kotlin-kapt"
...
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.71"
kapt "org.parceler:parceler:1.1.11"
我注意到使用 ProGuard 的发布版本失败了。构建过程输出以下信息:
Warning: kotlin.internal.jdk8.JDK8PlatformImplementations: can't find referenced
method 'int start(java.lang.String)' in library class java.util.regex.Matcher
Warning: kotlin.internal.jdk8.JDK8PlatformImplementations: can't find referenced
method 'int end(java.lang.String)' in library class java.util.regex.Matcher
Warning: kotlin.internal.jdk8.JDK8PlatformImplementations: can't find referenced
method 'java.lang.String group(java.lang.String)' in library class java.util.regex.Matcher
Note: kotlin.internal.PlatformImplementationsKt: can't find dynamically
referenced class kotlin.internal.JRE8PlatformImplementations
Note: kotlin.internal.PlatformImplementationsKt: can't find dynamically
referenced class kotlin.internal.JRE7PlatformImplementations
Note: kotlin.jvm.internal.Reflection: can't find dynamically
referenced class kotlin.reflect.jvm.internal.ReflectionFactoryImpl
Note: the configuration keeps the entry point
'com.google.android.gms.flags.impl.FlagProviderImpl { void init(com.google.android.gms.dynamic.zzd); }',
but not the descriptor class 'com.google.android.gms.dynamic.zzd'
Note: there were 1 unkept descriptor classes in kept class members.
You should consider explicitly keeping the mentioned classes
(using '-keep').
(http://proguard.sourceforge.net/manual/troubleshooting.html#descriptorclass)
Note: there were 3 unresolved dynamic references to classes or interfaces.
You should check if you need to specify additional program jars.
(http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)
Warning: there were 3 unresolved references to library class members.
You probably need to update the library versions.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)
Warning: Exception while processing task java.io.IOException: Please correct the above warnings first.
Thread(Tasks limiter_9): destruction
据我所知,Kotlin 不需要任何特殊的 ProGuard 规则。人们建议(从 2015 年发布)只是简单地制定规则:
-dontwarn kotlin.**
这仍然是推荐的解决方案吗?
有关的
解决方案
查看实际警告会告诉您它在 java 标准库中找不到特定的方法。
参考Matcher.end(String)
表明这是一种仅在您的 minSdk 为26
. 这是添加 Java-8 支持时的 SDK 级别。
简而言之,您尝试将 java8 级别的 kotlin 库与不支持它的 android sdk 一起使用,从而导致您观察到的错误。
推荐阅读
- minecraft-forge - 我如何制作一个通往我的模组中的维度的门户?
- javascript - 按时区显示时间新日期
- javascript - 如何在单击按钮时将绑定变量的值传递给模板中的方法
- java - Spring boot @Getmapping 重定向错误
- php - 如何优化 Laravel 中的增量查询?
- jquery - Laravel 7依赖下拉3级
- swift - 在 Swift 中使用 Process() 拦截 ffmpeg 标准输出
- angular - RXJS - 打字稿 - 等待可观察的发射,直到另一个可观察的
是假的 - python-3.x - 将字符串列转换为 int pandas DataFrame
- mongodb - 初始化后更改 Typegoose 集合名称