Skip to content

Commit fec8b0c

Browse files
a7medevahmedAlaaInstabug
authored andcommitted
fix(android): resolve an OOM in network logs (#1244)
1 parent efea1a8 commit fec8b0c

File tree

13 files changed

+148
-448
lines changed

13 files changed

+148
-448
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## [Unreleased](https://github.com/Instabug/Instabug-React-Native/compare/v13.2.0...dev)
4+
5+
### Fixed
6+
7+
- Fix an OOM (out-of-memory) crash while saving network logs on Android ([#1244](https://github.com/Instabug/Instabug-React-Native/pull/1244)).
8+
39
## [13.2.0](https://github.com/Instabug/Instabug-React-Native/compare/v13.1.1...v13.2.0) (July 7, 2024)
410

511
### Changed

android/src/main/java/com/instabug/reactlibrary/RNInstabugAPMModule.java

Lines changed: 27 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@
99

1010
import com.facebook.react.bridge.Promise;
1111
import com.facebook.react.bridge.ReactApplicationContext;
12+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
1213
import com.facebook.react.bridge.ReactMethod;
13-
import com.facebook.react.bridge.ReadableMap;
1414
import com.instabug.apm.APM;
1515
import com.instabug.apm.model.ExecutionTrace;
1616
import com.instabug.apm.networking.APMNetworkLogger;
17-
import com.instabug.apm.networkinterception.cp.APMCPNetworkLog;
18-
import com.instabug.reactlibrary.utils.EventEmitterModule;
1917
import com.instabug.reactlibrary.utils.MainThreadHandler;
2018

19+
import org.json.JSONException;
20+
import org.json.JSONObject;
21+
import java.lang.reflect.InvocationTargetException;
2122
import java.lang.reflect.Method;
2223

2324
import java.util.HashMap;
@@ -26,7 +27,7 @@
2627

2728
import static com.instabug.reactlibrary.utils.InstabugUtil.getMethod;
2829

29-
public class RNInstabugAPMModule extends EventEmitterModule {
30+
public class RNInstabugAPMModule extends ReactContextBaseJavaModule {
3031

3132
public RNInstabugAPMModule(ReactApplicationContext reactApplicationContext) {
3233
super(reactApplicationContext);
@@ -328,65 +329,36 @@ private void networkLogAndroid(final double requestStartTime,
328329
final double statusCode,
329330
final String responseContentType,
330331
@Nullable final String errorDomain,
331-
@Nullable final ReadableMap w3cAttributes,
332332
@Nullable final String gqlQueryName,
333-
@Nullable final String serverErrorMessage
334-
) {
333+
@Nullable final String serverErrorMessage) {
335334
try {
336335
APMNetworkLogger networkLogger = new APMNetworkLogger();
336+
337337
final boolean hasError = errorDomain != null && !errorDomain.isEmpty();
338338
final String errorMessage = hasError ? errorDomain : null;
339339

340-
Boolean isW3cHeaderFound=false;
341-
Long partialId=null;
342-
Long networkStartTimeInSeconds=null;
343-
344-
345340
try {
346-
if (w3cAttributes.hasKey("isW3cHeaderFound")) {
347-
isW3cHeaderFound = w3cAttributes.getBoolean("isW3cHeaderFound");
348-
}
349-
350-
if (w3cAttributes.hasKey("partialId")) {
351-
partialId =(long) w3cAttributes.getDouble("partialId");
352-
networkStartTimeInSeconds = (long) w3cAttributes.getDouble("networkStartTimeInSeconds");
353-
}
354-
355-
} catch (Exception e) {
356-
e.printStackTrace();
357-
}
358-
APMCPNetworkLog.W3CExternalTraceAttributes w3cExternalTraceAttributes =
359-
new APMCPNetworkLog.W3CExternalTraceAttributes(
360-
isW3cHeaderFound,
361-
partialId,
362-
networkStartTimeInSeconds,
363-
w3cAttributes.getString("w3cGeneratedHeader"),
364-
w3cAttributes.getString("w3cCaughtHeader")
365-
);
366-
try {
367-
Method method = getMethod(Class.forName("com.instabug.apm.networking.APMNetworkLogger"), "log", long.class, long.class, String.class, String.class, long.class, String.class, String.class, String.class, String.class, String.class, long.class, int.class, String.class, String.class, String.class, String.class, APMCPNetworkLog.W3CExternalTraceAttributes.class);
341+
Method method = getMethod(Class.forName("com.instabug.apm.networking.APMNetworkLogger"), "log", long.class, long.class, String.class, String.class, long.class, String.class, String.class, String.class, String.class, String.class, long.class, int.class, String.class, String.class, String.class, String.class);
368342
if (method != null) {
369-
method.invoke(
370-
networkLogger,
371-
(long) requestStartTime * 1000,
372-
(long) requestDuration,
373-
requestHeaders,
374-
requestBody,
375-
(long) requestBodySize,
376-
requestMethod,
377-
requestUrl,
378-
requestContentType,
379-
responseHeaders,
380-
responseBody,
381-
(long)responseBodySize,
382-
(int) statusCode,
383-
responseContentType,
384-
errorMessage,
385-
gqlQueryName,
386-
serverErrorMessage,
387-
w3cExternalTraceAttributes
388-
);
389-
343+
method.invoke(
344+
networkLogger,
345+
requestStartTime,
346+
requestDuration,
347+
requestHeaders,
348+
requestBody,
349+
requestBodySize,
350+
requestMethod,
351+
requestUrl,
352+
requestContentType,
353+
responseHeaders,
354+
responseBody,
355+
responseBodySize,
356+
statusCode,
357+
responseContentType,
358+
errorMessage,
359+
gqlQueryName,
360+
serverErrorMessage
361+
);
390362
} else {
391363
Log.e("IB-CP-Bridge", "APMNetworkLogger.log was not found by reflection");
392364
}
@@ -397,6 +369,4 @@ private void networkLogAndroid(final double requestStartTime,
397369
e.printStackTrace();
398370
}
399371
}
400-
401-
402372
}

examples/default/ios/InstabugTests/InstabugSampleTests.m

Lines changed: 7 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#import <XCTest/XCTest.h>
99
#import "OCMock/OCMock.h"
1010
#import "Instabug/Instabug.h"
11+
#import "Instabug/IBGSurvey.h"
1112
#import "InstabugReactBridge.h"
1213
#import <Instabug/IBGTypes.h>
1314
#import "IBGConstants.h"
@@ -72,7 +73,7 @@ - (void)testInit {
7273
NSArray *invocationEvents = [NSArray arrayWithObjects:[NSNumber numberWithInteger:floatingButtonInvocationEvent], nil];
7374
BOOL useNativeNetworkInterception = YES;
7475
IBGSDKDebugLogsLevel sdkDebugLogsLevel = IBGSDKDebugLogsLevelDebug;
75-
76+
7677
OCMStub([mock setCodePushVersion:codePushVersion]);
7778

7879
[self.instabugBridge init:appToken invocationEvents:invocationEvents debugLogsLevel:sdkDebugLogsLevel useNativeNetworkInterception:useNativeNetworkInterception codePushVersion:codePushVersion];
@@ -84,9 +85,9 @@ - (void)testInit {
8485
- (void)testSetCodePushVersion {
8586
id mock = OCMClassMock([Instabug class]);
8687
NSString *codePushVersion = @"123";
87-
88+
8889
[self.instabugBridge setCodePushVersion:codePushVersion];
89-
90+
9091
OCMVerify([mock setCodePushVersion:codePushVersion]);
9192
}
9293

@@ -332,12 +333,7 @@ - (void)testNetworkLogIOS {
332333
double duration = 150;
333334
NSString *gqlQueryName = nil;
334335
NSString *serverErrorMessage = nil;
335-
NSDictionary* w3cExternalTraceAttributes = nil;
336-
NSNumber *isW3cCaughted = nil;
337-
NSNumber *partialID = nil;
338-
NSNumber *timestamp= nil;
339-
NSString *generatedW3CTraceparent= nil;
340-
NSString *caughtedW3CTraceparent= nil;
336+
341337
[self.instabugBridge networkLogIOS:url
342338
method:method
343339
requestBody:requestBody
@@ -353,8 +349,7 @@ - (void)testNetworkLogIOS {
353349
startTime:startTime
354350
duration:duration
355351
gqlQueryName:gqlQueryName
356-
w3cExternalTraceAttributes:nil
357-
];
352+
serverErrorMessage:serverErrorMessage];
358353

359354
OCMVerify([mIBGNetworkLogger addNetworkLogWithUrl:url
360355
method:method
@@ -371,13 +366,7 @@ - (void)testNetworkLogIOS {
371366
startTime:startTime * 1000
372367
duration:duration * 1000
373368
gqlQueryName:gqlQueryName
374-
isW3cCaughted:nil
375-
partialID:nil
376-
timestamp:nil
377-
generatedW3CTraceparent:nil
378-
caughtedW3CTraceparent:nil
379-
380-
]);
369+
serverErrorMessage:serverErrorMessage]);
381370
}
382371

383372
- (void)testSetFileAttachment {
@@ -509,102 +498,4 @@ - (void)testClearAllExperiments {
509498
OCMVerify([mock clearAllExperiments]);
510499
}
511500

512-
513-
- (void) testIsW3ExternalTraceIDEnabled {
514-
id mock = OCMClassMock([IBGNetworkLogger class]);
515-
NSNumber *expectedValue = @(YES);
516-
517-
OCMStub([mock w3ExternalTraceIDEnabled]).andReturn([expectedValue boolValue]);
518-
519-
XCTestExpectation *expectation = [self expectationWithDescription:@"Call completion handler"];
520-
RCTPromiseResolveBlock resolve = ^(NSNumber *result) {
521-
XCTAssertEqualObjects(result, expectedValue);
522-
[expectation fulfill];
523-
};
524-
525-
[self.instabugBridge isW3ExternalTraceIDEnabled:resolve :nil];
526-
527-
[self waitForExpectationsWithTimeout:1.0 handler:nil];
528-
529-
OCMVerify([mock w3ExternalTraceIDEnabled]);
530-
}
531-
532-
- (void) testIsW3ExternalGeneratedHeaderEnabled {
533-
id mock = OCMClassMock([IBGNetworkLogger class]);
534-
NSNumber *expectedValue = @(YES);
535-
536-
OCMStub([mock w3ExternalGeneratedHeaderEnabled]).andReturn([expectedValue boolValue]);
537-
538-
XCTestExpectation *expectation = [self expectationWithDescription:@"Call completion handler"];
539-
RCTPromiseResolveBlock resolve = ^(NSNumber *result) {
540-
XCTAssertEqualObjects(result, expectedValue);
541-
[expectation fulfill];
542-
};
543-
544-
[self.instabugBridge isW3ExternalGeneratedHeaderEnabled:resolve :nil];
545-
546-
[self waitForExpectationsWithTimeout:1.0 handler:nil];
547-
548-
OCMVerify([mock w3ExternalGeneratedHeaderEnabled]);
549-
}
550-
551-
- (void) testIsW3CaughtHeaderEnabled {
552-
id mock = OCMClassMock([IBGNetworkLogger class]);
553-
NSNumber *expectedValue = @(YES);
554-
555-
OCMStub([mock w3CaughtHeaderEnabled]).andReturn([expectedValue boolValue]);
556-
557-
XCTestExpectation *expectation = [self expectationWithDescription:@"Call completion handler"];
558-
RCTPromiseResolveBlock resolve = ^(NSNumber *result) {
559-
XCTAssertEqualObjects(result, expectedValue);
560-
[expectation fulfill];
561-
};
562-
563-
[self.instabugBridge isW3CaughtHeaderEnabled:resolve :nil];
564-
565-
[self waitForExpectationsWithTimeout:1.0 handler:nil];
566-
567-
OCMVerify([mock w3CaughtHeaderEnabled]);
568-
}
569-
570-
571-
- (void)testAddFeatureFlags {
572-
id mock = OCMClassMock([Instabug class]);
573-
NSDictionary *featureFlagsMap = @{ @"key13" : @"value1", @"key2" : @"value2"};
574-
575-
OCMStub([mock addFeatureFlags :[OCMArg any]]);
576-
[self.instabugBridge addFeatureFlags:featureFlagsMap];
577-
OCMVerify([mock addFeatureFlags: [OCMArg checkWithBlock:^(id value) {
578-
NSArray<IBGFeatureFlag *> *featureFlags = value;
579-
NSString* firstFeatureFlagName = [featureFlags objectAtIndex:0 ].name;
580-
NSString* firstFeatureFlagKey = [[featureFlagsMap allKeys] objectAtIndex:0] ;
581-
if([ firstFeatureFlagKey isEqualToString: firstFeatureFlagName]){
582-
return YES;
583-
}
584-
return NO;
585-
}]]);
586-
}
587-
588-
- (void)testRemoveFeatureFlags {
589-
id mock = OCMClassMock([Instabug class]);
590-
NSArray *featureFlags = @[@"exp1", @"exp2"];
591-
[self.instabugBridge removeFeatureFlags:featureFlags];
592-
OCMVerify([mock removeFeatureFlags: [OCMArg checkWithBlock:^(id value) {
593-
NSArray<IBGFeatureFlag *> *featureFlagsObJ = value;
594-
NSString* firstFeatureFlagName = [featureFlagsObJ objectAtIndex:0 ].name;
595-
NSString* firstFeatureFlagKey = [featureFlags firstObject] ;
596-
if([ firstFeatureFlagKey isEqualToString: firstFeatureFlagName]){
597-
return YES;
598-
}
599-
return NO;
600-
}]]);
601-
}
602-
603-
- (void)testRemoveAllFeatureFlags {
604-
id mock = OCMClassMock([Instabug class]);
605-
OCMStub([mock removeAllFeatureFlags]);
606-
[self.instabugBridge removeAllFeatureFlags];
607-
OCMVerify([mock removeAllFeatureFlags]);
608-
}
609-
610501
@end

ios/RNInstabug/InstabugReactBridge.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,23 @@
126126
serverErrorMessage:(NSString * _Nullable)serverErrorMessage
127127
w3cExternalTraceAttributes:(NSDictionary * _Nullable)w3cExternalTraceAttributes;
128128

129+
- (void)networkLogIOS:(NSString * _Nonnull)url
130+
method:(NSString * _Nonnull)method
131+
requestBody:(NSString * _Nonnull)requestBody
132+
requestBodySize:(double)requestBodySize
133+
responseBody:(NSString * _Nonnull)responseBody
134+
responseBodySize:(double)responseBodySize
135+
responseCode:(double)responseCode
136+
requestHeaders:(NSDictionary * _Nonnull)requestHeaders
137+
responseHeaders:(NSDictionary * _Nonnull)responseHeaders
138+
contentType:(NSString * _Nonnull)contentType
139+
errorDomain:(NSString * _Nullable)errorDomain
140+
errorCode:(double)errorCode
141+
startTime:(double)startTime
142+
duration:(double)duration
143+
gqlQueryName:(NSString * _Nullable)gqlQueryName
144+
serverErrorMessage:(NSString * _Nullable)serverErrorMessage;
145+
129146
/*
130147
+------------------------------------------------------------------------+
131148
| Experiments |

0 commit comments

Comments
 (0)