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
finalize()
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
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'
}
}
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.
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.
[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: