diff --git a/.gitignore b/.gitignore index a3cb81a..0c4acc6 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ out/ # Gradle files .gradle/ +.kotlin/ build/ # Local configuration file (sdk path, etc) diff --git a/bugsnag-ios-link/build.gradle.kts b/bugsnag-ios-link/build.gradle.kts index 30ca78e..cda6164 100644 --- a/bugsnag-ios-link/build.gradle.kts +++ b/bugsnag-ios-link/build.gradle.kts @@ -13,7 +13,6 @@ plugins { `kotlin-dsl` - kotlin("jvm") id("java-gradle-plugin") id("com.vanniktech.maven.publish.base") id("com.gradle.plugin-publish") diff --git a/bugsnag-ios-link/src/main/kotlin/co/touchlab/crashkios/BugsnagLinkPlugin.kt b/bugsnag-ios-link/src/main/kotlin/co/touchlab/crashkios/BugsnagLinkPlugin.kt index 327d532..915eb2a 100644 --- a/bugsnag-ios-link/src/main/kotlin/co/touchlab/crashkios/BugsnagLinkPlugin.kt +++ b/bugsnag-ios-link/src/main/kotlin/co/touchlab/crashkios/BugsnagLinkPlugin.kt @@ -64,7 +64,9 @@ private fun KotlinMultiplatformExtension.crashLinkerConfig(linkerOpts: String) { val hasDynamicFrameworks = binaries.any { it is Framework && !it.isStatic } if (hasDynamicFrameworks) { - compilations.getByName("main").kotlinOptions.freeCompilerArgs += listOf("-linker-options", linkerOpts) + compilations.getByName("main").compileTaskProvider.configure { + compilerOptions.freeCompilerArgs.addAll("-linker-options", linkerOpts) + } } } } diff --git a/bugsnag/build.gradle.kts b/bugsnag/build.gradle.kts index 8a80d15..e74a79b 100644 --- a/bugsnag/build.gradle.kts +++ b/bugsnag/build.gradle.kts @@ -11,7 +11,6 @@ * the License. */ import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("com.android.library") @@ -106,7 +105,3 @@ android { targetCompatibility = JavaVersion.VERSION_1_8 } } - -tasks.withType { - kotlinOptions.jvmTarget = "1.8" -} diff --git a/bugsnag/src/androidMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCallsActual.kt b/bugsnag/src/androidMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCallsActual.kt index b0e7a52..3bf7f7f 100644 --- a/bugsnag/src/androidMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCallsActual.kt +++ b/bugsnag/src/androidMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCallsActual.kt @@ -3,19 +3,19 @@ package co.touchlab.crashkios.bugsnag import com.bugsnag.android.Bugsnag actual class BugsnagCallsActual : BugsnagCalls { - override fun logMessage(message: String) { + actual override fun logMessage(message: String) { Bugsnag.leaveBreadcrumb(message) } - override fun sendHandledException(throwable: Throwable) { + actual override fun sendHandledException(throwable: Throwable) { Bugsnag.notify(throwable) } - override fun sendFatalException(throwable: Throwable) { + actual override fun sendFatalException(throwable: Throwable) { Bugsnag.notify(throwable) } - override fun setCustomValue(section: String, key: String, value: Any) { + actual override fun setCustomValue(section: String, key: String, value: Any) { Bugsnag.addMetadata(section, key, value) } } diff --git a/bugsnag/src/appleMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCallsActual.kt b/bugsnag/src/appleMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCallsActual.kt index 36c9d43..e331a17 100644 --- a/bugsnag/src/appleMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCallsActual.kt +++ b/bugsnag/src/appleMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCallsActual.kt @@ -6,19 +6,19 @@ import kotlinx.cinterop.ExperimentalForeignApi @OptIn(ExperimentalForeignApi::class) actual class BugsnagCallsActual : BugsnagCalls { - override fun logMessage(message: String) { + actual override fun logMessage(message: String) { Bugsnag.leaveBreadcrumbWithMessage(message) } - override fun sendHandledException(throwable: Throwable) { + actual override fun sendHandledException(throwable: Throwable) { sendException(throwable, true) } - override fun sendFatalException(throwable: Throwable) { + actual override fun sendFatalException(throwable: Throwable) { sendException(throwable, false) } - override fun setCustomValue(section: String, key: String, value: Any) { + actual override fun setCustomValue(section: String, key: String, value: Any) { Bugsnag.addMetadata(value, key, section) } diff --git a/bugsnag/src/commonMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCalls.kt b/bugsnag/src/commonMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCalls.kt index c49affa..59daed1 100644 --- a/bugsnag/src/commonMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCalls.kt +++ b/bugsnag/src/commonMain/kotlin/co/touchlab/crashkios/bugsnag/BugsnagCalls.kt @@ -10,4 +10,9 @@ interface BugsnagCalls { fun setCustomValue(section: String, key: String, value: Any) } -expect class BugsnagCallsActual() : BugsnagCalls +expect class BugsnagCallsActual() : BugsnagCalls { + override fun logMessage(message: String) + override fun sendHandledException(throwable: Throwable) + override fun sendFatalException(throwable: Throwable) + override fun setCustomValue(section: String, key: String, value: Any) +} diff --git a/build.gradle.kts b/build.gradle.kts index 9509351..11fd7a5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,6 @@ plugins { alias(libs.plugins.kotlin.multiplatform) apply false alias(libs.plugins.maven.publish) apply false alias(libs.plugins.android.library) apply false - alias(libs.plugins.touchlab.docusaurus.template) alias(libs.plugins.gradle.publish) apply false id("org.jlleitschuh.gradle.ktlint") version "12.2.0" apply false } @@ -31,4 +30,4 @@ subprojects { dependsOn(tasks.getByName("ktlintCheck")) } } -} \ No newline at end of file +} diff --git a/core/build.gradle.kts b/core/build.gradle.kts index bcabf0b..09d95ad 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -11,7 +11,6 @@ * the License. */ import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("com.android.library") @@ -79,8 +78,4 @@ android { } } -tasks.withType { - kotlinOptions.jvmTarget = "1.8" -} - apply(plugin = "com.vanniktech.maven.publish") diff --git a/core/src/appleMain/kotlin/co/touchlab/crashkios/core/ThreadSafeVar.kt b/core/src/appleMain/kotlin/co/touchlab/crashkios/core/ThreadSafeVar.kt index 7206dfc..8fa40f4 100644 --- a/core/src/appleMain/kotlin/co/touchlab/crashkios/core/ThreadSafeVar.kt +++ b/core/src/appleMain/kotlin/co/touchlab/crashkios/core/ThreadSafeVar.kt @@ -1,20 +1,14 @@ package co.touchlab.crashkios.core import kotlin.concurrent.AtomicReference -import kotlin.experimental.ExperimentalNativeApi -import kotlin.native.concurrent.freeze import kotlin.reflect.KProperty -@OptIn(FreezingIsDeprecated::class, ExperimentalNativeApi::class) actual class ThreadSafeVar actual constructor(target: T) { private val atom = AtomicReference(target) actual operator fun getValue(thisRef: Any?, property: KProperty<*>): T = atom.value actual operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { - if (Platform.memoryModel == MemoryModel.STRICT) { - value.freeze() - } atom.value = value } } diff --git a/crashlytics-ios-link/build.gradle.kts b/crashlytics-ios-link/build.gradle.kts index 4885b4e..7b583b2 100644 --- a/crashlytics-ios-link/build.gradle.kts +++ b/crashlytics-ios-link/build.gradle.kts @@ -12,7 +12,6 @@ */ plugins { `kotlin-dsl` - kotlin("jvm") id("java-gradle-plugin") id("com.vanniktech.maven.publish.base") id("com.gradle.plugin-publish") diff --git a/crashlytics-ios-link/src/main/kotlin/co/touchlab/crashkios/CrashlyticsLinkPlugin.kt b/crashlytics-ios-link/src/main/kotlin/co/touchlab/crashkios/CrashlyticsLinkPlugin.kt index b9f5919..a59ebc5 100644 --- a/crashlytics-ios-link/src/main/kotlin/co/touchlab/crashkios/CrashlyticsLinkPlugin.kt +++ b/crashlytics-ios-link/src/main/kotlin/co/touchlab/crashkios/CrashlyticsLinkPlugin.kt @@ -59,7 +59,9 @@ private fun KotlinMultiplatformExtension.crashLinkerConfig(linkerOpts: String) { val hasDynamicFrameworks = binaries.any { it is Framework && !it.isStatic } if (hasDynamicFrameworks) { - compilations.getByName("main").kotlinOptions.freeCompilerArgs += listOf("-linker-options", linkerOpts) + compilations.getByName("main").compileTaskProvider.configure { + compilerOptions.freeCompilerArgs.addAll("-linker-options", linkerOpts) + } } } } diff --git a/crashlytics/build.gradle.kts b/crashlytics/build.gradle.kts index cccdeba..db207a0 100644 --- a/crashlytics/build.gradle.kts +++ b/crashlytics/build.gradle.kts @@ -11,7 +11,6 @@ * the License. */ import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("com.android.library") @@ -104,7 +103,3 @@ android { targetCompatibility = JavaVersion.VERSION_1_8 } } - -tasks.withType { - kotlinOptions.jvmTarget = "1.8" -} diff --git a/crashlytics/src/androidMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCallsActual.kt b/crashlytics/src/androidMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCallsActual.kt index b8a8c4b..bad5a10 100644 --- a/crashlytics/src/androidMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCallsActual.kt +++ b/crashlytics/src/androidMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCallsActual.kt @@ -3,19 +3,19 @@ package co.touchlab.crashkios.crashlytics import com.google.firebase.crashlytics.FirebaseCrashlytics actual class CrashlyticsCallsActual : CrashlyticsCalls { - override fun logMessage(message: String) { + actual override fun logMessage(message: String) { FirebaseCrashlytics.getInstance().log(message) } - override fun sendHandledException(throwable: Throwable) { + actual override fun sendHandledException(throwable: Throwable) { FirebaseCrashlytics.getInstance().recordException(throwable) } - override fun sendFatalException(throwable: Throwable) { + actual override fun sendFatalException(throwable: Throwable) { FirebaseCrashlytics.getInstance().recordException(throwable) } - override fun setCustomValue(key: String, value: Any) { + actual override fun setCustomValue(key: String, value: Any) { when (value) { is Boolean -> FirebaseCrashlytics.getInstance().setCustomKey(key, value) is Double -> FirebaseCrashlytics.getInstance().setCustomKey(key, value) @@ -29,7 +29,7 @@ actual class CrashlyticsCallsActual : CrashlyticsCalls { } } - override fun setUserId(identifier: String) { + actual override fun setUserId(identifier: String) { FirebaseCrashlytics.getInstance().setUserId(identifier) } } diff --git a/crashlytics/src/appleMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCallsActual.kt b/crashlytics/src/appleMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCallsActual.kt index 7e3809b..caf6ed5 100644 --- a/crashlytics/src/appleMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCallsActual.kt +++ b/crashlytics/src/appleMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCallsActual.kt @@ -12,12 +12,12 @@ actual class CrashlyticsCallsActual : CrashlyticsCalls { FIRCheckLinkDependencies() } - override fun logMessage(message: String) { + actual override fun logMessage(message: String) { FIRCrashlyticsLog(message) } @OptIn(UnsafeNumber::class) - override fun sendHandledException(throwable: Throwable) { + actual override fun sendHandledException(throwable: Throwable) { val exceptionClassName = throwable::class.qualifiedName ?: throwable::class.simpleName ?: "kotlin.Throwable" FIRCrashlyticsRecordHandledException( exceptionClassName, @@ -28,18 +28,18 @@ actual class CrashlyticsCallsActual : CrashlyticsCalls { ) } - override fun sendFatalException(throwable: Throwable) { + actual override fun sendFatalException(throwable: Throwable) { val exception = throwable.asNSException(true) // The recorded exception is persisted, so we can safely terminate afterwards. // https://github.com/firebase/firebase-ios-sdk/blob/82f163bd86566f83c5d7572a1c2c0024a04eb4dc/Crashlytics/Crashlytics/Handlers/FIRCLSException.mm#L227 tryFIRCLSExceptionRecordNSException(exception) } - override fun setCustomValue(key: String, value: Any) { + actual override fun setCustomValue(key: String, value: Any) { FIRCrashlyticsSetCustomValue(key, value) } - override fun setUserId(identifier: String) { + actual override fun setUserId(identifier: String) { FIRCrashlyticsSetUserID(identifier) } } diff --git a/crashlytics/src/commonMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCalls.kt b/crashlytics/src/commonMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCalls.kt index 454b99f..99760ce 100644 --- a/crashlytics/src/commonMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCalls.kt +++ b/crashlytics/src/commonMain/kotlin/co/touchlab/crashkios/crashlytics/CrashlyticsCalls.kt @@ -8,4 +8,10 @@ interface CrashlyticsCalls { fun setUserId(identifier: String) } -expect class CrashlyticsCallsActual() : CrashlyticsCalls +expect class CrashlyticsCallsActual() : CrashlyticsCalls { + override fun logMessage(message: String) + override fun sendHandledException(throwable: Throwable) + override fun sendFatalException(throwable: Throwable) + override fun setCustomValue(key: String, value: Any) + override fun setUserId(identifier: String) +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 71359ca..631b3af 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,12 +1,12 @@ [versions] ## SDK Versions minSdk = "21" -targetSdk = "34" -compileSdk = "34" +targetSdk = "35" +compileSdk = "35" # Dependencies -kotlin = "1.9.24" -android-gradle-plugin = "8.2.1" +kotlin = "2.2.21" +android-gradle-plugin = "8.11.1" mavenPublish = "0.29.0" touchlab-docusaurus-template = "0.1.10" gradlePublish = "1.2.1" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 033e24c..1b33c55 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3fa8f86..4f5eb9d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index fcb6fca..23d15a9 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,7 +85,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -111,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -144,7 +147,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +155,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -201,16 +204,16 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 6689b85..5eed7ee 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,22 +59,22 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/settings.gradle.kts b/settings.gradle.kts index 40e850c..a17dd5e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,8 +1,8 @@ include(":core") include(":bugsnag") -include(":bugsnag-ios-link") include(":crashlytics") -include(":crashlytics-ios-link") +include("bugsnag-ios-link") +include("crashlytics-ios-link") pluginManagement { repositories { @@ -14,5 +14,5 @@ pluginManagement { } plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version("0.8.0") + id("org.gradle.toolchains.foojay-resolver-convention") version ("0.8.0") }