1818import androidx .annotation .NonNull ;
1919import com .google .android .datatransport .Encoding ;
2020import com .google .android .datatransport .Event ;
21+ import com .google .android .datatransport .Transformer ;
2122import com .google .android .datatransport .Transport ;
2223import com .google .android .datatransport .cct .CCTDestination ;
2324import com .google .android .datatransport .runtime .TransportRuntime ;
2425import com .google .android .gms .tasks .Task ;
2526import com .google .android .gms .tasks .TaskCompletionSource ;
27+ import com .google .android .gms .tasks .Tasks ;
28+ import com .google .firebase .crashlytics .internal .Logger ;
2629import com .google .firebase .crashlytics .internal .common .CrashlyticsReportWithSessionId ;
2730import com .google .firebase .crashlytics .internal .model .CrashlyticsReport ;
2831import com .google .firebase .crashlytics .internal .model .serialization .CrashlyticsReportJsonTransform ;
@@ -41,8 +44,14 @@ public class DataTransportCrashlyticsReportSender {
4144 private static final String CRASHLYTICS_API_KEY =
4245 mergeStrings ("AzSBpY4F0rHiHFdinTvM" , "IayrSTFL9eJ69YeSUO2" );
4346 private static final String CRASHLYTICS_TRANSPORT_NAME = "FIREBASE_CRASHLYTICS_REPORT" ;
47+ private static final Transformer <CrashlyticsReport , byte []> DEFAULT_TRANSFORM =
48+ (r ) -> TRANSFORM .reportToJson (r ).getBytes (Charset .forName ("UTF-8" ));
49+
50+ // Assumed limit of 1MB, with a little extra headroom
51+ private static final int MAX_DATATRANSPORT_BYTES = 1024 * 832 ;
4452
4553 private final Transport <CrashlyticsReport > transport ;
54+ private final Transformer <CrashlyticsReport , byte []> transportTransform ;
4655
4756 public static DataTransportCrashlyticsReportSender create (Context context ) {
4857 TransportRuntime .initialize (context );
@@ -53,26 +62,42 @@ public static DataTransportCrashlyticsReportSender create(Context context) {
5362 CRASHLYTICS_TRANSPORT_NAME ,
5463 CrashlyticsReport .class ,
5564 Encoding .of ("json" ),
56- r -> TRANSFORM . reportToJson ( r ). getBytes ( Charset . forName ( "UTF-8" )) );
57- return new DataTransportCrashlyticsReportSender (transport );
65+ DEFAULT_TRANSFORM );
66+ return new DataTransportCrashlyticsReportSender (transport , DEFAULT_TRANSFORM );
5867 }
5968
60- DataTransportCrashlyticsReportSender (Transport <CrashlyticsReport > transport ) {
69+ DataTransportCrashlyticsReportSender (
70+ Transport <CrashlyticsReport > transport ,
71+ Transformer <CrashlyticsReport , byte []> transportTransform ) {
6172 this .transport = transport ;
73+ this .transportTransform = transportTransform ;
6274 }
6375
6476 @ NonNull
6577 public Task <CrashlyticsReportWithSessionId > sendReport (
66- @ NonNull CrashlyticsReportWithSessionId report ) {
78+ @ NonNull CrashlyticsReportWithSessionId reportWithSessionId ) {
79+ final CrashlyticsReport report = reportWithSessionId .getReport ();
80+
81+ // Workaround for b/152905875, impose a maximum size on reports.
82+ final int reportSize = transportTransform .apply (report ).length ;
83+ if (reportSize > MAX_DATATRANSPORT_BYTES ) {
84+ Logger .getLogger ()
85+ .d (
86+ String .format (
87+ "Report is too large to be sent via DataTransport. Maximum size is %d bytes. Report size is %d bytes. Removing report." ,
88+ MAX_DATATRANSPORT_BYTES , reportSize ));
89+ return Tasks .forResult (reportWithSessionId );
90+ }
91+
6792 TaskCompletionSource <CrashlyticsReportWithSessionId > tcs = new TaskCompletionSource <>();
6893 transport .schedule (
69- Event .ofUrgent (report . getReport () ),
94+ Event .ofUrgent (report ),
7095 error -> {
7196 if (error != null ) {
7297 tcs .trySetException (error );
7398 return ;
7499 }
75- tcs .trySetResult (report );
100+ tcs .trySetResult (reportWithSessionId );
76101 });
77102 return tcs .getTask ();
78103 }
0 commit comments