From 2078620bf24a94f3fd6fd2a5305eea7daed1de4f Mon Sep 17 00:00:00 2001 From: Alejandro Gaston Alvarez Date: Wed, 11 Mar 2026 14:32:27 +0100 Subject: [PATCH] Fix Flutter iOS simulator native asset packaging --- packages/flutter/CHANGELOG.md | 5 +++ packages/flutter/hook/build.dart | 57 +++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/packages/flutter/CHANGELOG.md b/packages/flutter/CHANGELOG.md index 4a26d75..6c76122 100644 --- a/packages/flutter/CHANGELOG.md +++ b/packages/flutter/CHANGELOG.md @@ -1,3 +1,8 @@ +## Unreleased + +- Fix Flutter iOS simulator native-asset packaging by emitting an + architecture-specific dylib for each simulator target. + ## 0.9.85 - Initial release. diff --git a/packages/flutter/hook/build.dart b/packages/flutter/hook/build.dart index 7430ce3..34ce21f 100644 --- a/packages/flutter/hook/build.dart +++ b/packages/flutter/hook/build.dart @@ -17,9 +17,7 @@ void main(List args) async { final binaryPath = _resolveBinaryPath(os, arch, codeConfig); if (binaryPath == null) { - throw UnsupportedError( - 'sqlite_vector does not support $os $arch.', - ); + throw UnsupportedError('sqlite_vector does not support $os $arch.'); } final nativeLibDir = p.join( @@ -34,17 +32,68 @@ void main(List args) async { ); } + output.dependencies.add(file.uri); + + final assetFile = await _prepareAssetFile( + input: input, + os: os, + arch: arch, + config: codeConfig, + file: file, + ); + output.assets.code.add( CodeAsset( package: input.packageName, name: 'src/native/sqlite_vector_extension.dart', linkMode: DynamicLoadingBundled(), - file: file.uri, + file: assetFile.uri, ), ); }); } +Future _prepareAssetFile({ + required BuildInput input, + required OS os, + required Architecture arch, + required CodeConfig config, + required File file, +}) async { + if (os != OS.iOS || config.iOS.targetSdk == IOSSdk.iPhoneOS) { + return file; + } + + final thinArch = switch (arch) { + Architecture.arm64 => 'arm64', + Architecture.x64 => 'x86_64', + _ => null, + }; + if (thinArch == null) { + return file; + } + + final outputName = 'vector_ios_sim_$thinArch.dylib'; + final outputFile = File.fromUri(input.outputDirectory.resolve(outputName)); + await outputFile.parent.create(recursive: true); + + final result = await Process.run('/usr/bin/lipo', [ + file.path, + '-thin', + thinArch, + '-output', + outputFile.path, + ]); + if (result.exitCode != 0) { + throw StateError( + 'Failed to thin sqlite_vector iOS simulator binary for $thinArch: ' + '${result.stderr}', + ); + } + + return outputFile; +} + String? _resolveBinaryPath(OS os, Architecture arch, CodeConfig config) { if (os == OS.android) { return switch (arch) {