【问题标题】:ProGuard settings for Apache POIApache POI 的 ProGuard 设置
【发布时间】:2014-08-30 13:12:01
【问题描述】:

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

【问题讨论】:

  • stackoverflow.com/questions/25469560/… 对 org.apache.poi 执行相同的保持/忽略警告。
  • 当我不使用混淆时它可以工作,但是我想要混淆
  • 鉴于 Apache POI 是开源的,因此代码可供所有人免费使用,您到底为什么要混淆编译后的 POI 类?
  • 我不需要混淆 POI,但是我需要它被 ProGuard 缩小,所以我别无选择,只能混淆它

标签: java android apache-poi proguard


【解决方案1】:

我最终添加了以下行:

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

这似乎解决了问题

【讨论】:

    【解决方案2】:

    用于读取/写入 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.**
    

    【讨论】:

    • 这对我有用。顺便说一句,这个库的行为是如此不可预测。
    【解决方案3】:

    添加下一个类就足够了:

    -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.** {*;}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多