Apache POI的ProGuard设置

3

我正在构建一个应用程序,使用Apache POI库。当我调试应用程序(不运行Proguard编译)时,一切正常,但是在导出APK后,当我运行应用程序并打开Excel文件时,会出现以下异常:

RuntimeException - Caused by: java.lang.ExceptionInInitializerError at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:301)

这是我的Proguard设置文件:

-injars      bin/classes
-injars      libs/android-support-v13.jar
-outjars     bin/classes-processed.jar
-libraryjars /usr/bin/adt/sdk/platforms/android-19/android.jar
-libraryjars libs/poi-3.10.1.jar

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*

-dontwarn org.apache.poi.**
-dontwarn com.google.**
-dontwarn android.support.**

-keep public class * extends android.app.Activity
-keep public class * extends android.support.v4.app.FragmentActivity
-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 class com.android.vending.billing.**

-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

什么是Apache POI在Proguard中的正确配置?我只使用POI来读取旧的(Excel 97)格式,因此不需要所有其他的jar包。

请为org.apache.poi执行相同的keep/ign warn操作。 - Robert Rowntree
当我不使用混淆时,它可以工作,但我想要混淆。 - mittelmania
鉴于Apache POI是开源的,因此代码对每个人都是免费的。为什么你要混淆编译后的POI类呢? - Gagravarr
我不需要混淆POI,但是我需要使用ProGuard来缩小它,所以我别无选择,只能对其进行混淆。 - mittelmania
3个回答

4

用于读写Excel [xls|xlsx]文件。我在Proguard中使用以下代码:

# poi
# https://github.com/centic9/poi-on-android/blob/master/poitest/proguard-rules.pro
    -keeppackagenames aavax.**
-keeppackagenames org.apache.poi.**
-keeppackagenames org.apache.poi.ss.formula.function
-keeppackagenames org.openxmlformats.**
-keeppackagenames org.openxmlformats.schemas.**

-keep class aavax.** {*;}
-keep class org.apache.poi.** {*;}
-keep class org.apache.xmlbeans.** {*;}
-keep class com.fasterxml.** {*;}
-keep class com.microsoft.schemas.** {*;}

-keep class org.openxmlformats.** {*;}
-keep class org.openxmlformats.schemas.** {*;}
-keep class schemaorg_apache_xmlbeans.** {*;}
-keep class schemasMicrosoftComVml.** {*;}
-keep class schemasMicrosoftComOfficeExcel.** {*;}
-keep class schemasMicrosoftComOfficeOffice.** {*;}

-keepclasseswithmembers class aavax.** {*;}
-keepclasseswithmembers class org.apache.poi.** {*;}
-keepclasseswithmembers class org.apache.xmlbeans.** {*;}
-keepclasseswithmembers class com.fasterxml.** {*;}
-keepclasseswithmembers class com.microsoft.schemas.** {*;}

-keepclasseswithmembers class org.openxmlformats.** {*;}
-keepclasseswithmembers class org.openxmlformats.schemas.** {*;}
-keepclasseswithmembers class schemaorg_apache_xmlbeans.** {*;}
-keepclasseswithmembers class schemasMicrosoftComVml.** {*;}
-keepclasseswithmembers class schemasMicrosoftComOfficeExcel.** {*;}
-keepclasseswithmembers class schemasMicrosoftComOfficeOffice.** {*;}

-keep class org.w3c.** {*;}
-keep class org.dom4j.** {*;}
-keep class org.etsi.** {*;}
-keep class com.graphbuilder.** {*;}
-dontwarn org.etsi.**
-dontnote com.microsoft.schemas.**
-dontnote com.graphbuilder.**
-dontwarn org.openxmlformats.**
-dontwarn org.w3c.**
-dontwarn org.dom4j.**
-dontwarn schemasMicrosoftComVml.**
-dontwarn schemasMicrosoftComOfficeExcel.**
-dontwarn schemasMicrosoftComOfficeOffice.**
-dontwarn schemasMicrosoftComOfficeWord.**

1
这对我有用。顺便说一下,这个库的行为是如此不可预测。 - Shahood ul Hassan

4
我最终添加了以下行:

-keep public class org.apache.poi.** {*;}

看起来这似乎解决了问题。


0

添加下列类即可:

-keep class org.apache.poi.** {*;}
-keep class org.apache.xmlbeans.** {*;}
-keep class com.fasterxml.** {*;}
-keep class com.microsoft.schemas.** {*;}
-keep class org.openxmlformats.** {*;}
-keep class org.openxmlformats.schemas.** {*;}
-keep class schemaorg_apache_xmlbeans.** {*;}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接