From a94adba80bacefe23bdb18ca095992edda3424ca Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:41:23 +0800 Subject: [PATCH 01/10] Raise example iOS deployment target to 15.0 Bumps the iOS floor for the example app and its broadcast extension: - Podfile `platform :ios` 13.0 -> 15.0, and the post_install override that forces IPHONEOS_DEPLOYMENT_TARGET on every pod 12.1 -> 15.0 - Runner and LiveKit Broadcast Extension targets 14.0 -> 15.0 Also sorts Info.plist keys into alphabetical order, which Xcode does on save (no semantic change). --- example/ios/Podfile | 4 ++-- example/ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------ example/ios/Runner/Info.plist | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/example/ios/Podfile b/example/ios/Podfile index f08511756..371916ac4 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '13.0' +platform :ios, '15.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -43,7 +43,7 @@ post_install do |installer| # https://stackoverflow.com/questions/63973136/the-ios-deployment-target-iphoneos-deployment-target-is-set-to-8-0-in-flutter # target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.1' + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0' # # Make it compile with M1 macs # diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 63f4375a1..1ec103ac5 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -510,7 +510,7 @@ DEVELOPMENT_TEAM = 76TVFCUKK7; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -648,7 +648,7 @@ DEVELOPMENT_TEAM = 76TVFCUKK7; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -677,7 +677,7 @@ DEVELOPMENT_TEAM = 76TVFCUKK7; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -710,7 +710,7 @@ INFOPLIST_FILE = "LiveKit Broadcast Extension/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "LiveKit Broadcast Extension"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -749,7 +749,7 @@ INFOPLIST_FILE = "LiveKit Broadcast Extension/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "LiveKit Broadcast Extension"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -785,7 +785,7 @@ INFOPLIST_FILE = "LiveKit Broadcast Extension/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "LiveKit Broadcast Extension"; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist index 279909e99..af903405a 100644 --- a/example/ios/Runner/Info.plist +++ b/example/ios/Runner/Info.plist @@ -2,10 +2,6 @@ - RTCScreenSharingExtension - io.livekit.example.flutter.LiveKit-Broadcast-Extension - RTCAppGroupIdentifier - group.io.livekit.example.flutter CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion @@ -32,6 +28,12 @@ $(PRODUCT_NAME) will use camera NSMicrophoneUsageDescription $(PRODUCT_NAME) will use microphone + RTCAppGroupIdentifier + group.io.livekit.example.flutter + RTCScreenSharingExtension + io.livekit.example.flutter.LiveKit-Broadcast-Extension + UIApplicationSupportsIndirectInputEvents + UIBackgroundModes audio @@ -55,7 +57,5 @@ UIViewControllerBasedStatusBarAppearance - UIApplicationSupportsIndirectInputEvents - From 99bf368fee364a907cd4283c871298f929d3ee7d Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:41:31 +0800 Subject: [PATCH 02/10] Exclude generated and platform dirs from example analysis `flutter analyze` in example/ was walking build output and the native platform folders. Adds the standard excludes (build, android, ios, web, windows, macos, linux) alongside the existing generated-code patterns. --- example/analysis_options.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml index d80854028..de6f248e2 100644 --- a/example/analysis_options.yaml +++ b/example/analysis_options.yaml @@ -39,6 +39,13 @@ analyzer: - "**/*.pbenum.dart" - "**/*.pbjson.dart" - "**/*.pbserver.dart" + - build/** + - android/** + - ios/** + - web/** + - windows/** + - macos/** + - linux/** linter: rules: From 902208528c1975662f313465088203d48c796451 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Wed, 26 Aug 2026 23:23:30 +0800 Subject: [PATCH 03/10] Migrate example iOS app to UIScene lifecycle iOS 27 terminates apps that have not adopted the UIScene lifecycle, and `flutter run` tool-exits on the resulting device log line, so the example app could no longer be launched on an iOS 27 device. - Add `UIApplicationSceneManifest` to Info.plist using the stock `FlutterSceneDelegate`, so no custom scene delegate is needed. - Conform AppDelegate to `FlutterImplicitEngineDelegate` and move `GeneratedPluginRegistrant.register` into `didInitializeImplicitFlutterEngine`. Under UIScene the app delegate's `window` is nil, so the old `guard let controller = window?...` returned early and skipped plugin registration entirely. See https://flutter.dev/to/uiscene-migration --- example/ios/Runner/AppDelegate.swift | 10 +++++----- example/ios/Runner/Info.plist | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift index fd1699792..57a282ca0 100644 --- a/example/ios/Runner/AppDelegate.swift +++ b/example/ios/Runner/AppDelegate.swift @@ -2,16 +2,16 @@ import UIKit import Flutter @main -@objc class AppDelegate: FlutterAppDelegate { +@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { - guard let controller = window?.rootViewController as? FlutterViewController else { - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } - GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } + + func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { + GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) + } } diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist index af903405a..f42d5d9c1 100644 --- a/example/ios/Runner/Info.plist +++ b/example/ios/Runner/Info.plist @@ -32,6 +32,27 @@ group.io.livekit.example.flutter RTCScreenSharingExtension io.livekit.example.flutter.LiveKit-Broadcast-Extension + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneConfigurationName + flutter + UISceneDelegateClassName + FlutterSceneDelegate + UISceneStoryboardFile + Main + + + + UIApplicationSupportsIndirectInputEvents UIBackgroundModes From 593c4cbd069a681d542b80df4616d247eba8ca4b Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:41:38 +0800 Subject: [PATCH 04/10] Raise example macOS deployment target to 12.0 Flutter 3.47 requires a macOS 12.0 floor; the example was still at 10.15. Updates the Podfile `platform :osx` and MACOSX_DEPLOYMENT_TARGET in all three build configurations. --- example/macos/Podfile | 2 +- example/macos/Runner.xcodeproj/project.pbxproj | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/example/macos/Podfile b/example/macos/Podfile index 9ec46f8cd..0c76ccf54 100644 --- a/example/macos/Podfile +++ b/example/macos/Podfile @@ -1,4 +1,4 @@ -platform :osx, '10.15' +platform :osx, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/example/macos/Runner.xcodeproj/project.pbxproj b/example/macos/Runner.xcodeproj/project.pbxproj index f96649524..cee97a2a8 100644 --- a/example/macos/Runner.xcodeproj/project.pbxproj +++ b/example/macos/Runner.xcodeproj/project.pbxproj @@ -398,7 +398,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -479,7 +479,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -526,7 +526,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; From e98df3417bd958cf3e10064529d59dee3125d163 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:00:20 +0800 Subject: [PATCH 05/10] Drop unused use_modular_headers! from example Podfiles No Flutter template uses `use_modular_headers!` on any platform; it was a local addition to both example Podfiles. Verified unnecessary by building each platform with Swift Package Manager disabled, so every plugin resolves through CocoaPods (including flutter_webrtc + WebRTC-SDK, and permission_handler_apple on iOS): both `pod install` and the Xcode build succeed without it. --- example/ios/Podfile | 1 - example/macos/Podfile | 1 - 2 files changed, 2 deletions(-) diff --git a/example/ios/Podfile b/example/ios/Podfile index 371916ac4..ab0d7914d 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -29,7 +29,6 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end diff --git a/example/macos/Podfile b/example/macos/Podfile index 0c76ccf54..080c95201 100644 --- a/example/macos/Podfile +++ b/example/macos/Podfile @@ -28,7 +28,6 @@ flutter_macos_podfile_setup target 'Runner' do use_frameworks! - use_modular_headers! flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) end From 7a75e124622b6372db10cc1d46c4f9ed2bd05326 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:00:37 +0800 Subject: [PATCH 06/10] Stop excluding arm64 for the iOS simulator in the example The Podfile's post_install forced `EXCLUDED_ARCHS[sdk=iphonesimulator*] = 'arm64'` on every pod. That is a 2020 workaround for Intel Macs, and on Apple Silicon it is backwards: it made `flutter run`/`flutter build` print The following target(s) do not support arm64 architecture, which is a requirement for Apple Silicon iOS 26+ simulators on every invocation, listing every plugin. After removing it, `flutter build ios --simulator --debug` succeeds, the warning is gone, and the built binary reports `x86_64 arm64`. --- example/ios/Podfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/example/ios/Podfile b/example/ios/Podfile index ab0d7914d..22364f346 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -43,10 +43,6 @@ post_install do |installer| # target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0' - # - # Make it compile with M1 macs - # - config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = 'arm64' end end From 711a6486db0d8ea638f3dd2e34320a0afc363d08 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:41:50 +0800 Subject: [PATCH 07/10] Clean up stale iOS project config in example - Project-level IPHONEOS_DEPLOYMENT_TARGET 12.1 -> 15.0. Every target already overrode this to 15.0, so it was dead weight, and any new target would have silently inherited 12.1. - Drop the three empty `EXCLUDED_ARCHS = ""` entries, left over from the same era as the simulator arm64 workaround. --- example/ios/Runner.xcodeproj/project.pbxproj | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 1ec103ac5..dbf91446c 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -479,7 +479,6 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - EXCLUDED_ARCHS = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -488,7 +487,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -558,7 +557,6 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - EXCLUDED_ARCHS = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -573,7 +571,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -615,7 +613,6 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - EXCLUDED_ARCHS = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -624,7 +621,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; From 1f291705d226e00fc639f83701f45b3dd39f604a Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:06:53 +0800 Subject: [PATCH 08/10] Drop CocoaPods framework/resource phases from the iOS example project With Swift Package Manager on (the default since Flutter 3.41), every plugin resolves as a Swift Package and `Flutter` is the only remaining pod, so `pod install` removes the `[CP] Embed Pods Frameworks` and `[CP] Copy Pods Resources` build phases: there is nothing left to embed or copy. These phases are generated and owned by CocoaPods, so `pod install` re-adds them for anyone building with SPM disabled. Committing the generated state keeps iOS consistent with macOS, which already carried only `[CP] Check Pods Manifest.lock`. --- example/ios/Runner.xcodeproj/project.pbxproj | 36 -------------------- 1 file changed, 36 deletions(-) diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index dbf91446c..db4cf83b9 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -207,8 +207,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, D7FECD302860997500D04D1C /* Embed App Extensions */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - D9316257C44ACC699FF042FD /* [CP] Embed Pods Frameworks */, - 846FAB5D745587A695E025C5 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -320,23 +318,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n"; }; - 846FAB5D745587A695E025C5 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -352,23 +333,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; - D9316257C44ACC699FF042FD /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; F30F68AB50F7F85C7927F195 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; From 6342c3f0b5b978ebf8a598be247704cc647f6886 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:22:06 +0800 Subject: [PATCH 09/10] Raise example Android toolchain to Flutter 3.47's minimums `flutter run -d ` failed outright: Flutter 3.47 enforces minimum AGP and Kotlin Gradle Plugin versions that the example was below, and they surface one at a time. Android Gradle Plugin 8.9.1 -> 8.11.1 (Flutter minimum) Kotlin Gradle Plugin 2.1.0 -> 2.2.20 (Flutter minimum) Also picks up the two AGP 9 opt-outs that Flutter's own migrator writes into gradle.properties (`android.builtInKotlin`, `android.newDsl`). These are the enforced minimums, not the versions `flutter create` now generates (AGP 9.1.0 / Kotlin 2.4.0 / Gradle 9.3.1). Moving to those is a larger toolchain jump and is left as separate work. Gradle stays at 8.14, which only warns. Verified by running the example on a Pixel 10 Pro emulator. --- example/android/gradle.properties | 4 ++++ example/android/settings.gradle | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/example/android/gradle.properties b/example/android/gradle.properties index fbee1d8cd..d5da7278a 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -1,2 +1,6 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false diff --git a/example/android/settings.gradle b/example/android/settings.gradle index 8c61b9fdc..ebf08564f 100644 --- a/example/android/settings.gradle +++ b/example/android/settings.gradle @@ -18,8 +18,8 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.9.1' apply false - id "org.jetbrains.kotlin.android" version "2.1.0" apply false + id "com.android.application" version '8.11.1' apply false + id "org.jetbrains.kotlin.android" version "2.2.20" apply false } include ":app" From e9822939a11059d7781a546b1eaeb743ed5f9b82 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:37:04 +0800 Subject: [PATCH 10/10] Align example Android NDK and Java target with the Flutter template Two divergences from what `flutter create` generates, both surfaced as build warnings: - ndkVersion was pinned to 27.0.12077973 while connectivity_plus, device_info_plus, flutter_background, flutter_webrtc and jni all require 28.2.13676358. Use `flutter.ndkVersion` (the template's own reference, currently 28.2.13676358) so this tracks the SDK instead of drifting again. - Java source/target compatibility was VERSION_1_8, which now warns "source/target value 8 is obsolete and will be removed in a future release". The template uses VERSION_17. kotlinOptions.jvmTarget moves to 17 alongside it; leaving it at 1_8 would fail with inconsistent JVM-target compatibility. Both warnings are gone from the build output and the APK still builds. --- example/android/app/build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 72964cfc0..1996fa610 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -8,15 +8,15 @@ plugins { android { namespace = "io.livekit.example" compileSdk = flutter.compileSdkVersion - ndkVersion = "27.0.12077973" + ndkVersion = flutter.ndkVersion compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 + jvmTarget = JavaVersion.VERSION_17 } defaultConfig {