代码之家  ›  专栏  ›  技术社区  ›  JJD

如何使用Kotlin为Android版本配置ProGuard

  •  1
  • JJD  · 技术社区  · 7 年前

    我将kotlin1.2.71添加到我的Android(Java)应用程序项目中。

    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规则。 People recommend (2015年发布)简单地说就是规则:

    -dontwarn kotlin.**
    

    这仍然是推荐的解决方案吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Kiskae    7 年前

    查看实际的警告会告诉您在java标准库中找不到特定的方法。

    Matcher.end(String) 表明该方法仅在您的minSdk为 26 . 这是添加Java-8支持时的SDK级别。

    简单地说,您试图将java8级别的kotlin库与不支持它的android sdk一起使用,从而导致您观察到的错误。