From 2897dcb67e18e4d81c4b2a92ebffab2aabed7516 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 24 May 2016 20:52:45 +0200 Subject: [PATCH] fix crash when InstallManager is killed while actively downloading This is very related to #660 but this time, I can't see any other way to solve it but a null guard. I don't think it is possible to guarantee that the Downloader.ACTION_INTERRUPTED receiver will be unregistered since onDestroy() might not even be called. java.lang.NullPointerException at org.fdroid.fdroid.installer.InstallManagerService.removeFromActive(InstallManagerService.java:328) at org.fdroid.fdroid.installer.InstallManagerService.access$400(InstallManagerService.java:58) at org.fdroid.fdroid.installer.InstallManagerService$4.onReceive(InstallManagerService.java:212) at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297) at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46) at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5353) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:830) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646) at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) at dalvik.system.NativeStart.main(Native Method) --- .../fdroid/installer/InstallManagerService.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java index 144eeef95..237a2584b 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -357,9 +357,18 @@ public class InstallManagerService extends Service { TEMP_HACK_APP_NAMES.put(urlString, app.name); // TODO delete me once InstallerService exists } + /** + * Remove the {@link App} and {@Apk} instances that are associated with + * {@code urlString} from the {@link Map} of active apps. This can be + * called after this service has been destroyed and recreated based on the + * {@link BroadcastReceiver}s, in which case {@code urlString} would not + * find anything in the active maps. + */ private static Apk removeFromActive(String urlString) { Apk apk = ACTIVE_APKS.remove(urlString); - ACTIVE_APPS.remove(apk.packageName); + if (apk != null) { + ACTIVE_APPS.remove(apk.packageName); + } return apk; }