【问题标题】:Keep class from shrinking防止班级缩水
【发布时间】:2013-06-24 20:38:02
【问题描述】:

在我的 android 应用程序中,我有一个 DbHelper 类,它扩展了 OrmLiteSqliteOpenHelper,它扩展了 SQLiteOpenHelper。在项目上运行 ProGuard 成功完成,但稍后在运行时出现错误:java.lang.NoClassDefFoundError: com.example.myapp.mypackage.DbHelper

我已将-keep class com.example.myapp.mypackage.** { *; } 添加到proguard-project.txt 中以排除我的DbHelper 缩小,但这没有帮助。

我还尝试添加 -dontshrink 标志,仅用于测试,以禁用收缩步骤,但这也无济于事。

任何建议我做错了什么以及尝试什么?谢谢

UPD:完整的堆栈跟踪

    E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.NoClassDefFoundError: com.example.myapp.mypackage.DbHelper
    at com.example.myapp.App.onCreate(App.java:78)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1000)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4391)
    at android.app.ActivityThread.access$1300(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1294)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5041)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    at dalvik.system.NativeStart.main(Native Method)

UPD 2: 对于 OrmLite,我正在使用此配置

-keep class com.j256.**
-keepclassmembers class com.j256.** { *; }
-keep enum com.j256.**
-keepclassmembers enum com.j256.** { *; }
-keep interface com.j256.**
-keepclassmembers interface com.j256.** { *; }

UPD 3: 我尝试使用 dex2jar 工具从 proguarded apk 中取消索引 classes.dex,而我的 DbHelper 恰好存在于它应该在的位置

UPD 4: 不,这不是测试应用程序,这是通常的 android 应用程序

UPD 5: 是的,DbHelper 使用了一些来自支持包的东西,并且在来自支持包的 proguarded apk 类中被遗漏了。在proguard-project.txt 我有这个配置用于支持包和Action Bar Sherlock

-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class com.actionbarsherlock.** { *; }
-keep interface com.actionbarsherlock.** { *; }

如何正确配置 ProGuard 以防止支持包缩小?

【问题讨论】:

  • com.example.myapp.mypackage.DbHelper 应该在最终的 APK 中。您可以从堆栈跟踪中发布更多信息吗?为确保 DBHelper 存在,您可以解压缩 APK 并取消分类 classes.dex 文件
  • 你有没有试过同时keep你的DbHelperOrmLiteSqliteOpenHelper
  • 奇怪...你能解压最终的APK,解压它并比较源结构和你的期望吗?
  • 这是安卓测试应用吗?
  • DBHelper 是否扩展或使用支持包中的某些内容?支持包中的类是否在最终 APK 中导出?当我不导出 Android 私有库时,我遇到了这类问题。

标签: android obfuscation proguard shrink


【解决方案1】:

非常感谢@gunar 的帮助。我解决了这个问题,原因是我在proguard-project.txt 中包含支持包为-libraryjars 而不是-injars。因此,它的内容没有被打包到生成的 apk 中,并且 dalvik 无法在运行时初始化 DbHelper,它使用支持包中的类

【讨论】:

    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2010-10-14
    • 2018-02-26
    • 1970-01-01
    • 2014-06-16
    相关资源
    最近更新 更多