【发布时间】:2011-11-29 12:41:02
【问题描述】:
我在 Android Marketplace 上分发了一个应用程序。我收到了一小部分用户(可能是 2%)的错误报告,他们收到了 NullPointerExceptions,而这在逻辑上没有意义。
我自己从来没有复制过这个。该代码相对简单,是每个用户都必须遵循的通用代码路径。实际上,我已经获取了可能创建 NPE 的每一行单独的代码,并将其包装在一个 try-catch 块中并抛出一个自定义运行时异常,但我仍然没有捕获到 NullPointerException 错误。
在这一点上,我唯一能想象的就是与我的 Proguard 混淆有关的事情。如果您发现奇怪的行为,我已经看到其他一些文章谈到取出 -overloadaggressively 选项,但据我所知,我没有使用该选项。
有没有其他人使用 android 和 proguard 体验过神秘的 NPE。是否有任何其他设置可供人们推荐以降低可能导致此问题的优化?
还有其他想法吗?
作为参考,这里是获取 NPE 的未混淆函数:
public MainMenuScreen(final HauntedCarnival game) {
super(game);
game.startMusic("data/music/intro.mp3");
stage = new Stage(Screen.SCREEN_WIDTH, Screen.SCREEN_HEIGHT,true);
stage.addActor(new Image("background", Assets.mainMenuBackground));
Image title = new Image("title", Assets.mainMenuTitle);
title.x = 0;
title.y = 340;
resetEyeBlink();
stage.addActor(title);
dispatcher.registerInputProcessor(stage);
settings = game.getSettings();
eyeBlinkImage = new Image("eyeBlink", Assets.eyeBlink);
if (settings.getPlayers().isEmpty()) {
settings.addPlayer("Player One");
settings.save(game);
}
setupContinue();
}
所以我能看到的唯一可能性是游戏、调度程序和设置。
通过此代码在另一个类中设置游戏。 game 是另一个类中的最终变量:
game.setScreen(new MainMenuScreen(game));
dispatcher 在上面对 super 的调用中被设置。
getSettings() 返回一个设置对象,该对象在应用程序的一开始就设置,是私有的并且永远不会取消设置。在此方法之前也使用过几次。
没有自动装箱原语。
这里是 proguard 配置:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keepattributes Signature
-keep public class com.alkilabs.hauntedcarnival.settings.Settings
-keep public class com.alkilabs.hauntedcarnival.settings.Settings {
*;
}
-keep public class com.alkilabs.hauntedcarnival.settings.Player
-keep public class com.alkilabs.hauntedcarnival.settings.Player {
*;
}
-keepnames public class com.alkilabs.hauntedcarnival.world.World
-keepnames public class * extends com.alkilabs.hauntedcarnival.world.upgrades.Upgrade
-keepnames public class * extends com.alkilabs.hauntedcarnival.world.achievments.Achievement
-keepnames public class com.alkilabs.hauntedcarnival.world.monsters.MonsterType
-keepclassmembers class * extends com.alkilabs.hauntedcarnival.world.monsters.Monster {
public <init>(com.alkilabs.hauntedcarnival.world.monsters.MonsterType, java.lang.Integer, com.alkilabs.hauntedcarnival.world.World);
}
-keepnames public class com.alkilabs.hauntedcarnival.world.items.ItemType
-keepclassmembers class * extends com.alkilabs.hauntedcarnival.world.items.Item {
public <init>(com.alkilabs.hauntedcarnival.world.World, java.lang.Integer, java.lang.Integer);
}
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-dontwarn com.badlogic.gdx.scenes.scene2d.ui.utils.DesktopClipboard
-dontwarn com.badlogic.gdx.utils.JsonWriter
-dontwarn com.badlogic.gdx.utils.XmlWriter
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
【问题讨论】:
-
您能否发布导致您使用的 NPE 和 ProGuard 设置的代码?
-
我添加了有关特定代码和我的 proguard 配置的更多详细信息
标签: java android nullpointerexception proguard