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

标签 java android gradle proguard ical4j

我尝试压缩一个使用 ical4j.jar 的 android 应用程序。

当我使用 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"在 java.lang.Object 类中有方法 finalize()clone()

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

注意:这不是其他“proguard 找不到引用方法”问题的重复,因为在我的特定情况下,我认为应该存在缺少的方法。

我正在使用

  • proguard-4.11 与
  • gradle-1.11
    • 常规:1.8.6
    • Ant:2013 年 7 月 8 日编译的 Apache Ant(TM) 版本 1.9.2
    • Ivy :2.2.0
    • JVM:1.7.0_25(甲骨文公司 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.**

这是我的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'
    }

[2014-12-20更新]

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

注意:对于当前的 Android Studio 1.0 (android.buildToolsVersion >= '20'),您必须更换 runProguardminifyEnabled

例子

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

最佳答案

net.fortuna.ical4j.model.CalendarFactory 扩展了 groovy.util.AbstractFactory,后者扩展了 java.lang.Object。但是,您的输入中缺少中间类(您正在使用 -dontwarn 抑制相应的警告)。由于缺少部分类层次结构,ProGuard 没有意识到 CalendarFactory 可能会访问 protected 方法 clonefinalize,并打印出这些警告。

由于您的代码可能根本不使用该类,您可以取消警告:

-dontwarn net.fortuna.ical4j.model.CalendarFactory

或者覆盖所有类似的类:

-dontwarn net.fortuna.ical4j.model.**

你不应该为这个问题添加任何 -keep 选项; Android SDK 已经为您指定了基本的 Android 相关 -keep 选项。

关于java - 如何修复 proguard 警告 'can' t 为 java.lang.Object 类的现有方法 'clone' 和 'finalize' 找到引用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23883028/

相关文章:

java - 对子字符串内的子字符串进行排序

java - 单击以确认带有 Selenium WebDriver 的模态对话框

java - 如何将多个重复的json数组排序为不重复的字符串数组?

android - 在项目上找不到属性 'uninstallDebug'

android - 为此应用指定了无效的联系电话

java - Google Play 崩溃 LibGDX 项目

android - 如何使用实验性 gradle 插件(NDK)在 android studio 中添加 openssl 库?

java - WebView 和前置摄像头在某些三星设备上无法使用

android - 从一侧的屏幕外到另一侧的屏幕外进行 Translate TranslateAnimation

Android 项目和 Gradle : assemble a single module