From e2e1d3111c4843ca5305e16a46fc4261a04414f2 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 13 Oct 2016 06:20:04 +1100 Subject: [PATCH 1/2] Extract code to check for ACRA process into method Makes it easier to document the code and simplifies FDroidApp#onCreate(). --- .../java/org/fdroid/fdroid/FDroidApp.java | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java index c4a9369c2..004ada921 100644 --- a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java +++ b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java @@ -209,13 +209,8 @@ public class FDroidApp extends Application { updateLanguage(); ACRA.init(this); - // if this is the ACRA process, do not run the rest of onCreate() - int pid = android.os.Process.myPid(); - ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); - for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) { - if (processInfo.pid == pid && "org.fdroid.fdroid:acra".equals(processInfo.processName)) { - return; - } + if (isAcraProcess()) { + return; } PRNGFixes.apply(); @@ -317,6 +312,26 @@ public class FDroidApp extends Application { } } + /** + * Asks if the current process is "org.fdroid.fdroid:acra". Note that it is not perfect, because + * some devices seem to not provide a list of running app processes when asked. + * + * The `android:process` statement in AndroidManifest.xml causes another process to be created + * to run {@link org.fdroid.fdroid.acra.CrashReportActivity}. This was causing lots of things + * to be started/run twice including {@link CleanCacheService} and {@link WifiStateChangeService}. + */ + private boolean isAcraProcess() { + int pid = android.os.Process.myPid(); + ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); + for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) { + if (processInfo.pid == pid && "org.fdroid.fdroid:acra".equals(processInfo.processName)) { + return true; + } + } + + return false; + } + @TargetApi(18) private BluetoothAdapter getBluetoothAdapter() { // to use the new, recommended way of getting the adapter From 0e70495046015ee13773c773e628b9b4cbe1e35b Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Thu, 13 Oct 2016 06:22:15 +1100 Subject: [PATCH 2/2] Guard against getRunningAppProcesses() returning null --- .../java/org/fdroid/fdroid/FDroidApp.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java index 004ada921..1c50cc10d 100644 --- a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java +++ b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java @@ -64,6 +64,7 @@ import java.net.URL; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.security.Security; +import java.util.List; import java.util.Locale; import info.guardianproject.netcipher.NetCipher; @@ -313,17 +314,28 @@ public class FDroidApp extends Application { } /** - * Asks if the current process is "org.fdroid.fdroid:acra". Note that it is not perfect, because - * some devices seem to not provide a list of running app processes when asked. + * Asks if the current process is "org.fdroid.fdroid:acra". * - * The `android:process` statement in AndroidManifest.xml causes another process to be created - * to run {@link org.fdroid.fdroid.acra.CrashReportActivity}. This was causing lots of things - * to be started/run twice including {@link CleanCacheService} and {@link WifiStateChangeService}. + * This is helpful for bailing out of the {@link FDroidApp#onCreate} method early, preventing + * problems that arise from executing the code twice. This happens due to the `android:process` + * statement in AndroidManifest.xml causes another process to be created to run + * {@link org.fdroid.fdroid.acra.CrashReportActivity}. This was causing lots of things to be + * started/run twice including {@link CleanCacheService} and {@link WifiStateChangeService}. + * + * Note that it is not perfect, because some devices seem to not provide a list of running app + * processes when asked. In such situations, F-Droid may regress to the behaviour where some + * services may run twice and thus cause weirdness or slowness. However that is probably better + * for end users than experiencing a deterministic crash every time F-Droid is started. */ private boolean isAcraProcess() { - int pid = android.os.Process.myPid(); ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); - for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) { + List processes = manager.getRunningAppProcesses(); + if (processes == null) { + return false; + } + + int pid = android.os.Process.myPid(); + for (RunningAppProcessInfo processInfo : processes) { if (processInfo.pid == pid && "org.fdroid.fdroid:acra".equals(processInfo.processName)) { return true; }