java - Apache POI 的 ProGuard 设置

标签 java android apache-poi proguard

我正在构建一个使用 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>;
}

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

最佳答案

我最后添加了以下行:

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

这似乎解决了问题

关于java - Apache POI 的 ProGuard 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25582741/

相关文章:

java - POI 支持是否启用跟踪更改 API?

Java - 使用大型 Excel 进行读取、处理、写入

java - 使用全局类或java反射为play框架中的所有 Controller 添加注释

java - 以编程方式从 android 中的 manifest.xml 中检索权限

java - 使用 setOnCheckedChangeListener 的复选框持有者

android - 三星 Tab3 上的 sendUserActionEvent() mView==null

android - 从 android 相机图像中过滤红外源

java - xstream 中的映射属性

java - 使用 ant 任务编译 Groovy 文件

java - 如何使用POI取消单词段落中西文间距自动调整