From be5478169ade12c2fd151e563fa1d9aaab14ac07 Mon Sep 17 00:00:00 2001 From: Josh Kasten Date: Wed, 26 Jun 2024 14:45:40 -0400 Subject: [PATCH 1/3] fix minification compatibility with stub classes If the app project had android.enableR8.fullMode=true (default true with AGP 8+) the stub classes that start with "misconfigured" would removed. This would cause a "could not be instantiated" exception to be thrown when initializing as the code assumes there would be some class that implements the interface, an example INotificationsManager. The stub classes are removed in the minification step since they are created with reflection via ServiceProvider.getService(). Anytime reflection is used there you must add special Proguard consumer rules to keep those classes. In this case we only need to make sure the class itself exists, so we use "(...);" in the rule which means keep the default constructor. --- OneSignalSDK/onesignal/core/consumer-rules.pro | 4 +++- .../com/onesignal/core/internal/minification/KeepStub.kt | 8 ++++++++ .../inAppMessages/internal/MisconfiguredIAMManager.kt | 6 ++++-- .../location/internal/MisconfiguredLocationManager.kt | 4 +++- .../internal/MisconfiguredNotificationsManager.kt | 7 +++++-- 5 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/minification/KeepStub.kt diff --git a/OneSignalSDK/onesignal/core/consumer-rules.pro b/OneSignalSDK/onesignal/core/consumer-rules.pro index d5ba5fee12..ccca563080 100644 --- a/OneSignalSDK/onesignal/core/consumer-rules.pro +++ b/OneSignalSDK/onesignal/core/consumer-rules.pro @@ -14,4 +14,6 @@ -keepclassmembers class com.onesignal.common.** { *; } --keep class ** implements com.onesignal.common.modules.IModule { *; } \ No newline at end of file +-keepclassmembers @com.onesignal.core.internal.minification.KeepStub class * { (...); } + +-keep class ** implements com.onesignal.common.modules.IModule { *; } diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/minification/KeepStub.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/minification/KeepStub.kt new file mode 100644 index 0000000000..cfa8f589a4 --- /dev/null +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/minification/KeepStub.kt @@ -0,0 +1,8 @@ +package com.onesignal.core.internal.minification + +/** + * Purpose: Use on stub classes that are expected to always exists when + * aggressive minification is enabled on the app. + * - Such as android.enableR8.fullMode. + */ +annotation class KeepStub diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/inAppMessages/internal/MisconfiguredIAMManager.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/inAppMessages/internal/MisconfiguredIAMManager.kt index dbb124db43..cbc21d95f0 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/inAppMessages/internal/MisconfiguredIAMManager.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/inAppMessages/internal/MisconfiguredIAMManager.kt @@ -1,13 +1,15 @@ package com.onesignal.inAppMessages.internal +import com.onesignal.core.internal.minification.KeepStub import com.onesignal.inAppMessages.IInAppMessageClickListener import com.onesignal.inAppMessages.IInAppMessageLifecycleListener import com.onesignal.inAppMessages.IInAppMessagesManager /** - * The misconfigured IAMManager is an implementation of [IInAppMessagesManager] that warns the user they - * have not included the appropriate IAM module. + * The misconfigured IAMManager is an implementation of [IInAppMessagesManager] + * that warns the dev they have not included the appropriate IAM module. */ +@KeepStub internal class MisconfiguredIAMManager : IInAppMessagesManager { override var paused: Boolean get() = throw EXCEPTION diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt index 1e950631ef..af59ddf1b3 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt @@ -1,11 +1,13 @@ package com.onesignal.location.internal +import com.onesignal.core.internal.minification.KeepStub import com.onesignal.location.ILocationManager /** - * The misconfigured IAMManager is an implementation of [ILocationManager] that warns the user they + * The misconfigured IAMManager is an implementation of [ILocationManager] that warns the dev they * have not included the appropriate location module. */ +@KeepStub internal class MisconfiguredLocationManager : ILocationManager { override var isShared: Boolean get() = throw EXCEPTION diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt index a82296a432..8458eef435 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt @@ -1,14 +1,17 @@ package com.onesignal.notifications.internal +import com.onesignal.core.internal.minification.KeepStub import com.onesignal.notifications.INotificationClickListener import com.onesignal.notifications.INotificationLifecycleListener import com.onesignal.notifications.INotificationsManager import com.onesignal.notifications.IPermissionObserver /** - * The misconfigured NotificationsManager is an implementation of [INotificationsManager] that warns the user they - * have not included the appropriate notifications module. + * The misconfigured NotificationsManager is an implementation of + * [INotificationsManager] that warns the dev they have not included the + * appropriate notifications module. */ +@KeepStub internal class MisconfiguredNotificationsManager : INotificationsManager { override val permission: Boolean get() = throw EXCEPTION From 2b2e76ae403a3910073d087aad9b8a48ca36490f Mon Sep 17 00:00:00 2001 From: Josh Kasten Date: Wed, 26 Jun 2024 14:49:48 -0400 Subject: [PATCH 2/3] fix stacktrace for missing module exception We need to ensure the exception is created at the time of the call instead of upfront. As the stack trace reported by the exception is when it is instantiated. --- .../onesignal/location/internal/MisconfiguredLocationManager.kt | 2 +- .../notifications/internal/MisconfiguredNotificationsManager.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt index af59ddf1b3..2786833c31 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt @@ -16,6 +16,6 @@ internal class MisconfiguredLocationManager : ILocationManager { override suspend fun requestPermission(): Boolean = throw EXCEPTION companion object { - private val EXCEPTION = Exception("Must include gradle module com.onesignal:Location in order to use this functionality!") + private val EXCEPTION get() = Exception("Must include gradle module com.onesignal:Location in order to use this functionality!") } } diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt index 8458eef435..37732ed9f2 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt @@ -39,6 +39,6 @@ internal class MisconfiguredNotificationsManager : INotificationsManager { override fun removeClickListener(listener: INotificationClickListener) = throw EXCEPTION companion object { - private val EXCEPTION = Exception("Must include gradle module com.onesignal:Notification in order to use this functionality!") + private val EXCEPTION get() = Exception("Must include gradle module com.onesignal:Notification in order to use this functionality!") } } From 61590d2a4fb9974737874b6eb38730c6ba69abf0 Mon Sep 17 00:00:00 2001 From: Josh Kasten Date: Wed, 26 Jun 2024 14:51:18 -0400 Subject: [PATCH 3/3] simplify stubs --- .../inAppMessages/internal/MisconfiguredIAMManager.kt | 2 +- .../location/internal/MisconfiguredLocationManager.kt | 2 +- .../internal/MisconfiguredNotificationsManager.kt | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/inAppMessages/internal/MisconfiguredIAMManager.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/inAppMessages/internal/MisconfiguredIAMManager.kt index cbc21d95f0..4a5be6bcc0 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/inAppMessages/internal/MisconfiguredIAMManager.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/inAppMessages/internal/MisconfiguredIAMManager.kt @@ -37,7 +37,7 @@ internal class MisconfiguredIAMManager : IInAppMessagesManager { override fun removeClickListener(listener: IInAppMessageClickListener) = throw EXCEPTION companion object { - private val EXCEPTION: Throwable get() = + private val EXCEPTION get() = Exception( "Must include gradle module com.onesignal:InAppMessages in order to use this functionality!", ) diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt index 2786833c31..7b6dc68224 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/location/internal/MisconfiguredLocationManager.kt @@ -13,7 +13,7 @@ internal class MisconfiguredLocationManager : ILocationManager { get() = throw EXCEPTION set(value) = throw EXCEPTION - override suspend fun requestPermission(): Boolean = throw EXCEPTION + override suspend fun requestPermission() = throw EXCEPTION companion object { private val EXCEPTION get() = Exception("Must include gradle module com.onesignal:Location in order to use this functionality!") diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt index 37732ed9f2..30d320ff15 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/notifications/internal/MisconfiguredNotificationsManager.kt @@ -13,12 +13,12 @@ import com.onesignal.notifications.IPermissionObserver */ @KeepStub internal class MisconfiguredNotificationsManager : INotificationsManager { - override val permission: Boolean + override val permission get() = throw EXCEPTION - override val canRequestPermission: Boolean + override val canRequestPermission get() = throw EXCEPTION - override suspend fun requestPermission(fallbackToSettings: Boolean): Boolean = throw EXCEPTION + override suspend fun requestPermission(fallbackToSettings: Boolean) = throw EXCEPTION override fun removeNotification(id: Int) = throw EXCEPTION