Skip to content

[cronet_http] Native JNI crashes in globalEnv_CallObjectMethod/CallVoidMethod with native_dio_adapter #1842

@androidanit

Description

@androidanit

After migrating from the default IOClient to cronet_http via native_dio_adapter, the app is experiencing native JNI crashes reported on Google Play Console. The crashes occur intermittently and are affecting production users, though they are not persistent (users experience them occasionally, not every launch).

The app was previously stable with default IOClient and no JNI-related crashes were observed.

Crash Statistics

Two primary crash patterns account for 78% of all crashes:

1. Crash Pattern 1 (44% of crashes):

[split_config.arm64_v8a.apk!libdartjni.so] global_jni_env.c - globalEnv_CallObjectMethod

2. Crash Pattern 2 (34% of crashes):

[split_config.arm64_v8a.apk!libdartjni.so] global_jni_env.c - globalEnv_CallVoidMethod

Environment

  • Flutter: 3.27.1
  • Dart: 3.6.0
  • cronet_http: ^1.6.0
  • native_dio_adapter: ^1.5.0
  • dio: ^5.9.0
  • Platform: Android (arm64_v8a)
  • Target Devices: Production devices with Google Play Services

Dependencies

dependencies:
  flutter:
    sdk: flutter
  dio: ^5.9.0
  cronet_http: ^1.6.0
  native_dio_adapter: ^1.5.0
  dio_smart_retry: ^7.0.1
  # ... other dependencies

Implementation Code

// Configure Dio instance
Dio dio = Dio();

// Using NON default adapter - iOS specific addition
dio.httpClientAdapter = NativeAdapter(
    createCupertinoConfiguration: () => URLSessionConfiguration.ephemeralSessionConfiguration()
      ..cache = null // Completely disable caching
      ..requestCachePolicy = NSURLRequestCachePolicy.NSURLRequestReloadIgnoringCacheData);

Stack Traces

Crash Pattern 1 - globalEnv_CallObjectMethod (44%)

Click to expand full backtrace
#00  pc 0x000000000031562c  /apex/com.android.art/lib64/libart.so (art::JValue art::InvokeVirtualOrInterfaceWithVarArgs<_jmethodID*>(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jmethodID*, std::__va_list)+1640)
#01  pc 0x000000000060efa8  /apex/com.android.art/lib64/libart.so (art::JNI<false>::CallObjectMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list)+180)
#02  pc 0x000000000000edfc  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk!libdartjni.so (globalEnv_CallObjectMethod+342) (BuildId: 08541ae1a4196bcaa5c201e6a89cbfc41db2f31d)
#03  pc 0x00000000002615dc  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#04  pc 0x00000000002ae970  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#05  pc 0x000000000063cf3c  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#06  pc 0x000000000072396c  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#07  pc 0x00000000007328cc  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#08  pc 0x00000000006af33c  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#09  pc 0x00000000006af1c8  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#10  pc 0x000000000026b638  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#11  pc 0x000000000026b29c  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#12  pc 0x000000000026b208  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#13  pc 0x000000000026af4c  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#14  pc 0x00000000006ae554  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#15  pc 0x000000000026aebc  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#16  pc 0x0000000000263d3c  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#17  pc 0x000000000086b500  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#18  pc 0x00000000009b0f58  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#19  pc 0x00000000007cf7a8  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#20  pc 0x000000000047f760  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#21  pc 0x0000000000483258  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#22  pc 0x0000000000018b6c  /system/lib64/libutils.so (android::Looper::pollInner(int)+1252)
#23  pc 0x0000000000018624  /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+124)
#24  pc 0x000000000001a188  /system/lib64/libandroid.so (ALooper_pollOnce+104)
#25  pc 0x0000000000483364  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#26  pc 0x0000000000481468  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#27  pc 0x000000000048129c  /data/app/~~pai6AifDQxJwGFvtuRXX6A==/com.app.live-7G40J9G6eT0dysSf_ihTNg==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#28  pc 0x0000000000104fc4  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+208)
#29  pc 0x000000000009e764  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+68)

Crash Pattern 2 - globalEnv_CallVoidMethod (34%)

