【问题标题】:Running signed android app, NPE occurs, possibly due to proguard?运行签名的android应用程序,发生NPE,可能是由于proguard?
【发布时间】:2014-05-25 23:22:40
【问题描述】:

我有一个我一直在开发的 Android 应用程序,现在可以启动了。从 eclipse unsigned 运行它效果很好。当我导出签名副本并运行它时,会发生 NPE。我尝试使用最新提供的 proguard 文件(proguard-android.txt 和 proguard-android-optimize.txt)创建签名版本。两者都没有区别。我通过本地 proguard 配置文件制作的唯一 mod 是留下行号,以便我可以获得不错的堆栈跟踪。

NPE 让我摸不着头脑。我使用锁对象进行同步,并在对象定义中以及流初始化期间对其进行初始化:

public class HttpRequest extends NetworkRequest {
  private transient Object lock = new Object();
<snip>
private void readObject(java.io.ObjectInputStream in)
  throws IOException, ClassNotFoundException {
  in.defaultReadObject();
  lock = new Object();
}

在我的调试版本中,锁永远不会为空,但在我的签名版本中,当我去使用锁对象时,它始终为空。我只能假设 proguard 正在做我不想要的事情,但这是我第一次深入研究 proguard,所以我有点脱离了我的元素。

谁能建议我如何进一步调试?

【问题讨论】:

  • 您是否以任何方式序列化此HttpRequest 对象?如果是这样,this question 可能值得一读/复制。
  • @Makoto 但这不应该与混淆无关吗?

标签: java android proguard


【解决方案1】:

Proguard 做了三件事:收缩、优化、混淆。

在收缩步骤中,它会删除任何未使用的程序代码。您可能遇到的情况是,Proguard 可能正在剥离 readObject 方法,因为它似乎没有被使用。我希望该方法有一个开箱即用的保留规则,但显然没有,或者至少在 Android SDK 中没有。

验证的一种方法是在 proguard 配置中使用 -dontobfuscate 组装您的应用,然后从 APK 包中提取 classes.dex 文件并运行 dexdump classes.dex 并查找是否存在 @987654324 @方法。

最终,为了确保 readObject 方法被保留,您需要在 ProGuard 配置中添加以下规则:

-keepclassmembers class * implements java.io.Serializable {
  private void readObject(java.io.ObjectInputStream);
}

由 mvsjes2 更新以添加实际对我有用的配置:

-keepnames class * implements java.io.Serializable

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

【讨论】:

  • 谢谢你!当我尝试您的解决方案时,它改进了一些事情,但问题转移到了与流相关的其他事情上。我使用从 proguard 站点获取的对我有用的配置更新了答案。
猜你喜欢
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
相关资源
最近更新 更多