как исправить предупреждение proguard "не удается найти ссылочный метод" для существующих методов "клонировать" и "завершить" класса java.ленг.Объект
я пытаюсь сжать Android-приложение, которое потребляет ical4j.jar
.
когда я создаю apk с помощью proguard, используя gradle proguardDebug
Я
- предупреждение: net.Фортуна.ical4j.модель.CalendarFactory: не удается найти ссылочный метод "void finalize ()" в классе библиотеки java.ленг.Объект
- 6 дополнительных подобных предупреждений для
finalize()
- 6 дополнительных подобных предупреждений для
- предупреждение: net.Фортуна.ical4j.модель.CalendarFactory: не удается найти ссылочный метод 'Ява.ленг.Object clone ()' в классе библиотеки java.ленг.Объект
- 6 дополнительных подобных предупреждений для
clone()
- 6 дополнительных подобных предупреждений для
я уже проверил, что android-7 поддерживает finalize()
и clone()
: "...Андроид... sdkплатформыandroid-7android.jar " имеет методы finalize()
и clone()
в классе java.lang.Object
.
у вас есть идеи, как это исправить?
Примечание: это не дубликат другого " proguard не может найти ссылку вопросы метода, потому что в моем конкретном случае я думаю, что отсутствует метод должен быть там.
я использую
- proguard-4.11 с
- gradle-1.11
- груви: 1.8.6
- Ant: Apache Ant (TM) версия 1.9.2 составлено 8 июля 2013
- Плющев: 2.2.0
- JVM: 1.7.0_25 (Oracle Corporation 23.25-b01)
- ОС: Windows 7 6.1 для amd64
- ical4j.jar 1.0.5
это конфигурация proguard proguard-rules.txt
это, вероятно, нужно исправить:
# 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.**
это мой 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'
}
[обновление 2014-12-20]
я добавил свою рабочую конфигурацию в качестве ответа ниже.
Примечание: с текущей Android Studio 1.0 (android.buildToolsVersion > = '20') необходимо заменить runProguard С minifyEnabled
пример
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
3 ответов
net.fortuna.ical4j.model.CalendarFactory
выходит groovy.util.AbstractFactory
которая расширяет java.lang.Object
. Однако средний класс отсутствует в вашем вводе (вы подавляете соответствующие предупреждения с помощью-dontwarn). При отсутствии части иерархии классов ProGuard не понимает, что CalendarFactory может получить доступ к защищенным методам clone
и finalize
, и он печатает эти предупреждения.
поскольку ваш код, вероятно, не использует класс вообще, вы можете подавить предупреждения:
-dontwarn net.fortuna.ical4j.model.CalendarFactory
или для охватывая все аналогичные классы:
-dontwarn net.fortuna.ical4j.model.**
вы не должны добавлять какие-либо параметры сохранения для этой проблемы; Android SDK уже определяет основные параметры, связанные с Android-keep для вас.
Это мой конфигурационный файл proguard. Попробуйте скопировать-вставить его
-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);
}
затем добавьте свой код, как показано ниже: При использовании
-dontwarn groovy.**
добавить
-keep class groovy.** { *; }
сделать это для всех внешних библиотек.
[обновление 2014-05-30 переформулировал этот текст]
спасибо @EricLafortune ответ, который помог мне понять и решить эту проблему.
для других, кто хочет сжать приложения для android ical4j, вот мое рабочее решение:
все классы с in library class java.lang.Object
- вопрос из пространства имен
net.fortuna.ical4j.model.**
поэтому я добавил Эти строки 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 ** { *; }
статистика:
- без обфускации: 932 класса; apk 911kb.
- с запутыванием: 365 классов; apk 505kb