Click to expand full backtrace
#00  pc 0x000000000031562c  /apex/com.android.art/lib64/libart.so (art::JValue art::InvokeVirtualOrInterfaceWithVarArgs<_jmethodID*>(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jmethodID*, std::__va_list)+1640)
#01  pc 0x0000000000620a84  /apex/com.android.art/lib64/libart.so (art::JNI<false>::CallVoidMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list)+180)
#02  pc 0x0000000000010558  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk!libdartjni.so (globalEnv_CallVoidMethod+587) (BuildId: 08541ae1a4196bcaa5c201e6a89cbfc41db2f31d)
#03  pc 0x00000000002615dc  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#04  pc 0x0000000000294d68  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#05  pc 0x000000000063cd38  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#06  pc 0x000000000072397c  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#07  pc 0x00000000007328cc  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#08  pc 0x00000000006af33c  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#09  pc 0x00000000006af1c8  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#10  pc 0x000000000026b638  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#11  pc 0x000000000026b29c  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#12  pc 0x000000000026b208  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#13  pc 0x000000000026af4c  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#14  pc 0x00000000006ae554  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#15  pc 0x000000000026aebc  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#16  pc 0x0000000000263d3c  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk (BuildId: 369f5a6f1c3cb3706116077ff581902d)
#17  pc 0x000000000086b500  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#18  pc 0x00000000009b0f58  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#19  pc 0x00000000007cf7a8  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#20  pc 0x000000000047f760  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#21  pc 0x0000000000483258  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#22  pc 0x0000000000018b6c  /system/lib64/libutils.so (android::Looper::pollInner(int)+1252)
#23  pc 0x0000000000018624  /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+124)
#24  pc 0x000000000001a188  /system/lib64/libandroid.so (ALooper_pollOnce+104)
#25  pc 0x0000000000483364  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#26  pc 0x0000000000481468  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#27  pc 0x000000000048129c  /data/app/~~aNdNDucFtiPNKW5Hjvn1KA==/com.app.live-OFfTTdTT6xFvB_i1IThx0Q==/split_config.arm64_v8a.apk!libflutter.so (BuildId: fa30a3aeecc8debd0d43411c85ed486060157f89)
#28  pc 0x0000000000104fc4  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+208)
#29  pc 0x000000000009e764  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+68)

Expected Behavior

The app should function without native crashes when using cronet_http through native_dio_adapter, similar to the stability experienced with the default IOClient.

Actual Behavior

Native JNI crashes occur intermittently (not on every app launch) in production, specifically in libdartjni.so at globalEnv_CallObjectMethod and globalEnv_CallVoidMethod. These crashes affect app performance metrics, with slow warm load times reported on Google Play Console.

Additional Context

  1. Intermittent Nature: The crashes are not persistent - users experience them occasionally, not consistently on every launch

  2. Performance Impact: In addition to crashes, Google Play Console is reporting slow warm load times for the app after introducing cronet_http

Additional Information Needed

Please let me know if you need:

  • Full pubspec.yaml (provided above)
  • App initialization code (main.dart)
  • ProGuard rules (if applicable)
  • Device-specific information from crash reports

Main.dart

FutureOr main() async {
runAppWithFlavor();
}

Future runAppWithFlavor({
List Function()? getFlavorRoutes, // Optional routes
}) async {
WidgetsFlutterBinding.ensureInitialized();

_configureSystemUI();

await Firebase.initializeApp(options: firebaseOptions);

Logger.info("MAIN Starting DI");
await setupLocator();

await LocalNotifications.initialize();
await FirebaseNotifications.initialize();
setupEnhancedErrorHandling();

// Router setup
final router = GoRouter(
initialLocation: '/',
routes: [
...getCommonRoutes(),
...?getFlavorRoutes?.call(),
],
observers: [FirebaseAnalyticsObserver(analytics: FirebaseAnalytics.instance)]
);

di.dart

final locator = GetIt.instance;

// Setup Dependency Injection
Future setupLocator() async {
//Shared preferences
final prefs = await SharedPreferencesWithCacheSingleton.getInstance();
locator.registerSingleton(prefs);

// Configure Dio instance
Dio dio = Dio();

//Using NON default adapter - iOS specific addition
dio.httpClientAdapter = NativeAdapter(
createCupertinoConfiguration: () => URLSessionConfiguration.ephemeralSessionConfiguration()
..cache = null // Completely disable caching
..requestCachePolicy = NSURLRequestCachePolicy.NSURLRequestReloadIgnoringCacheData);

// Define base options
dio.options = BaseOptions(
connectTimeout: const Duration(seconds: 8),
receiveTimeout: const Duration(seconds: Const.timeout),
headers: {
'User-Agent': Const.userAgent,
'Accept-Encoding': 'gzip, deflate, br',
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
},
);
}

app/build.gradle

compileSdk = flutter.compileSdkVersion
ndkVersion = "28.0.12433566"

Metadata

Metadata

Assignees

Labels

package:cronet_httptype-bugIncorrect behavior (everything from a crash to more subtle misbehavior)

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions