App stürzt beim Start durch NPE in android.content.Context.getString

Wir haben einen wirklich seltsamen Crash, der auf die Systemklassen hinweist. Es erscheint beim Start der Anwendung.

Fatal Exception: java.lang.RuntimeException: Kann die Aktivität nicht starten ComponentInfo {com.myapp.android/com.myapp.android.main.BaseMainActivity}: java.lang.RuntimeException: Die Anwendung com.myapp.android.main kann nicht erstellt werden. MyApp: java.lang.NullPointerException bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2377) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2429) bei android.app.ActivityThread.access $ 800 (ActivityThread.java : 151) bei android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1342) bei android.os.Handler.dispatchMessage (Handler.java:110) bei android.os.Looper.loop (Looper.java:193) Bei android.app.ActivityThread.main (ActivityThread.java:5333) bei java.lang.reflect.Method.invokeNative (Method.java) bei java.lang.reflect.Method.invoke (Method.java:515) bei com. Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:828) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:644) bei dalvik.system.NativeStart.mai N (NativeStart.java) Verursacht von java.lang.RuntimeException: Kann keine Anwendung erstellen com.myapp.android.main.MyApp: java.lang.NullPointerException bei android.app.LoadedApk.makeApplication (LoadedApk.java:529) bei android .app.ActivityThread.performLaunchActivity (ActivityThread.java:2292) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2429) bei android.app.ActivityThread.access $ 800 (ActivityThread.java:151) bei android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1342) bei android.os.Handler.dispatchMessage (Handler.java:110) bei android.os.Looper.loop (Looper.java:193) bei android.app.ActivityThread.main ( ActivityThread.java:5333) bei java.lang.reflect.Method.invokeNative (Method.java) bei java.lang.reflect.Method.invoke (Method.java:515) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller .run (ZygoteInit.java:828) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:644) bei dalvik.system.NativeStart.main (NativeStart.java) Verursacht von java.lang.NullPointerEx (Context.java:343) bei com.myapp.android.api.singletons.AppTrackingInstance.initAdjust (AppTrackingInstance.java:114) bei com.myapp.android.api.singletons.AppTrackingInstance. (AppTrackingInstance.java:92) bei com.myapp.android.injection.modules.ApplicationScopeModule.provideAppTrackingInstance (ApplicationScopeModule.java:326) bei com.myapp.android.injection.modules.ApplicationScopeModule $$ ModulAdapter $ ProvideAppTrackingInstanceProvidesAdapter.get (ApplicationScopeModule $ $ ModuleAdapter.java: 1618) bei com.myapp.android.injection.modules.ApplicationScopeModule $$ ModuleAdapter $ ProvideAppTrackingInstanceProvidesAdapter.get (ApplicationScopeModule $$ ModuleAdapter.java: 1552) bei dagger.internal.Linker $ SingletonBinding.get (Linker.java : 364) bei com.myapp.android.main.MyApp $$ InjectAdapter.injectMembers (MyApp $$ InjectAdapter.java: 70) bei com.myapp.android.main.MyApp $$ InjectAdapter.injectMembers (MyApp $$ InjectAdapter.java : 23) bei dagger.ObjectGraph $ DaggerObjectGraph.in Ject (ObjectGraph.java:281) bei com.myapp.android.main.MyApp $ 1.run (MyApp.java:57) bei com.myapp.android.main.MyApp.onCreate (MyApp.java:51) bei android. App.Instrumentation.callApplicationOnCreate (Instrumentation.java:1007) bei android.app.LoadedApk.makeApplication (LoadedApk.java:526) bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2292) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2429) bei android.app.ActivityThread.access $ 800 (ActivityThread.java:151) bei android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1342) bei android.os.Handler.dispatchMessage (Handler .java: 110) bei android.os.Looper.loop (Looper.java:193) bei android.app.ActivityThread.main (ActivityThread.java:5333) bei java.lang.reflect.Method.invokeNative (Method.java) Bei java.lang.reflect.Method.invoke (Method.java:515) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:828) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:644) bei dalvik.syste M.NativeStart.main (NativeStart.java)

  • Android SeekBar setOnSeekBarChangeListener
  • Bild GridView Inside Fragment
  • Wie installiere ich eine JRE oder JDK, um die Android Developer Tools unter Windows 7 auszuführen?
  • Wie man korrekte app Symbole Größen in Android, einschließlich für Amazon Kindle Fire?
  • Android Studio (2.2.0 und 2.2.1) sendet falsch ABI Split auf Gerät
  • Wie bekomme ich die Benachrichtigung von der Benachrichtigungsleiste programmgesteuert in android?
  • Wir verwenden Dagger 1 , unsere Anwendung ist multidex -ed.

    Dolchmodul:

     @Module( library = true, injects = { MyApp.class } ) public class ApplicationScopeModule { private final MyApp application; public ApplicationScopeModule(MyApp application) { this.application = application; } @Provides @Singleton @ForApplication Context provideApplicationContext() { return application.getApplicationContext(); } @Provides @Singleton AppTrackingInstance provideAppTrackingInstance(@ForApplication Context context) { return new AppTrackingInstance(context); } } 

    MyApp Klasse:

     package com.myapp.android.main; public class MyApp extends MultiDexApplication { private ObjectGraph objectGraph; @Inject AppTrackingInstance appTrackingInstance; @Override public void onCreate() { super.onCreate(); // workaround for multi-dex enabled projects // taken from http://frogermcs.github.io/MultiDex-solution-for-64k-limit-in-Dalvik/ // multi-dex separates dex files, and some classes going to additional dex file. // Additional .dex files are loaded in Application.attachBaseContext(Context) method // (by MultiDex.install(Context) invokation). It means, that before this moment // we can't use classes from them. So ie we cannot declare static fields // with types attached out of main .dex file. // Otherwise we'll get java.lang.NoClassDefFoundError. // // the issue should be fixed on the Android level // new Runnable() { @Override public void run() { initFabric(); objectGraph = ObjectGraph.create(getModules().toArray()); objectGraph.inject(MyApp.this); appTrackingInstance.trackAppLaunch(); } }.run(); } private void initFabric() { Fabric.with(MyApp.this, new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(BuildConfig.IS_DEBUG_BUILD).build()).build()); } public List<Object> getModules() { return Arrays.<Object>asList(new ApplicationScopeModule(this)); } public ObjectGraph getObjectGraph() { return objectGraph; } } 

    AppTrackingInstance Klasse:

     package com.myapp.android.api.singletons; public class AppTrackingInstance { Context context; public AppTrackingInstance(Context context) { this.context = context; initAdjust(); } private void initAdjust() { // "broken" context here String variable = context.getString(R.string.adjust_variable); } } 

    Von der Implementierung und Stacktrace bekommen wir die Crashursache:

    Verursacht durch java.lang.NullPointerException bei android.content.Context.getString (Context.java:343)

    Es bedeutet, dass, wenn der Benutzer startet die Anwendung, Dagger injiziert in AppTrackingInstance "gebrochen" Anwendungskontext. Wie kann es sein? Wir benutzen Dagger weit, und dieser Kontext wurde an vielen Orten ohne Probleme injiziert. Nur in einigen konkreten Fällen (die ich nicht reproduzieren kann) App stürzt beim Start durch gebrochenen Kontext ab.

    Crash erscheint auf verschiedenen Geräten und OS-Versionen, meistens auf 4.x OS, erscheint aber selten auf einigen 5.0.2 OS Versionen zu: 1 Screenshot 2 screenshot 3 screenshot

    Da es ein Crash auf App-Start ist, habe ich es sehr untersucht und fand ganz ähnliche Probleme ( 1 , 2 , App-Crash auf Update ).

    Als ich einige Testgeräte – Nexus 4 (Android 5.0.1), Samsung S3 (Android 4.3) – und versuchte, das Problem zu reproduzieren:

    • Offene Anwendung mit / ohne Internetverbindung
    • 50x mal die Anwendung öffnen / schließen
    • Offene Anwendung, deinstallieren aus dem Spielmarkt, installiere den Backoffice-Markt und öffne wieder
    • Offene Anwendung von verschiedenen Deeplinks
    • Offene Anwendung von mobiler Website
    • Installiere Anwendung vom Spielmarkt und öffne sie nicht. Kaltstart von Deeplinks
    • Offene Anwendung von Push-Benachrichtigungen
    • Offene Anwendung mit verschiedenen Locales
    • Offene Bewerbung von recents
    • Klarte App-Daten und offen
    • Installieren Sie alte Produktionsaufbau, aktualisieren Sie auf die neueste Fertigung manuell
    • Installieren Sie alte Produktionsaufbau, aktualisieren Sie auf die neueste aus dem Spielmarkt
    • Navigieren Sie durch die Anwendung XXX Minuten, dann aktualisieren Sie auf die neueste Version aus dem Spielmarkt

    0 stürzt während dieser Tests ab, aber der Absturz erscheint immer noch auf Benutzern, und ich habe keine Ahnung, warum es passiert.

    Wahrscheinlich passiert es die Ursache von multidex oder Dagger 1 , aber ich kann nicht mit Vertrauen sagen.

  • Wie kann ich Android-Listenansicht aktualisieren?
  • Wie benutzt man multipart / form-data Bild / Bild auf Android hochladen
  • Erkennung von ViewPager-Registerkarte im Inneren des Fragments
  • Wie man Schatten unterhalb der Aktionsleiste mit AppCompat.Light.NoActionBar entfernt?
  • Löschen Sie Aktivität Stack und starten Sie neue Aktivität in Android
  • ListView und Schaltflächen in ListView
  • 2 Solutions collect form web for “App stürzt beim Start durch NPE in android.content.Context.getString”

    Fatal Exception: java.lang.RuntimeException: Kann die Aktivität nicht starten ComponentInfo {…….

    Ich hatte so ein Stapelstapel einmal und es ist absolut nicht so beängstigend, da hört es sich an. Es bedeutet, Ausnahme wurde in onCreate() von MyApp .

    Ie context.getResources() , die Sie der AppTrackingInstance Klasse zur Verfügung gestellt haben, ist null und es verursacht einen Absturz.

    Der Grund, warum getResources() return null (=> Absturz passiert) für mich klingt wie eine Rennbedingung , vor allem, wie es nicht jedes Mal passiert (von dem, was ich von der Post verstanden).

    Da bin ich auch mit Dagger1 und MultiDex und ich habe nicht dieses Problem, kann ich erraten, dass mögliche Lösung wäre zu beginnen initialize ObjectGraph faul zu starten.

    Dieser Snippet funktioniert wie ein Charme für mich:

     public final class ApplicationScopeModule { private final Context applicationContext; public ApplicationScopeModule(final Context applicationContext) { this.applicationContext = applicationContext; } @Provides @Singleton @SuppressWarnings("unused") // invoked by Dagger public Context provideApplicationContext() { return applicationContext; } @Provides @Singleton @SuppressWarnings("unused") // invoked by Dagger public Analytics provideAnalytics(Context context) { return new DefaultAnalytics(context); } //...<other providers>.. } 

    MyApplication , die Application :

     public class MyApplication extends Application { private ObjectGraph objectGraph; private final Object lock = new Object(); @Override public void onCreate() { super.onCreate(); } protected List<Object> getModules() { final ArrayList<Object> modules = new ArrayList<>(); modules.add(new ApplicationScopeModule(getApplicationContext())); return modules; } public ObjectGraph getApplicationGraph() { synchronized (lock) { if (objectGraph == null) { objectGraph = ObjectGraph.create(getModules().toArray()); } return objectGraph; } } } 

    Dann in der ActivityBase 's – die Basisklasse für jede Activity ich in app verwenden:

     public abstract class FragmentActivityBase extends ActionBarActivity { private ObjectGraph activityGraph; @Override protected void onCreate(final Bundle savedInstanceState) { inject(this); super.onCreate(savedInstanceState); } public void inject(final Object object) { try { if (activityGraph == null) { final MyApplication application = (MyApplication) getApplication(); activityGraph = application.getApplicationGraph(); } activityGraph.inject(object); } catch (IllegalArgumentException e) { //log error } } } 

    Es sollte Ihnen helfen, da während des onCreate() der ersten Activity (Erweiterung von ActivityBase ) Ressourcen definitiv bereits definiert sind, also getResources() sollte nicht zurückkehren null.

    Weitere zwei Optionen sind

    • Vermeiden Sie Multidex
    • Umfrage für den Moment, wenn Ihr Kontext voll ist (obwohl, einmal getResources () ausfallen – wer weiß, was sonst falsch sein könnte und ich fürchte, es wird zu anderen Abstürzen führen – imho)

    Ich hoffe, es hilft.

    Es scheint, dass das Kontextobjekt nicht initialisiert wird. Fehler ist in diesem Aufruf:

     @Provides @Singleton AppTrackingInstance provideAppTrackingInstance(@ForApplication Context context) { return new AppTrackingInstance(context); } 

    Überprüfen Sie, ob der Kontext in dieser Methode null ist. Ich glaube, das Problem ist da.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.