Proguard继续打破签名APK

时间:2014-05-27 07:58:03

标签: java android eclipse proguard

我有一个项目,当从eclipse运行时工作正常,但不是通过签名APK安装。

这个项目使用了一些库:

  1. Pulltorefresh
  2. UniversalImageLoader
  3. android support v4(JAR)
  4. gson(JAR)
  5. youtubeandroidplayerapi(JAR)
  6. 我不希望proguard触及任何这些库,所以我在proguard-project.txt中使用它:

    -libraryjars libs
    
    -keep class com.handmark.pulltorefresh.library.** { *; }
    -keep interface com.handmark.pulltorefresh.library.** { *; }
    -keep class com.nostra13.universalimageloader.** { *; }
    -keep interface com.nostra13.universalimageloader.** { *; }
    
    -keep class android.support.v4.app.** { *; }
    -keep interface android.support.v4.app.** { *; }
    -keep class com.google.** { *; }
    -keep interface com.google.** { *; }
    

    这是我的project.properties

    proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
    

    那些proguard代码正在运行,因为我添加它们后生成的APK有更大的尺寸。但是,当我从已签名的APK安装它时,该项目仍在破坏。

    我试图通过这样做找到最新消息:

    retrace.bat -verbose mapping.txt dump.txt
    

    在那之后,我的cmd疯狂输出一些东西,但我不知道错误在哪里

    请帮助我,我刚刚开始学习。提前谢谢。

    修改 对不起伙计们,我的意思是“打破”是我的listview只是不显示任何数据/项目...永远加载。没有例外。

1 个答案:

答案 0 :(得分:2)

Grouguard保留声明

Keep语句是一种告诉Proguard保留代码的方法,即使它们不是直接从应用程序代码中调用的。一个很好的例子是MainActivity Activity。它不会从您的代码中调用,但您仍需要将其保留在最终包中,也不要更改其名称。

这些是您配置的唯一保留语句吗?如果是真的,你会错过一些基本的。以下是最小Android配置的基本示例(第7部分):http://proguard.sourceforge.net/index.html#manual/examples.html

回扫

Retrace是一种重建堆栈跟踪的方法。

首先,我们需要崩溃时的堆栈跟踪。在设备/模拟器上运行APK并获取崩溃异常和堆栈跟踪。它应该看起来像:a.b.m.a()中的NullPointerException。 使用GUI回溯(它更容易使用)来获得实际的堆栈跟踪,然后您可以转到原始代码并尝试调试崩溃。

反思与探索

Proguard打破流量的一个常见原因是Proguard需要通知反思。例如 - 布局XML中的方法调用是通过反射完成的,但由于代码本身没有调用,Proguard不知道它是否保留了相关的方法。

有关此主题的更多信息,请参阅此问题:Android, ProGuard, and keepclasseswithmembernames

如果您想排除反射问题,我建议您首先禁用Proguard代码缩小:http://proguard.sourceforge.net/index.html#FAQ.html