Skip to content

Commit 44b4ccd

Browse files
authored
Add development_platform for Unity crash reports (#2108)
Crashlytics reports sent via DataTransport erroneously did not set the development_platform field for Unity apps. This results in incorrect internal metrics for Unity apps. (internal tracking bug: b/171214452)
1 parent 51c995e commit 44b4ccd

File tree

10 files changed

+92
-29
lines changed

10 files changed

+92
-29
lines changed

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/common/CrashlyticsControllerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,8 @@ public CrashlyticsController build() {
218218
"installerPackageName",
219219
"packageName",
220220
"versionCode",
221-
"versionName");
221+
"versionName",
222+
unityVersionProvider);
222223

223224
final CrashlyticsController controller =
224225
new CrashlyticsController(
@@ -233,7 +234,6 @@ public CrashlyticsController build() {
233234
reportManager,
234235
reportUploaderProvider,
235236
nativeComponent,
236-
unityVersionProvider,
237237
analyticsEventLogger,
238238
testSettingsDataProvider);
239239
return controller;

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/common/CrashlyticsReportDataCaptureTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import com.google.firebase.crashlytics.internal.model.CrashlyticsReport;
2626
import com.google.firebase.crashlytics.internal.model.CrashlyticsReport.Session.Event.Application.Execution;
2727
import com.google.firebase.crashlytics.internal.stacktrace.StackTraceTrimmingStrategy;
28+
import com.google.firebase.crashlytics.internal.unity.ResourceUnityVersionProvider;
29+
import com.google.firebase.crashlytics.internal.unity.UnityVersionProvider;
2830
import com.google.firebase.installations.FirebaseInstallationsApi;
2931
import java.util.List;
3032
import org.junit.Before;
@@ -55,7 +57,9 @@ public void setUp() throws Exception {
5557
final Context context = ApplicationProvider.getApplicationContext();
5658
final IdManager idManager =
5759
new IdManager(context, context.getPackageName(), installationsApiMock);
58-
final AppData appData = AppData.create(context, idManager, "googleAppId", "buildId");
60+
final UnityVersionProvider unityVersionProvider = new ResourceUnityVersionProvider(context);
61+
final AppData appData =
62+
AppData.create(context, idManager, "googleAppId", "buildId", unityVersionProvider);
5963
dataCapture =
6064
new CrashlyticsReportDataCapture(context, idManager, appData, stackTraceTrimmingStrategy);
6165
timestamp = System.currentTimeMillis();

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransformTest.java

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,16 @@ public void setUp() {
4242

4343
@Test
4444
public void testReportToJsonAndBack_equals() throws IOException {
45-
final CrashlyticsReport testReport = makeTestReport();
45+
final CrashlyticsReport testReport = makeTestReport(false);
46+
final String testReportJson = transform.reportToJson(testReport);
47+
final CrashlyticsReport reifiedReport = transform.reportFromJson(testReportJson);
48+
assertNotSame(reifiedReport, testReport);
49+
assertEquals(reifiedReport, testReport);
50+
}
51+
52+
@Test
53+
public void testReportToJsonAndBack_with_developmentPlatform_equals() throws IOException {
54+
final CrashlyticsReport testReport = makeTestReport(true);
4655
final String testReportJson = transform.reportToJson(testReport);
4756
final CrashlyticsReport reifiedReport = transform.reportFromJson(testReportJson);
4857
assertNotSame(reifiedReport, testReport);
@@ -58,37 +67,43 @@ public void testEventToJsonAndBack_equals() throws IOException {
5867
assertEquals(reifiedEvent, testEvent);
5968
}
6069

61-
private static CrashlyticsReport makeTestReport() {
70+
private static CrashlyticsReport makeTestReport(boolean useDevelopmentPlatform) {
6271
return CrashlyticsReport.builder()
6372
.setSdkVersion("sdkVersion")
6473
.setGmpAppId("gmpAppId")
6574
.setPlatform(1)
6675
.setInstallationUuid("installationId")
6776
.setBuildVersion("1")
6877
.setDisplayVersion("1.0.0")
69-
.setSession(makeTestSession())
78+
.setSession(makeTestSession(useDevelopmentPlatform))
7079
.build();
7180
}
7281

73-
private static CrashlyticsReport.Session makeTestSession() {
82+
private static CrashlyticsReport.Session makeTestSession(boolean useDevelopmentPlatform) {
7483
return Session.builder()
7584
.setGenerator("generator")
7685
.setIdentifier("identifier")
7786
.setStartedAt(1L)
7887
.setEndedAt(1L)
7988
.setCrashed(true)
80-
.setApp(makeTestApplication())
89+
.setApp(makeTestApplication(useDevelopmentPlatform))
8190
.setUser(User.builder().setIdentifier("user").build())
8291
.setGeneratorType(3)
8392
.build();
8493
}
8594

86-
private static Application makeTestApplication() {
87-
return Application.builder()
88-
.setIdentifier("applicationId")
89-
.setVersion("version")
90-
.setDisplayVersion("displayVersion")
91-
.build();
95+
private static Application makeTestApplication(boolean useDevelopmentPlatform) {
96+
final Application.Builder builder =
97+
Application.builder()
98+
.setIdentifier("applicationId")
99+
.setVersion("version")
100+
.setDisplayVersion("displayVersion");
101+
if (useDevelopmentPlatform) {
102+
builder
103+
.setDevelopmentPlatform("developmentPlatform")
104+
.setDevelopmentPlatformVersion("developmentPlatformVersion");
105+
}
106+
return builder.build();
92107
}
93108

94109
private static ImmutableList<Event> makeTestEvents(int numEvents) {

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/AppData.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import android.content.Context;
1818
import android.content.pm.PackageInfo;
1919
import android.content.pm.PackageManager;
20+
import com.google.firebase.crashlytics.internal.unity.UnityVersionProvider;
2021

2122
/** Carries static information about the app. */
2223
class AppData {
@@ -29,8 +30,14 @@ class AppData {
2930
public final String versionCode;
3031
public final String versionName;
3132

33+
public final UnityVersionProvider unityVersionProvider;
34+
3235
public static AppData create(
33-
Context context, IdManager idManager, String googleAppId, String buildId)
36+
Context context,
37+
IdManager idManager,
38+
String googleAppId,
39+
String buildId,
40+
UnityVersionProvider unityVersionProvider)
3441
throws PackageManager.NameNotFoundException {
3542
final String packageName = context.getPackageName();
3643
final String installerPackageName = idManager.getInstallerPackageName();
@@ -41,7 +48,13 @@ public static AppData create(
4148
packageInfo.versionName == null ? IdManager.DEFAULT_VERSION_NAME : packageInfo.versionName;
4249

4350
return new AppData(
44-
googleAppId, buildId, installerPackageName, packageName, versionCode, versionName);
51+
googleAppId,
52+
buildId,
53+
installerPackageName,
54+
packageName,
55+
versionCode,
56+
versionName,
57+
unityVersionProvider);
4558
}
4659

4760
public AppData(
@@ -50,12 +63,14 @@ public AppData(
5063
String installerPackageName,
5164
String packageName,
5265
String versionCode,
53-
String versionName) {
66+
String versionName,
67+
UnityVersionProvider unityVersionProvider) {
5468
this.googleAppId = googleAppId;
5569
this.buildId = buildId;
5670
this.installerPackageName = installerPackageName;
5771
this.packageName = packageName;
5872
this.versionCode = versionCode;
5973
this.versionName = versionName;
74+
this.unityVersionProvider = unityVersionProvider;
6075
}
6176
}

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@
5555
import com.google.firebase.crashlytics.internal.stacktrace.RemoveRepeatsStrategy;
5656
import com.google.firebase.crashlytics.internal.stacktrace.StackTraceTrimmingStrategy;
5757
import com.google.firebase.crashlytics.internal.stacktrace.TrimmedThrowableData;
58-
import com.google.firebase.crashlytics.internal.unity.UnityVersionProvider;
5958
import java.io.File;
6059
import java.io.FileInputStream;
6160
import java.io.FileOutputStream;
@@ -294,7 +293,6 @@ public int compare(File file1, File file2) {
294293
ReportManager reportManager,
295294
ReportUploader.Provider reportUploaderProvider,
296295
CrashlyticsNativeComponent nativeComponent,
297-
UnityVersionProvider unityVersionProvider,
298296
AnalyticsEventLogger analyticsEventLogger,
299297
SettingsDataProvider settingsDataProvider) {
300298
this.context = context;
@@ -312,7 +310,7 @@ public int compare(File file1, File file2) {
312310
this.reportUploaderProvider = defaultReportUploader();
313311
}
314312
this.nativeComponent = nativeComponent;
315-
this.unityVersion = unityVersionProvider.getUnityVersion();
313+
this.unityVersion = appData.unityVersionProvider.getUnityVersion();
316314
this.analyticsEventLogger = analyticsEventLogger;
317315

318316
this.userMetadata = new UserMetadata();

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsCore.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,9 @@ public boolean onPreExecute(SettingsDataProvider settingsProvider) {
134134

135135
final HttpRequestFactory httpRequestFactory = new HttpRequestFactory();
136136

137-
final AppData appData = AppData.create(context, idManager, googleAppId, mappingFileId);
138137
final UnityVersionProvider unityVersionProvider = new ResourceUnityVersionProvider(context);
138+
final AppData appData =
139+
AppData.create(context, idManager, googleAppId, mappingFileId, unityVersionProvider);
139140

140141
Logger.getLogger().d("Installer package name is: " + appData.installerPackageName);
141142

@@ -152,7 +153,6 @@ public boolean onPreExecute(SettingsDataProvider settingsProvider) {
152153
null,
153154
null,
154155
nativeComponent,
155-
unityVersionProvider,
156156
analyticsEventLogger,
157157
settingsProvider);
158158

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsReportDataCapture.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,20 @@ private CrashlyticsReport.Session populateSessionData(String identifier, long ti
137137
}
138138

139139
private CrashlyticsReport.Session.Application populateSessionApplicationData() {
140-
return CrashlyticsReport.Session.Application.builder()
141-
.setIdentifier(idManager.getAppIdentifier())
142-
.setVersion(appData.versionCode)
143-
.setDisplayVersion(appData.versionName)
144-
.setInstallationUuid(idManager.getCrashlyticsInstallId())
145-
.build();
140+
final CrashlyticsReport.Session.Application.Builder builder =
141+
CrashlyticsReport.Session.Application.builder()
142+
.setIdentifier(idManager.getAppIdentifier())
143+
.setVersion(appData.versionCode)
144+
.setDisplayVersion(appData.versionName)
145+
.setInstallationUuid(idManager.getCrashlyticsInstallId());
146+
147+
final String unityVersion = appData.unityVersionProvider.getUnityVersion();
148+
if (unityVersion != null) {
149+
builder
150+
.setDevelopmentPlatform(CrashlyticsReport.DEVELOPMENT_PLATFORM_UNITY)
151+
.setDevelopmentPlatformVersion(unityVersion);
152+
}
153+
return builder.build();
146154
}
147155

148156
private CrashlyticsReport.Session.OperatingSystem populateSessionOperatingSystemData() {

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/model/CrashlyticsReport.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public enum Type {
6363
NATIVE
6464
}
6565

66+
public static final String DEVELOPMENT_PLATFORM_UNITY = "Unity";
67+
6668
private static final Charset UTF_8 = Charset.forName("UTF-8");
6769

6870
@NonNull
@@ -416,6 +418,12 @@ public static Builder builder() {
416418
@Nullable
417419
public abstract String getInstallationUuid();
418420

421+
@Nullable
422+
public abstract String getDevelopmentPlatform();
423+
424+
@Nullable
425+
public abstract String getDevelopmentPlatformVersion();
426+
419427
@NonNull
420428
protected abstract Builder toBuilder();
421429

@@ -446,6 +454,13 @@ public abstract static class Builder {
446454
@NonNull
447455
public abstract Builder setInstallationUuid(@NonNull String installationUuid);
448456

457+
@NonNull
458+
public abstract Builder setDevelopmentPlatform(@Nullable String developmentPlatform);
459+
460+
@NonNull
461+
public abstract Builder setDevelopmentPlatformVersion(
462+
@Nullable String developmentPlatformVersion);
463+
449464
@NonNull
450465
public abstract Application build();
451466
}

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransform.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,12 @@ private static CrashlyticsReport.Session.Application parseApp(@NonNull JsonReade
254254
case "installationUuid":
255255
builder.setInstallationUuid(jsonReader.nextString());
256256
break;
257+
case "developmentPlatform":
258+
builder.setDevelopmentPlatform(jsonReader.nextString());
259+
break;
260+
case "developmentPlatformVersion":
261+
builder.setDevelopmentPlatformVersion(jsonReader.nextString());
262+
break;
257263
default:
258264
jsonReader.skipValue();
259265
break;

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/proto/SessionProtobufHelper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import android.app.ActivityManager;
1818
import com.google.firebase.crashlytics.internal.Logger;
19+
import com.google.firebase.crashlytics.internal.model.CrashlyticsReport;
1920
import com.google.firebase.crashlytics.internal.stacktrace.TrimmedThrowableData;
2021
import java.util.List;
2122
import java.util.Map;
@@ -30,7 +31,8 @@ public class SessionProtobufHelper {
3031
private static final ByteString SIGNAL_DEFAULT_BYTE_STRING =
3132
ByteString.copyFromUtf8(SIGNAL_DEFAULT);
3233

33-
private static final ByteString UNITY_PLATFORM_BYTE_STRING = ByteString.copyFromUtf8("Unity");
34+
private static final ByteString UNITY_PLATFORM_BYTE_STRING =
35+
ByteString.copyFromUtf8(CrashlyticsReport.DEVELOPMENT_PLATFORM_UNITY);
3436

3537
private SessionProtobufHelper() {}
3638

0 commit comments

Comments
 (0)