Cómo corregir la advertencia proguard 'no se puede encontrar el método de referencia' para los métodos existentes 'clonar' y 'finalizar' de la clase java.lang.Object

Trato de comprimir una aplicación para Android que consume ical4j.jar .

Cuando construyo el apk con proguard usando gradle proguardDebug i get

  • Advertencia: net.fortuna.ical4j.model.CalendarFactory: no se puede encontrar el método referenciado 'void finalize ()' en la clase de biblioteca java.lang.Object
    • 6 advertencias similares adicionales para finalize()
  • Advertencia: net.fortuna.ical4j.model.CalendarFactory: no se puede encontrar el método referenciado 'java.lang.Object clone ()' en la clase de biblioteca java.lang.Object
    • 6 advertencias similares adicionales para clone()

Ya he verificado que android-7 soporta finalize() y clone() : "… \ Android … \ sdk \ plataformas \ android-7 \ android.jar" tiene métodos finalize() y clone() en la clase java.lang.Object .

¿Tienes alguna idea de cómo arreglar esto?

Nota: esto no es un duplicado de otras preguntas 'proguard no puede encontrar referenciado método' porque en mi caso específico creo que el método que faltaba debería estar allí.

estoy usando

  • Proguard-4.11 con
  • Gradle-1.11
    • Groovy: 1.8.6
    • Ant: Apache Ant (TM) versión 1.9.2 compilado el 8 de julio de 2013
    • Ivy: 2.2.0
    • JVM: 1.7.0_25 (Oracle Corporation 23.25-b01)
    • Sistema operativo: Windows 7 6.1 amd64
  • Ical4j.jar 1.0.5

Esto es proguard config proguard-rules.txt que probablemente necesite alguna corrección:

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

Este es mi 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' } 

[Actualización 2014-12-20]

He añadido mi configuración de trabajo como respuesta a continuación.

Nota: con Current Android Studio 1.0 (android.buildToolsVersion> = '20') debe reemplazar runProguard con minifyEnabled

Ejemplo

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

net.fortuna.ical4j.model.CalendarFactory extiende groovy.util.AbstractFactory que extiende java.lang.Object . Sin embargo, la clase media falta en su entrada (está suprimiendo las advertencias correspondientes con -dontwarn). Si falta parte de la jerarquía de clases, ProGuard no se da cuenta de que CalendarFactory puede acceder a los métodos protegidos clone y finalize e imprime estas advertencias.

Dado que su código probablemente no utiliza la clase en absoluto, puede suprimir las advertencias:

 -dontwarn net.fortuna.ical4j.model.CalendarFactory 

O para cubrir todas las clases similares:

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

No debe agregar ninguna opción de mantenimiento para este problema; El SDK de Android ya especifica las opciones básicas de mantenimiento relacionadas con Android para usted.

Este es mi archivo de configuración proguard. Pruebe a copiar y pegarlo

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

A continuación, agregue su código, como se indica a continuación:

 -dontwarn groovy.** 

También agregue

 -keep class groovy.** { *; } 

Hágalo para todas las bibliotecas externas.

[Actualización 2014-05-30 reformulado este texto]

Gracias a @EricLafortune respuesta que me ayudó a entender y resolver el problema.

Para otros que quieren comprimir aplicaciones ical4j de Android aquí es mi solunción de trabajo:

Todas las clases con la in library class java.lang.Object – issue son de namespace

  net.fortuna.ical4j.model.** 

Así que añadí estas líneas a 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 ** { *; } 

estadística:

  • Sin ofuscación: 932 clases; Apk 911kb.
  • Con ofuscación: 365 clases; apk 505kb
  • La aplicación en la liberación se bloquea, mientras que en depuración no
  • ProGuard: no puede encontrar la clase referenciada com.google.android.gms.R
  • Excluir paquetes de proguard
  • Cómo utilizar retrace.bat en android
  • Múltiples advertencias al crear usando Proguard
  • Android: onClic no funciona con ProGuard
  • Android Build falla al usar Proguard y Gradle
  • Aplicación de Proguard a una aplicación existente en Google Play
  • Excepción sobre la serialización de array usando proguard android
  • Problemas proguard en android studio
  • Problemas con ProGuard para Android con Parse 1.3.5 jar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.