我尝试压缩一个消耗ical4j.jar
的安卓应用程序。
当我使用 proguard 构建 apk 时,我得到 gradle proguardDebug
- 警告:net.fortuna.ical4j.model.CalendarFactory:在库类 java.lang.Object 中找不到引用的方法 'void finalize(('
- 6 个针对
finalize()
的类似警告
- 6 个针对
- 警告:net.fortuna.ical4j.model.CalendarFactory:在库类 java.lang.Object 中找不到引用的方法 'java.lang.Object clone(('
- 6 个针对
clone()
的类似警告
- 6 个针对
我已经验证了 android-7 支持finalize()
和clone()
:"...\Android...\sdk\platforms\android-7\android.jar"在第 java.lang.Object
类中有finalize()
和clone()
的方法。
你知道怎么解决这个问题吗?
注意:这不是其他"proguard 找不到引用方法"问题的副本,因为在我的特定情况下,我认为应该存在缺少的方法。
我正在使用
- Proguard-4.11 与
- 格拉德尔-1.11
- 凹槽:1.8.6 Ant
- : Apache Ant(TM( 1.9.2 版本编译于 2013 年 7 月 8 日
- 常春藤:2.2.0
- JVM:1.7.0_25(甲骨文公司 23.25-b01(
- 操作系统: 视窗 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'(,您必须替换运行Proguard with minifyEnabled
例
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
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.**
您不应该为此问题添加任何 -keep 选项;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