如何修复proguard警告'无法找到引用的方法'用于类java.lang.Object的现有方法'clone'和'finalize'

k3b*_*k3b 14 java android proguard gradle ical4j

我尝试压缩消耗的Android应用程序ical4j.jar.

当我使用gradle proguardDebug我得到的proguard构建apk

  • 警告:net.fortuna.ical4j.model.CalendarFactory:在库类java.lang.Object中找不到引用的方法'void finalize()'
    • 另外6个类似的警告 finalize()
  • 警告:net.fortuna.ical4j.model.CalendarFactory:在库类java.lang.Object中找不到引用的方法'java.lang.Object clone()'
    • 另外6个类似的警告 clone()

我已经验证了android-7支持finalize()clone():"...\Android ...\sdk\platforms\android-7\android.jar"有方法finalize()clone()java.lang.Object.

你知道如何解决这个问题吗?

注意:这不是其他'proguard找不到引用方法'的重复问题,因为在我的具体情况下我认为缺少的方法应该存在.

我在用

  • proguard-4.11 with
  • gradle产出1.11
    • Groovy:1.8.6
    • Ant:2013年7月8日编译的Apache Ant(TM)版本1.9.2
    • 常春藤:2.2.0
    • JVM:1.7.0_25(Oracle Corporation 23.25-b01)
    • 操作系统:Windows 7 6.1 amd64
  • ical4j.jar 1.0.5

这是proguard配置proguard-rules.txt,可能需要一些修复:

#  proguard-rules.txt
## ical4j also contains groovy code which is not used in android 
-dontwarn groovy.**
-dontwarn org.codehaus.groovy.**
-dontwarn org.apache.commons.logging.**
-dontwarn sun.misc.Perf

-dontnote com.google.vending.**
-dontnote com.android.vending.licensing.**
Run Code Online (Sandbox Code Playgroud)

这是我的 build.gradle

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.9.+'
            classpath 'net.sf.proguard:proguard-gradle:4.11'
        }
    }

    allprojects {
        repositories {
            mavenCentral()
        }
    }

    apply plugin: 'android'

    configurations {
        compile.exclude group: 'commons-logging' // referenced in some portable lib. use androids internal instead
    }

    android {
        compileSdkVersion 19
        buildToolsVersion '19.0.3'

        packagingOptions {
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/NOTICE.txt'
        }

        defaultConfig {
            minSdkVersion 7
            targetSdkVersion 19
        }

        buildTypes {
            release {
                runProguard false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }

            // used for testing. remove if it works as expected
            debug {
                runProguard true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }
        }
    }

    dependencies {
        compile 'org.mnode.ical4j:ical4j:1.0.5'
        compile 'backport-util-concurrent:backport-util-concurrent:3.1'
        compile 'commons-codec:commons-codec:1.8'
        compile 'commons-lang:commons-lang:2.6'
    }
Run Code Online (Sandbox Code Playgroud)

[更新2014-12-20]

我在下面添加了我的工作配置作为答案.

注:当前的Android工作室1.0(android.buildToolsVersion> = '20'),则必须更换 runProguardminifyEnabled

    android {
        buildTypes {
            release {
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }
    }
Run Code Online (Sandbox Code Playgroud)

Eri*_*une 18

net.fortuna.ical4j.model.CalendarFactory扩展groovy.util.AbstractFactory延伸java.lang.Object.但是,输入中缺少中产阶级(您使用-dontwarn抑制了相应的警告).随着类层次结构缺少的一部分,ProGuard的并没有意识到CalendarFactory可以访问受保护的方法clonefinalize,并打印出这些警告.

由于您的代码可能根本不使用该类,因此您可以禁止显示警告:

-dontwarn net.fortuna.ical4j.model.CalendarFactory
Run Code Online (Sandbox Code Playgroud)

或覆盖所有类似的类:

-dontwarn net.fortuna.ical4j.model.**
Run Code Online (Sandbox Code Playgroud)

您不应为此问题添加任何-keep选项; Android SDK已经为您指定了与Android相关的基本选项.