1. ios對Flutter有如下依賴
- Flutter.framework: Flutter engine等;
- APP.framework:業務代碼, 由dart代碼生成。App.framework也包含了kDartVmSnapshotData,kDartVmSnapshotInstructions,kDartIsolateSnapshotData,kDartIsolateSnapshotInstructions四個部分 ;
- Flutter Plugin: plugin相關;
- flutter_assets: Flutter依賴的靜態資源,如字體,圖片等。
2. iOS工程是怎么路由到dart的?
(1)ios初始化flutterVC
FlutterViewController* flutterViewController = [[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil]; [flutterViewController setInitialRoute:@"myApp"];
(2)dart項目的main函數啟動並由window.defaultRouteName拿到route
void main() { runApp(_buildWidget()); } Widget _buildWidget() { String route = window.defaultRouteName; .... return widget; }
(3)Flutter.framework渲染頁面
3. kernel_blob.bin文件的作用是什么?為什么模擬器運行需要此文件,真機運行不需要此文件?
kernel_blob.bin是業務代碼的產物 Dart kernel bytecode ,在debug調試的時候,Dart的代碼有改動,則 kernel_blob.bin也會有相應的改變。release模式(AOT模式)下,dart編譯器會用Dart kernel bytecode編譯成二進制的arm集成代碼。
也就是說,模擬器運行是Debug模式(JIT模式),業務代碼的來源是需要兩個文件,一個是APP.framework里的App二進制代碼一個是kernel_blob.bin。而真機運行是release模式(AOT模式),直接可以運行APP.framework里的App二進制代碼。所以模擬器需要kernel_blob.bin文件,真機不需要kernel_blob.bin文件。
4. Flutter項目里構建iOS包的常用命令
4.1 flutter build
(1)flutter build ios
lipo -info .ios/Flutter/App.framework/APP 查看結果是armv7 arm64
題外話:pod package打包iOS framework命令
pod package hummer_container.podspec.json --spec-sources='git@gitlab.alipay-inc.com:ifoundation-ios/Specs.git' --no-mangle --force
(2)flutter build ios --debug
lipo -info .ios/Flutter/engine/Flutter.framework/Flutter 查看結果是x86_64 armv7 arm64
(3) flutter build ios --simulator
lipo -info .ios/Flutter/App.framework/APP 查看結果是 x86_64
4.2 flutter packages
(1)flutter packages get
當你在添加一個包后首次運行(IntelliJ中的’Packages Get’)
flutter packages get
,Flutter將找到包的版本保存在pubspec.lock。這確保了如果您或您的團隊中的其他開發人員運行flutter packages get
后回獲取相同版本的包。
(2)flutter packages upgrade
根據pubspec.yaml中指定的版本約束下載所允許的最高可用版本。