Ich versuche, eine Android-App zu komprimieren, die ical4j.jar
verbraucht.
Wenn ich die Apk mit Proguard mit gradle proguardDebug
baue, bekomme ich
finalize()
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
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'
}
}
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.
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.
[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: