web-dev-qa-db-fra.com

comment corriger avertissement 'ne peut pas trouver la méthode référencée' pour les méthodes existantes 'clone' et 'finalize' de la classe Java.lang.Object

J'essaie de compresser une application Android qui consomme ical4j.jar.

Quand je construis l'apk avec proguard en utilisant gradle proguardDebug je reçois

  • Avertissement: net.fortuna.ical4j.model.CalendarFactory: impossible de trouver la méthode référencée 'void finalize ()' dans la classe de bibliothèque Java.lang.Object
    • 6 avertissements similaires supplémentaires pour finalize()
  • Avertissement: net.fortuna.ical4j.model.CalendarFactory: impossible de trouver la méthode référencée 'Java.lang.Object clone ()' dans la classe de bibliothèque Java.lang.Object
    • 6 avertissements similaires supplémentaires pour clone()

J'ai déjà vérifié qu'Android-7 prend en charge finalize() et clone(): "...\Android ...\sdk\plateformes\Android-7\Android.jar" a les méthodes finalize() et clone() dans la classe Java.lang.Object.

Avez-vous une idée de comment résoudre ce problème?

Remarque: il ne s'agit pas d'un doublon des autres questions sur la méthode de programmation ne peut pas trouver de référence, car dans mon cas particulier, je pense que la méthode manquante devrait être présente.

J'utilise 

  • proguard-4.11 avec 
  • grade-1.11
    • Groovy: 1.8.6
    • Ant: Apache Ant (TM) version 1.9.2 compilée le 8 juillet 2013
    • Lierre: 2.2.0
    • JVM: 1.7.0_25 (Oracle Corporation 23.25-b01)
    • Système d'exploitation: Windows 7 6.1 AMD64
  • ical4j.jar 1.0.5

c'est la configuration proguard-rules.txt de proguard qui a probablement besoin d'une solution:

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

Ceci est mon 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'
    }

[Mise à jour 2014-12-20]

J'ai ajouté ma configuration de travail comme réponse ci-dessous.

Remarque: avec Android Studio 1.0 actuel (Android.buildToolsVersion> = '20'), vous devez remplacer runProguard with minifyEnabled

Exemple

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

net.fortuna.ical4j.model.CalendarFactory étend groovy.util.AbstractFactory qui étend Java.lang.Object. Cependant, la classe moyenne est absente de votre entrée (vous supprimez les avertissements correspondants avec -dontwarn). En l'absence d'une partie de la hiérarchie des classes, ProGuard ne réalise pas que CalendarFactory peut accéder aux méthodes protégées clone et finalize et affiche ces avertissements.

Puisque votre code n'utilise probablement pas la classe du tout, vous pouvez supprimer les avertissements:

-dontwarn net.fortuna.ical4j.model.CalendarFactory

Ou pour couvrir toutes les classes similaires:

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

Vous ne devriez ajouter aucune option de maintenance pour ce problème; le SDK Android spécifie déjà pour vous les options de base liées à Android.

16
Eric Lafortune

Ceci est mon fichier de configuration proguard. Essayez de copier-coller

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

Ajoutez ensuite votre code, comme suit: Lorsque vous utilisez 

-dontwarn groovy.**

ajouter aussi

-keep class groovy.** { *; }

Faites-le pour toutes les bibliothèques externes.

2
Dawid C

[mise à jour 2014-05-30 reformulé ce texte]

Merci à @EricLafortune pour la réponse qui m'a aidé à comprendre et à résoudre le problème.

Pour les autres qui veulent compresser les applications Android ical4j, voici mon travail: 

toutes les classes avec le in library class Java.lang.Object - issue proviennent de l'espace de noms

 net.fortuna.ical4j.model.**

donc j'ai ajouté ces lignes à proguard-rules.txt

###################
# 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 ** { *; }

statistiques:

  • sans obscurcissement: 932 classes; apk 911kb. 
  • avec obfuscation: 365 classes; apk 505kb
0
k3b