Skip to content

Commit 24a2fb5

Browse files
authored
Instrument calls to applicationInitStart and applicationInitEnd (#2329)
* Instrument calls to applicationInitStart and applicationInitEnd on Application.onCreate() * Use only one flag to control application timing instrumentation: applicationInitTimingEnabled
1 parent df028ac commit 24a2fb5

File tree

15 files changed

+193
-2
lines changed

15 files changed

+193
-2
lines changed

embrace-android-sdk/api/embrace-android-sdk.api

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ public final class io/embrace/android/embracesdk/Embrace$Companion {
8383
public final fun getInstance ()Lio/embrace/android/embracesdk/Embrace;
8484
}
8585

86+
public final class io/embrace/android/embracesdk/internal/instrumentation/bytecode/ApplicationInitTimeBytecodeEntrypoint {
87+
public static final field INSTANCE Lio/embrace/android/embracesdk/internal/instrumentation/bytecode/ApplicationInitTimeBytecodeEntrypoint;
88+
public static final fun applicationInitEnd ()V
89+
public static final fun applicationInitStart ()V
90+
}
91+
8692
public final class io/embrace/android/embracesdk/internal/instrumentation/bytecode/AutoSdkInitializationBytecodeEntrypoint {
8793
public static final field INSTANCE Lio/embrace/android/embracesdk/internal/instrumentation/bytecode/AutoSdkInitializationBytecodeEntrypoint;
8894
public static final fun onCreate (Landroid/app/Application;)V
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.embrace.android.embracesdk.internal.instrumentation.bytecode
2+
3+
import androidx.annotation.Keep
4+
import io.embrace.android.embracesdk.Embrace
5+
import io.embrace.android.embracesdk.annotation.InternalApi
6+
7+
/**
8+
* @hide
9+
*/
10+
@InternalApi
11+
@Keep
12+
public object ApplicationInitTimeBytecodeEntrypoint {
13+
14+
@Keep
15+
@JvmStatic
16+
public fun applicationInitStart() {
17+
Embrace.getInstance().applicationInitStart()
18+
}
19+
20+
@Keep
21+
@JvmStatic
22+
public fun applicationInitEnd() {
23+
Embrace.getInstance().applicationInitEnd()
24+
}
25+
}

embrace-bytecode-instrumentation-tests/src/test/java/io/embrace/gradle/plugin/instrumentation/FakeBytecodeInstrumentationParams.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class FakeBytecodeInstrumentationParams(
1414
override val shouldInstrumentOkHttp: Property<Boolean> = fakeProperty(true),
1515
override val shouldInstrumentOnLongClick: Property<Boolean> = fakeProperty(true),
1616
override val shouldInstrumentOnClick: Property<Boolean> = fakeProperty(true),
17+
override val applicationInitTimingEnabled: Property<Boolean> = fakeProperty(true),
1718
) : BytecodeInstrumentationParams {
1819
override val config: Property<VariantConfig>
1920
get() = TODO("Not yet implemented")

embrace-bytecode-instrumentation-tests/src/test/java/io/embrace/gradle/plugin/instrumentation/InstrumentedBytecodeTest.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ private val autoSdkInitializationFactory: ClassVisitorFactory = { visitor, param
7070
createFactory(params, visitor, "auto_sdk_initialization", "android.app.Application")
7171
}
7272

73+
private val applicationInitTimeStartFactory: ClassVisitorFactory = { visitor, params ->
74+
createFactory(params, visitor, "application_init_time_start", "android.app.Application")
75+
}
76+
77+
private val applicationInitTimeEndFactory: ClassVisitorFactory = { visitor, params ->
78+
createFactory(params, visitor, "application_init_time_end", "android.app.Application")
79+
}
80+
7381
/**
7482
* Verifies that a [ClassVisitor] produces the correct bytecode output for a given class.
7583
*
@@ -132,6 +140,16 @@ class InstrumentedBytecodeTest(
132140
BytecodeTestParams(clz = CustomWebViewClient::class, factory = webviewFactory),
133141
BytecodeTestParams(clz = ExtendedCustomWebViewClient::class, factory = webviewFactory),
134142
BytecodeTestParams(clz = TestApplication::class, factory = autoSdkInitializationFactory),
143+
BytecodeTestParams(
144+
clz = TestApplication::class,
145+
factory = applicationInitTimeStartFactory,
146+
expectedOutput = "TestApplication_application_init_time_start_expected.txt"
147+
),
148+
BytecodeTestParams(
149+
clz = TestApplication::class,
150+
factory = applicationInitTimeEndFactory,
151+
expectedOutput = "TestApplication_application_init_time_end_expected.txt"
152+
),
135153
BytecodeTestParams(clz = NoOverrideWebViewClient::class, factory = webviewFactory),
136154
)
137155
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// class version 55.0 (55)
2+
// access flags 0x31
3+
public final class io/embrace/test/fixtures/TestApplication extends android/app/Application {
4+
5+
// compiled from: TestApplication.kt
6+
7+
@Lkotlin/Metadata;(mv={1, 8, 0}, k=1, xi=48, d1={"\u0000\u0012\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0008\u0002\n\u0002\u0010\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\u0008\u0010\u0003\u001a\u00020\u0004H\u0016\u00a8\u0006\u0005"}, d2={"Lio/embrace/test/fixtures/TestApplication;", "Landroid/app/Application;", "()V", "onCreate", "", "embrace-bytecode-instrumentation-tests_release"})
8+
9+
// access flags 0x1
10+
public <init>()V
11+
L0
12+
LINENUMBER 5 L0
13+
ALOAD 0
14+
INVOKESPECIAL android/app/Application.<init> ()V
15+
RETURN
16+
L1
17+
LOCALVARIABLE this Lio/embrace/test/fixtures/TestApplication; L0 L1 0
18+
MAXSTACK = 1
19+
MAXLOCALS = 1
20+
21+
// access flags 0x1
22+
public onCreate()V
23+
L0
24+
LINENUMBER 7 L0
25+
ALOAD 0
26+
INVOKESPECIAL android/app/Application.onCreate ()V
27+
L1
28+
LINENUMBER 8 L1
29+
INVOKESTATIC io/embrace/android/embracesdk/internal/instrumentation/bytecode/ApplicationInitTimeBytecodeEntrypoint.applicationInitEnd ()V
30+
RETURN
31+
L2
32+
LOCALVARIABLE this Lio/embrace/test/fixtures/TestApplication; L0 L2 0
33+
MAXSTACK = 1
34+
MAXLOCALS = 1
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// class version 55.0 (55)
2+
// access flags 0x31
3+
public final class io/embrace/test/fixtures/TestApplication extends android/app/Application {
4+
5+
// compiled from: TestApplication.kt
6+
7+
@Lkotlin/Metadata;(mv={1, 8, 0}, k=1, xi=48, d1={"\u0000\u0012\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0008\u0002\n\u0002\u0010\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\u0008\u0010\u0003\u001a\u00020\u0004H\u0016\u00a8\u0006\u0005"}, d2={"Lio/embrace/test/fixtures/TestApplication;", "Landroid/app/Application;", "()V", "onCreate", "", "embrace-bytecode-instrumentation-tests_release"})
8+
9+
// access flags 0x1
10+
public <init>()V
11+
L0
12+
LINENUMBER 5 L0
13+
ALOAD 0
14+
INVOKESPECIAL android/app/Application.<init> ()V
15+
RETURN
16+
L1
17+
LOCALVARIABLE this Lio/embrace/test/fixtures/TestApplication; L0 L1 0
18+
MAXSTACK = 1
19+
MAXLOCALS = 1
20+
21+
// access flags 0x1
22+
public onCreate()V
23+
INVOKESTATIC io/embrace/android/embracesdk/internal/instrumentation/bytecode/ApplicationInitTimeBytecodeEntrypoint.applicationInitStart ()V
24+
L0
25+
LINENUMBER 7 L0
26+
ALOAD 0
27+
INVOKESPECIAL android/app/Application.onCreate ()V
28+
L1
29+
LINENUMBER 8 L1
30+
RETURN
31+
L2
32+
LOCALVARIABLE this Lio/embrace/test/fixtures/TestApplication; L0 L2 0
33+
MAXSTACK = 1
34+
MAXLOCALS = 1
35+
}

embrace-gradle-plugin/src/main/java/io/embrace/android/gradle/plugin/api/EmbraceBytecodeInstrumentation.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ abstract class EmbraceBytecodeInstrumentation @Inject internal constructor(objec
4141
*/
4242
val autoSdkInitializationEnabled: Property<Boolean> = objectFactory.property(Boolean::class.java)
4343

44+
/**
45+
* Whether Embrace should automatically instrument application initialization timing. Defaults to true.
46+
*/
47+
val applicationInitTimingEnabled: Property<Boolean> = objectFactory.property(Boolean::class.java).convention(true)
48+
4449
/**
4550
* Whether Embrace should automatically instrument push notifications from Firebase. Defaults to false.
4651
*/

embrace-gradle-plugin/src/main/java/io/embrace/android/gradle/plugin/config/InstrumentationBehavior.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ interface InstrumentationBehavior {
2727
*/
2828
val autoSdkInitializationEnabled: Boolean
2929

30+
/**
31+
* Whether application initialization timing start should be auto-instrumented
32+
*/
33+
val applicationInitTimingEnabled: Boolean
34+
3035
/**
3136
* Whether FCM push notifications should be auto-instrumented
3237
*/

embrace-gradle-plugin/src/main/java/io/embrace/android/gradle/plugin/config/InstrumentationBehaviorImpl.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ class InstrumentationBehaviorImpl(
3838
enabled && (instrumentation.autoSdkInitializationEnabled.orNull ?: false)
3939
}
4040

41+
override val applicationInitTimingEnabled: Boolean by lazy {
42+
enabled && (instrumentation.applicationInitTimingEnabled.orNull ?: true)
43+
}
44+
4145
override val fcmPushNotificationsEnabled: Boolean by lazy {
4246
enabled && (instrumentation.firebasePushNotificationsEnabled.orNull ?: extension.instrumentFirebaseMessaging.orNull ?: false)
4347
}

embrace-gradle-plugin/src/main/java/io/embrace/android/gradle/plugin/instrumentation/AsmTaskRegistration.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class AsmTaskRegistration : EmbraceTaskRegistration {
4141
params.shouldInstrumentOkHttp.set(behavior.instrumentation.okHttpEnabled)
4242
params.shouldInstrumentOnLongClick.set(behavior.instrumentation.onLongClickEnabled)
4343
params.shouldInstrumentOnClick.set(behavior.instrumentation.onClickEnabled)
44+
params.applicationInitTimingEnabled.set(behavior.instrumentation.applicationInitTimingEnabled)
4445

4546
val encodeFileToBase64Task = project.lazyTaskLookup<EncodeFileToBase64Task>(
4647
"${EncodeFileToBase64Task.NAME}${data.name.capitalizedString()}"

0 commit comments

Comments
 (0)