我已經在Android Marketplace上分發了一個應用程序。我從一小部分用戶(可能是2%)收到錯誤報告,他們在那裏得到NullPointerExceptions,而這在邏輯上並不合理。Android proguard混淆代碼導致NullPointerException,當它真的不應該
我從來沒有能夠自己複製這個。代碼相對簡單,是每個用戶必須遵循的通用代碼路徑。我實際上已經採取了可能創建NPE並將其包裝在try-catch塊中並引發自定義運行時異常的每一行代碼,但我仍然遇到NullPointerException錯誤未被捕獲。
在這一點上,我能想象到的唯一的事情就是與我的Proguard混淆有關的東西。如果您注意到奇怪的行爲,我已經看過其他一些文章談論取消超越選項,但據我所知,我沒有使用該選項。
有沒有人經歷過使用android和proguard的神祕NPEs。是否還有其他設置可以推薦用於撥出可能導致此問題的優化?
還有其他想法嗎?
僅供參考,這裏是得到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.setScreen(new MainMenuScreen(game));
調度程序在調用超級以上時被設置。
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設置的代碼? – Idolon
我添加了更多關於特定代碼和我的proguard配置的詳細信息 – Paul