繁体   English   中英

运行签名的android应用,可能由于proguard导致发生NPE?

[英]Running signed android app, NPE occurs, possibly due to proguard?

我有一个正在开发的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();
}

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

谁能建议我可以进一步调试吗?

Proguard做三件事:缩小,优化,混淆。

在收缩步骤中,它将切出所有未使用的程序代码。 您可能正在发生的事情是,Proguard可能会剥离readObject方法,因为它似乎未使用。 我希望该方法可以立即使用,但显然在Android SDK中没有,或者至少没有。

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

最终,要确保保留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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM