From 445c2957ec1044a302c36062998b60d1f53b77e9 Mon Sep 17 00:00:00 2001 From: Greg Alexander Date: Sun, 16 Jun 2019 23:02:22 -0400 Subject: [PATCH] Don't call startForegroundService() except on Oreo and above, because that's when it was added. --- NOTES | 39 +++++++++++++++++++ .../org/galexander/sshd/BootReceiver.java | 12 +++--- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/NOTES b/NOTES index aa1b292..820fcc2 100644 --- a/NOTES +++ b/NOTES @@ -837,6 +837,45 @@ presumably fails to use the library lookup. It starts on boot as a background service. And rsync and scp work. Only need to test on my Moto X now. +... + +Testing start-on-boot on my Moto Z2 Force, it works, but there is an +infelicity. If I go into Settings and try to turn off foreground +service, it won't let me because start-on-boot is selected and I am using +Oreo. It is supposed to show a toast to let me know this, but the toast +doesn't appear. That's because I had previously disabled notifications +so that the foreground service doesn't have a notification. + +I can make the toast appear by following these steps: re-enable +notifications (manually in Settings -> Apps & Notifications), then +re-start the service, then disable the notification (by long-tapping on +the notification itself). Then toasts work. I think probably it has +saved the fact that all notifications are disabled, because it only knew +one class of notification when it was using compatibility with the old +SDK...but now it knows two classes (a notification and a toast), and it +records that only one class is disabled. I really have no idea but I +think it sucks. + +... + +Testing with Moto X (ARM, Android 5.1 API 22), and it works. But it has +this infelicity...when scp or rsync is run: + + WARNING: linker: /data/app/org.galexander.sshd-2/lib/arm/libscp.so: unused DT entry: type 0x6ffffffe arg 0xb64 + WARNING: linker: /data/app/org.galexander.sshd-2/lib/arm/libscp.so: unused DT entry: type 0x6fffffff arg 0x2 + +These are DT types that are present in the .so which are not supported by +the kernel. It may be because the kernel is CyanogenMod? The types are +DT_VERNEED and DT_VERNEEDNUM. They refer to a section .gnu.version_r, +which I guess holds two 32-byte entries which are unintelligible to me. + +Supposedly I can use an "ELF cleaner" to strip out these DT_VERNEED +things. But there's some ambiguity as to whether they're necessary or +useful. I think I'm gonna leave that be. + +More productively, I found that it won't startForegroundService() because +that was added at Oreo! + XXX - test with Android 16, and on my Moto X, and emulated 26, and emulated 28. diff --git a/app/src/main/java/org/galexander/sshd/BootReceiver.java b/app/src/main/java/org/galexander/sshd/BootReceiver.java index f1ce149..84a6831 100644 --- a/app/src/main/java/org/galexander/sshd/BootReceiver.java +++ b/app/src/main/java/org/galexander/sshd/BootReceiver.java @@ -12,13 +12,15 @@ public class BootReceiver extends BroadcastReceiver { Prefs.init(context); if (Prefs.get_onboot()) { Intent i = new Intent(context, SimpleSSHDService.class); - if (Prefs.get_foreground()) { - context.startForegroundService(i); - } else if (Build.VERSION.SDK_INT >= + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - Toast.makeText(context, + if (Prefs.get_foreground()) { + context.startForegroundService(i); + } else { + Toast.makeText(context, "SimpleSSHD cannot start background at boot since Oreo (see Settings).", - Toast.LENGTH_LONG).show(); + Toast.LENGTH_LONG).show(); + } } else { context.startService(i); }