我尝试压缩一个使用ical4j.jar
的Android应用程序。
当我使用gradle proguardDebug
构建apk时,使用proguard会得到以下警告:
- 警告:net.fortuna.ical4j.model.CalendarFactory:在库类java.lang.Object中找不到引用方法void finalize()。
finalize()
有6个类似的警告
- 警告:net.fortuna.ical4j.model.CalendarFactory:在库类java.lang.Object中找不到引用方法java.lang.Object clone()。
clone()
有6个类似的警告
我已经验证过android-7支持finalize()
和clone()
:“... \ Android ... \ sdk \ platforms \ android-7 \ android.jar”在类java.lang.Object
中具有方法finalize()
和clone()
。
你有任何想法如何解决这个问题吗?
注意:这不是其他“proguard找不到引用方法”的重复问题,因为在我的特定情况下,我认为缺少的方法应该在那里。
我正在使用
- proguard-4.11
- gradle-1.11
- Groovy: 1.8.6
- Ant: Apache Ant(TM) version 1.9.2 compiled on July 8 2013
- Ivy: 2.2.0
- JVM: 1.7.0_25 (Oracle Corporation 23.25-b01)
- OS: 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'),你必须用minifyEnabled替换runProguard
例如:
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
-keep class net.fortuna.ical4j.model.** { *; }
,这使得 APK 额外减少了 60kb。幸运的是,我的 Android 应用程序不使用任何依赖 Groovy 的类。我更新了自己的答案,提供了最终解决方案。 - k3b