quickjs_engine 0.1.6: Swift Package Manager i Android Gradle Plugin 9

quickjs_engine daje Flutterowi jeden nowoczesny silnik JavaScript – QuickJS-NG – na platformach Android, iOS, macOS, Linux i Windows. Uruchamia też eksporty SVGator i skrypty inline w full_svg_flutter. Przez tę drugą rolę problemy z natywnym buildem od razu rzucają się w oczy: gdy most się nie załaduje, animowane SVG przestają się animować.

Wersje od 0.1.4 do 0.1.6 dotyczą w całości warstwy natywnej. Oto, co naprawia każda z nich.

Swift Package Manager na iOS i macOS (0.1.6)

Flutter przenosi pluginy dla iOS i macOS z CocoaPods na Swift Package Manager. Do tego wydania quickjs_engine figurował na liście „The following plugins do not support Swift Package Manager”, a Flutter z jego powodu wracał do CocoaPods.

0.1.6 zawiera manifesty Swift Package Manager dla iOS i macOS. Most jest osadzony jako mały dynamiczny framework, więc jego eksporty przetrwają flutter build ipa i archiwizację na macOS. Jeden manifest działa zarówno z Flutterem 3.38, w którym nie ma generowanego pakietu FlutterFramework, jak i z wersjami 3.41 i nowszymi.

W nowszych stabilnych wersjach Fluttera Swift Package Manager jest włączony domyślnie. W starszych można go włączyć dla pojedynczego projektu, począwszy od Fluttera 3.35:

flutter:
  config:
    enable-swift-package-manager: true

We Flutterze 3.32–3.34 trzeba go za to włączyć dla całej instalacji Fluttera:

flutter config --enable-swift-package-manager

Dziękuję @DomingoMG (otwiera się w nowej karcie) za zgłoszenie w #55 (otwiera się w nowej karcie).

Pod CocoaPods, który naprawdę eksportuje most (0.1.6)

To najważniejsza poprawka, jeśli aplikacja na iOS korzysta z CocoaPods. Źródła ../native/cxx zadeklarowane w podspecu były po cichu ignorowane przez CocoaPods, więc framework poda nie eksportował żadnej części mostu FFI. W wersji 0.1.5 i starszych każde wywołanie evaluate() na iOS kończyło się błędem:

Failed to lookup symbol 'jsNewRuntime'

Teraz pod kompiluje te źródła. Jeśli Podfile linkuje pody statycznie, w README znajdziesz krótkie obejście w Podfile'u: Dart odnajduje most przez DynamicLibrary.process(), więc pod musi pozostać dynamicznym frameworkiem.

Android Gradle Plugin 9 (0.1.6)

Plugin nie stosuje już Kotlin Gradle Plugin, bo klasa pluginu jest teraz napisana w Javie. Aplikacje na Android Gradle Plugin 9 budują się zarówno z włączonym, jak i z wyłączonym wbudowanym Kotlinem, zamiast kończyć się błędem „The 'org.jetbrains.kotlin.android' plugin is no longer required” albo ostrzeżeniem, że plugin stosuje KGP. compileSdk przyjmuje wartość flutter.compileSdkVersion aplikacji, a plugin jest kompilowany z użyciem Javy 17.

Dziękuję @sufiyansayyed (otwiera się w nowej karcie) za zgłoszenie w #52 (otwiera się w nowej karcie) i za pierwszą wersję migracji w #53 (otwiera się w nowej karcie).

Mniejsze poprawki w 0.1.6

  • QuickJsRuntime2(memoryLimit: ...) z dodatnim limitem nie rzuca już błędu „Failed to lookup symbol 'jsSetMemoryLimit'”. Most eksportuje teraz tę funkcję na każdej platformie.
  • Zoptymalizowane buildy na iOS i macOS definiują NDEBUG, tak jak buildy release z CMake na pozostałych platformach, więc asercje i kod debugowy QuickJS nie są już wkompilowywane.

Windows i uniwersalny macOS (0.1.4, 0.1.5)

CI, które pilnuje tego wszystkiego

Większość tych problemów wychodzi dopiero w czystym buildzie release na konkretnym toolchainie, dlatego CI buduje teraz właśnie to:

  • job z Android Gradle Plugin 9, który buduje świeżą aplikację na najnowszym stabilnym Flutterze z włączonym i wyłączonym wbudowanym Kotlinem;
  • workflow ze Swift Package Manager na Flutterze 3.38.1, 3.41.6 i 3.47.4, który buduje aplikację na symulator iOS, archiwum iOS i aplikację release na macOS, sprawdza, czy eksportowane są wszystkie funkcje mostu i wszystkie symbole, których szuka strona Darta, oraz uruchamia aplikację na macOS;
  • kontrola eksportów poda iOS w CocoaPods, a do tego workflow czystych buildów release na Windowsie i macOS.

Aktualizacja

dependencies:
  quickjs_engine: ^0.1.6

Jeśli korzystasz z full_svg_flutter, zaktualizuj go do 1.5.2 – ta wersja wymaga quickjs_engine ^0.1.6. Pozostałe zmiany w tym pakiecie znajdziesz w informacjach o wydaniu full_svg_flutter 1.5.

Pełny changelog: pub.dev/packages/quickjs_engine/changelog (otwiera się w nowej karcie)

Chcesz zbudować, zmodernizować albo odblokować produkt cyfrowy?

Przyjdź z prawdziwym problemem – web, mobile, delivery zespołu albo workflow AI, który ma dojrzeć do produkcji.

Porozmawiajmy o projekcie