android - 防止类(class)缩小

标签 android obfuscation proguard shrink

在我的 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)

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

更新 3: 我尝试使用 dex2jar 工具从 protected apk 中解开 classes.dex 并且我的 DbHelper 存在于它应该存在的位置

更新 4: 不,这不是测试应用程序,这是普通的 Android 应用程序

更新 5: 是的,DbHelper 使用支持包中的某种东西,并且在支持包中的 proguarded apk 类中丢失了。在 proguard-project.txt 中,我有支持包和操作栏 Sherlock 的配置

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

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

最佳答案

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

关于android - 防止类(class)缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17341544/

相关文章:

android - 如何完全摆脱 Activity 的 GUI(避免黑屏)

android - 在 webview 而不是默认浏览器中打开链接

android - 更新 SDK 后,Pixel 启动器一直停止

java - Proguard 提示外部 JAR 中缺少类。如何正确解决这个问题?

java - 如何使用非主要 Activity 在统一游戏中捕获自定义网址?

.net - 有使用 CryptoObfuscator 或 CryptoLicensing 的经验吗?

JavaScript 保护

java - 在Java中分配空引用时是否可能抛出运行时异常?

android - 使用 Android Studio 生成 Pro Guard 配置文件

android - Proguard 4.7 与 Eclipse SDK 3.7.1 : Proguard fails with java. io.IOException -(堆栈映射框架中的未知验证类型 [25])