web-dev-qa-db-de.com

behebung der Proguard-Warnung 'Die referenzierte Methode kann nicht gefunden werden' für die vorhandenen Methoden 'klonen' und 'finalize' der Klasse Java.lang.Object

Ich versuche, eine Android-App zu komprimieren, die ical4j.jar verbraucht.

Wenn ich die Apk mit Proguard mit gradle proguardDebug baue, bekomme ich

  • Warnung: net.fortuna.ical4j.model.CalendarFactory: Die referenzierte Methode 'void finalize ()' kann in der Bibliotheksklasse Java.lang.Object .__ nicht gefunden werden.
    • 6 weitere ähnliche Warnungen für finalize()
  • Warnung: net.fortuna.ical4j.model.CalendarFactory: Die referenzierte Methode 'Java.lang.Object clone ()' kann in der Bibliotheksklasse Java.lang.Object .__ nicht gefunden werden.
    • 6 weitere ähnliche Warnungen für clone()

Ich habe bereits bestätigt, dass Android-7 finalize() und clone() unterstützt: "...\Android ...\sdk\platform\Android-7\Android.jar" verfügt über die Methoden finalize() und clone() der Klasse Java.lang.Object.

Haben Sie eine Idee, wie Sie das beheben können?

Hinweis: Hierbei handelt es sich nicht um ein Duplikat anderer "Proguard-Fragen", auf die verwiesene Methode nicht gefunden werden kann. In meinem speziellen Fall denke ich, dass die fehlende Methode vorhanden sein sollte.

Ich benutze 

  • proguard-4.11 mit 
  • gradle-1.11
    • Stark: 1.8.6
    • Ant: Apache Ant (TM) Version 1.9.2, erstellt am 8. Juli 2013
    • Efeu: 2.2.0
    • JVM: 1.7.0_25 (Oracle Corporation 23.25-b01)
    • Betriebssystem: Windows 7 6.1 AMD64
  • ical4j.jar 1.0.5

dies ist Proguard Config proguard-rules.txt, das wahrscheinlich eine Korrektur benötigt:

#  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.**

Dies ist mein 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'
    }

[Update 2014-12-20]

Ich habe meine Arbeitskonfiguration unten als Antwort hinzugefügt.

Hinweis: Mit Current Android Studio 1.0 (Android.buildToolsVersion> = '20') müssen Sie ersetzen runProguard mit minifyEnabled

Beispiel

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

net.fortuna.ical4j.model.CalendarFactory erweitert groovy.util.AbstractFactory und erweitert Java.lang.Object. Die Mittelklasse fehlt jedoch in Ihrer Eingabe (Sie unterdrücken die entsprechenden Warnungen mit -dontwarn). Da ein Teil der Klassenhierarchie fehlt, erkennt ProGuard nicht, dass CalendarFactory auf die geschützten Methoden clone und finalize zugreifen kann, und gibt diese Warnungen aus.

Da Ihr Code die Klasse wahrscheinlich überhaupt nicht verwendet, können Sie die Warnungen unterdrücken:

-dontwarn net.fortuna.ical4j.model.CalendarFactory

Oder um alle ähnlichen Klassen abzudecken:

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

Sie sollten keine -keep-Optionen für dieses Problem hinzufügen. Das Android-SDK legt bereits die grundlegenden Android-verwalteten -keep-Optionen für Sie fest.

16
Eric Lafortune

Dies ist meine Proguard-Konfigurationsdatei. Versuchen Sie es mit Kopieren und Einfügen

-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); 
}

Fügen Sie dann Ihren Code wie folgt hinzu: Bei Verwendung von 

-dontwarn groovy.**

auch hinzufügen

-keep class groovy.** { *; }

Machen Sie es für alle externen Bibliotheken.

2
Dawid C

[Update 2014-05-30 diesen Text umformuliert]

Vielen Dank an @EricLafortune, die mir geholfen haben, das Problem zu verstehen und zu lösen.

Für andere, die Android ical4j Apps komprimieren möchten, ist hier meine Arbeitslösung: 

alle Klassen mit dem in library class Java.lang.Object - Problem stammen aus dem Namensraum

 net.fortuna.ical4j.model.**

also habe ich diese Zeilen zu proguard-rules.txt hinzugefügt.

###################
# Get rid of #can't find referenced method in library class Java.lang.Object# warnings for clone() and finalize()
# for details see http://stackoverflow.com/questions/23883028/how-to-fix-proguard-warning-cant-find-referenced-method-for-existing-methods
-dontwarn net.fortuna.ical4j.model.**

###############
# I use proguard only to remove unused stuff and to keep the app small.
# I donot want to obfuscate (rename packages, classes, methods, ...) since this is open source
-keepnames class ** { *; }
-keepnames interface ** { *; }
-keepnames enum ** { *; }

statistiken:

  • ohne Verschleierung: 932 Klassen; apk 911kb. 
  • mit Verschleierung: 365 Klassen, apk 505kb
0
k3b