Skip to content

Commit e6a9d3c

Browse files
committed
feat(jvm): add sdk version to reports
1 parent d777c3e commit e6a9d3c

File tree

4 files changed

+42
-5
lines changed

4 files changed

+42
-5
lines changed

platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/CaptureJniLibrary.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ internal object CaptureJniLibrary : IBridge {
102102
*/
103103
external fun getDeviceId(loggerId: Long): String?
104104

105+
/**
106+
* Returns the version of the underlying SDK
107+
*/
108+
external fun getSdkVersion(): String?
109+
105110
/**
106111
* Adds a field that should be attached to all logs emitted by the logger going forward.
107112
* If a field with a given key has already been registered with the logger, its value is

platform/jvm/capture/src/main/kotlin/io/bitdrift/capture/reports/processor/FatalIssueReporterProcessor.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ package io.bitdrift.capture.reports.processor
1010
import android.content.Context
1111
import androidx.lifecycle.ProcessLifecycleOwner
1212
import com.google.flatbuffers.FlatBufferBuilder
13+
import io.bitdrift.capture.CaptureJniLibrary
1314
import io.bitdrift.capture.attributes.ClientAttributes
1415
import io.bitdrift.capture.reports.binformat.v1.AppBuildNumber
1516
import io.bitdrift.capture.reports.binformat.v1.DeviceMetrics
@@ -29,13 +30,17 @@ import kotlin.time.toDuration
2930
internal class FatalIssueReporterProcessor(
3031
appContext: Context,
3132
private val fatalIssueReporterStorage: IFatalIssueReporterStorage,
33+
private val versionProvider: ISDKVersionProvider = CoreSDKVersionProvider(),
3234
) {
3335
// Initial size for file builder buffer
3436
private val builderDefaultSize = 1024
3537
private val clientAttributes by lazy {
3638
// TODO(FranAguilera): BIT-5148 Refactor to avoid recreating ClientAttributes
3739
ClientAttributes(appContext, ProcessLifecycleOwner.get())
3840
}
41+
private val sdkVersion by lazy {
42+
versionProvider.getSDKVersion()
43+
}
3944

4045
/**
4146
* Process AppTerminations due to ANRs and native crashes into packed format
@@ -129,8 +134,7 @@ internal class FatalIssueReporterProcessor(
129134
SDKInfo.createSDKInfo(
130135
builder,
131136
builder.createString(ClientAttributes.SDK_LIBRARY_ID),
132-
// e.g. 0.17.2 TODO(FranAguilera): BIT-5141. Extract sdk version
133-
builder.createString(""),
137+
if (sdkVersion != null) builder.createString(sdkVersion) else 0,
134138
)
135139

136140
private fun createAppMetrics(builder: FlatBufferBuilder): Int {
@@ -166,3 +170,11 @@ internal class FatalIssueReporterProcessor(
166170
return DeviceMetrics.endDeviceMetrics(builder)
167171
}
168172
}
173+
174+
internal interface ISDKVersionProvider {
175+
fun getSDKVersion(): String?
176+
}
177+
178+
private class CoreSDKVersionProvider : ISDKVersionProvider {
179+
override fun getSDKVersion(): String? = CaptureJniLibrary.getSdkVersion()
180+
}

platform/jvm/capture/src/test/kotlin/io/bitdrift/capture/FatalIssueReporterProcessorTest.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import io.bitdrift.capture.reports.binformat.v1.Report
2020
import io.bitdrift.capture.reports.binformat.v1.ReportType
2121
import io.bitdrift.capture.reports.persistence.IFatalIssueReporterStorage
2222
import io.bitdrift.capture.reports.processor.FatalIssueReporterProcessor
23+
import io.bitdrift.capture.reports.processor.ISDKVersionProvider
2324
import org.assertj.core.api.Assertions.assertThat
2425
import org.junit.Before
2526
import org.junit.Test
@@ -41,7 +42,13 @@ class FatalIssueReporterProcessorTest {
4142
val initializer = ContextHolder()
4243
initializer.create(ApplicationProvider.getApplicationContext())
4344
fatalIssueReporterProcessor =
44-
FatalIssueReporterProcessor(APP_CONTEXT, fatalIssueReporterStorage)
45+
FatalIssueReporterProcessor(
46+
APP_CONTEXT,
47+
fatalIssueReporterStorage,
48+
object : ISDKVersionProvider {
49+
override fun getSDKVersion(): String? = "3.4.51"
50+
},
51+
)
4552
}
4653

4754
@Test
@@ -77,7 +84,7 @@ class FatalIssueReporterProcessorTest {
7784
"persistJvmCrash_withFakeException_shouldCreateNonEmptyErrorModel",
7885
)
7986
assertThat(error.stackTrace(0)!!.sourceFile!!.path).isEqualTo("FatalIssueReporterProcessorTest.kt")
80-
assertThat(error.stackTrace(0)!!.sourceFile!!.line).isEqualTo(50)
87+
assertThat(error.stackTrace(0)!!.sourceFile!!.line).isEqualTo(57)
8188
assertThat(error.stackTrace(0)!!.sourceFile!!.column).isEqualTo(0)
8289
}
8390

platform/jvm/src/jni.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use jni::objects::{
4242
use jni::signature::{Primitive, ReturnType};
4343
use jni::sys::{jboolean, jbyteArray, jdouble, jint, jlong, jobject, jvalue, JNI_TRUE};
4444
use jni::{JNIEnv, JavaVM};
45-
use platform_shared::metadata::Mobile;
45+
use platform_shared::metadata::{self, Mobile};
4646
use platform_shared::{LoggerHolder, LoggerId};
4747
use std::borrow::{Borrow, Cow};
4848
use std::collections::HashMap;
@@ -717,6 +717,19 @@ pub extern "system" fn Java_io_bitdrift_capture_CaptureJniLibrary_getSessionId<'
717717
)
718718
}
719719

720+
#[no_mangle]
721+
pub extern "system" fn Java_io_bitdrift_capture_CaptureJniLibrary_getSdkVersion<'a>(
722+
env: JNIEnv<'a>,
723+
_class: JClass<'_>,
724+
) -> JString<'a> {
725+
let version = metadata::SDK_VERSION.clone();
726+
bd_client_common::error::with_handle_unexpected_or(
727+
|| Ok(env.new_string(version)?),
728+
JObject::null().into(),
729+
"jni get_sdk_version",
730+
)
731+
}
732+
720733
#[no_mangle]
721734
pub extern "system" fn Java_io_bitdrift_capture_CaptureJniLibrary_getDeviceId<'a>(
722735
env: JNIEnv<'a>,

0 commit comments

Comments
 (0)