From 6d32398dfabb3fb57173a8b59c4e925ca624c5fd Mon Sep 17 00:00:00 2001 From: Donghyun Kim Date: Mon, 31 Jul 2023 19:09:24 +0900 Subject: [PATCH] Use Flutter app project's NDK version from FFI plugin (#131141) image In most cases, a FFI plugin doesn't need its own specific Android NDK version. Just following the Flutter app project's NDK version is enough. If a Flutter app project depends on multiple FFI plugins that use different Android NDK versions, it can be quite wasteful and use excessive disk space due to multiple NDK installations. Using Flutter app project's NDK version is also less error-prone because upgrading the Flutter SDK would be enough when upgrading FFI plugins(If project's `ndkVersion` is `flutter.ndkVersion`), without messing with Android NDK installations. This problem was discussed in some actual FFI plugin repositories, and they are striving to find their own solutions: - https://github.com/superlistapp/super_native_extensions/issues/143#issuecomment-1646207706 - https://github.com/cunarist/rust-in-flutter/discussions/60#discussioncomment-6484218 - https://github.com/rive-app/rive-flutter/issues/320 - https://github.com/juicycleff/flutter-unity-view-widget/issues/832 --- .../templates/plugin_ffi/android.tmpl/build.gradle.tmpl | 8 +++++--- .../android_plugin_ndkversion_mismatch_test.dart | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/flutter_tools/templates/plugin_ffi/android.tmpl/build.gradle.tmpl b/packages/flutter_tools/templates/plugin_ffi/android.tmpl/build.gradle.tmpl index 74511b59ced82..319ed1f910a0a 100644 --- a/packages/flutter_tools/templates/plugin_ffi/android.tmpl/build.gradle.tmpl +++ b/packages/flutter_tools/templates/plugin_ffi/android.tmpl/build.gradle.tmpl @@ -33,9 +33,11 @@ android { // to bump the version in their app. compileSdkVersion {{compileSdkVersion}} - // Bumping the plugin ndkVersion requires all clients of this plugin to bump - // the version in their app and to download a newer version of the NDK. - ndkVersion "{{ndkVersion}}" + // Use the NDK version + // declared in /android/app/build.gradle file of the Flutter project. + // Replace it with a version number if this plugin requires a specfic NDK version. + // (e.g. ndkVersion "23.1.7779620") + ndkVersion android.ndkVersion // Invoke the shared CMake build with the Android Gradle Plugin. externalNativeBuild { diff --git a/packages/flutter_tools/test/integration.shard/android_plugin_ndkversion_mismatch_test.dart b/packages/flutter_tools/test/integration.shard/android_plugin_ndkversion_mismatch_test.dart index c567c08e4782b..2580c4d16ea8d 100644 --- a/packages/flutter_tools/test/integration.shard/android_plugin_ndkversion_mismatch_test.dart +++ b/packages/flutter_tools/test/integration.shard/android_plugin_ndkversion_mismatch_test.dart @@ -46,7 +46,7 @@ void main() { final String pluginBuildGradle = pluginGradleFile.readAsStringSync(); // Bump up plugin ndkVersion to 21.4.7075529. - final RegExp androidNdkVersionRegExp = RegExp(r'ndkVersion (\"[0-9\.]+\"|flutter.ndkVersion)'); + final RegExp androidNdkVersionRegExp = RegExp(r'ndkVersion (\"[0-9\.]+\"|flutter.ndkVersion|android.ndkVersion)'); final String newPluginGradleFile = pluginBuildGradle.replaceAll(androidNdkVersionRegExp, 'ndkVersion "21.4.7075529"'); expect(newPluginGradleFile, contains('21.4.7075529')); pluginGradleFile.writeAsStringSync(newPluginGradleFile);