Android 마켓에서 애플리케이션을 배포했습니다. 논리적으로 이해가되지 않는 곳에서 NullPointerExceptions을 얻고있는 소수의 사용자 (아마도 2 %)에게서 오류 보고서가 다시 전송됩니다.Android proguard 난독 화 코드로 인해서는 안되는 NullPointerException이 발생합니다.
본인 스스로 복제 할 수 없었습니다. 코드는 비교적 간단하며 모든 사용자가 따라야하는 공통 코드 경로입니다. 사실 NPE를 만들 수있는 모든 코드 라인을 가져 와서 try-catch 블록에 래핑하고 사용자 정의 런타임 예외를 throw하지만 여전히 잡히지 않은 NullPointerException 오류가 발생합니다.
내가 생각할 수있는 유일한 점은 내 Proguard 난독 화와 관련된 것입니다. 당신이 이상한 행동을 느낀다면 overovergressive 옵션을 꺼내는 것에 대해 이야기하는 다른 기사를 보았습니다. 그러나 말할 수있는 한, 나는 그 옵션을 사용하지 않고 있습니다.
안드로이드와 프로 가드를 사용하여 신비한 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();
}
그래서 유일한 가능성 나는 게임, 디스패처 및 설정입니다 볼 수 있습니다 참고로
, 여기에 읽을 수있게 NPE을 받고있다 기능입니다.
게임은이 코드를 통해 다른 클래스에 설정됩니다. 게임은 다른 클래스의 최종 변수입니다.
game.setScreen(new MainMenuScreen(game));
dispatcher가 위의 super 호출에서 설정됩니다.
getSettings()는 응용 프로그램의 맨 처음에 설정되고 비공개이며 결코 설정이 해제되지 않는 설정 객체를 반환합니다. 이 방법 이전에도 여러 번 사용되었습니다.
자동 권투 기본 요소가 없습니다.
-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