如何修复现有方法的 proguard 警告“找不到引用的方法”java.lang.Object 的“克隆”和“终结”

2022-09-03 01:50:38

我试图压缩一个消耗.ical4j.jar

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

  • 警告: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支持和:“...\Android...\sdk\platforms\android-7\android.jar”有方法和类。finalize()clone()finalize()clone()java.lang.Object

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

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

我正在使用

  • proguard-4.11 with
  • 渐变-1.11
    • 时髦: 1.8.6
    • Ant:Apache Ant(TM) 版本 1.9.2 于 2013 年 7 月 8 日编译
    • 常春藤: 2.2.0
    • JVM: 1.7.0_25 (甲骨文公司 23.25-b01)
    • 操作系统: 视窗 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'),您必须将runProguard替换为minifyEnabled

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

答案 1

net.fortuna.ical4j.model.CalendarFactory扩展,扩展 。但是,您的输入中缺少中产阶级(您正在使用 -dontwarn 抑制相应的警告)。由于缺少部分类层次结构,ProGuard 没有意识到 CalendarFactory 可以访问受保护的方法和 ,并打印出这些警告。groovy.util.AbstractFactoryjava.lang.Objectclonefinalize

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

-dontwarn net.fortuna.ical4j.model.CalendarFactory

或者用于涵盖所有类似的类:

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

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


答案 2

这是我的前卫配置文件。尝试复制粘贴

-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose    

# standard, except v4.app.Fragment, its required when app uses Fragments

-keep public class * extends android.app.Activity
-keep public class * extends android.support.v7.app.ActionBarActivity
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

-keepclasseswithmembers class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class * extends android.app.Activity { 
       public void *(android.view.View); 
}

然后添加您的代码,如下所示:使用时

-dontwarn groovy.**

还添加

-keep class groovy.** { *; }

对所有外部库执行此操作。


推荐