人总要爱着什么,活着才有意义。
前言
如果你是Android转iOS,或者是想开发Flutter插件,可以看看我的文章:iOS 入门开发踩坑实录。我就是一个Android开发,由于开发插件需要,学了部分的iOS开发的东西。
- Flutter提供的官方接入方案:Add Flutter to existing apps,值得一提的是官方在Flutter 1.12上提供了Android Studio直接接入Flutter的方案。
踩坑的本机环境
注意对比下我的环境和你的环境是否一样,有些问题在Flutter的新版本中已经被修复了。
- Flutter环境安装教程:起步:安装Flutter
➜ app git:(master) ✗ flutter --version
Flutter 1.9.1+hotfix.6 • channel stable • https://github.com/flutter/flutter.git
Framework • revision cc949a8e8b (3 weeks ago) • 2019-09-27 15:04:59 -0700
Engine • revision b863200c37
Tools • Dart 2.5.0
Flutter doctor -v
➜ app git:(master) ✗ flutter doctor -v
[✓] Flutter (Channel stable, v1.9.1+hotfix.4, on Mac OS X 10.15 19A583, locale en-CN)
• Flutter version 1.9.1+hotfix.4 at /Users/.../flutter
• Framework revision cc949a8e8b (3 weeks ago), 2019-09-27 15:04:59 -0700
• Engine revision b863200c37
• Dart version 2.5.0
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
• Android SDK at /Users/notzuonotdied/Library/Android/sdk
• Android NDK location not configured (optional; useful for native profiling support)
• Platform android-29, build-tools 29.0.2
• Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
• All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 11.1)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Xcode 11.1, Build version 11A1027
• CocoaPods version 1.8.3
[✓] Android Studio (version 3.5)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin version 40.1.2
• Dart plugin version 191.8423
• Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
[!] IntelliJ IDEA Ultimate Edition (version 2019.2.3)
• IntelliJ at /Applications/IntelliJ IDEA.app
✗ Flutter plugin not installed; this adds Flutter specific functionality.
✗ Dart plugin not installed; this adds Dart specific functionality.
• For information about installing plugins, see
https://flutter.dev/intellij-setup/#installing-the-plugins
[✓] VS Code (version 1.39.2)
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension version 3.5.1
[✓] Connected device (1 available)
• iPhone 11 Pro Max • 61AA9D21-B994-4FC5-9164-757EABF90190 • ios • com.apple.CoreSimulator.SimRuntime.iOS-13-1 (simulator)
! Doctor found issues in 1 category.
分析Flutter工程
本章节用于探讨Flutter编译产物以及其集成方式。
工程结构
首先,先看看混编Flutter的目录结构,主要包含了三个部分:
- android:Android Native工程
- iOS:iOS Native工程
- flutter_module:Flutter Module工程
➜ temp tree -L 2
.
├── Android # Android工程
├── flutter_module
│ ├── README.md
│ ├── flutter_module.iml
│ ├── flutter_module_android.iml
│ ├── lib # Flutter源码目录
│ ├── pubspec.yaml # Flutter依赖
│ └── test
└── iOS # iOS工程
├── Podfile
├── Podfile.lock
├── Pods
├── iOS
├── iOS.xcodeproj
└── iOS.xcworkspace
9 directories, 9 files
Flutter build ios
看看编译之后会生成什么产物?
先看看flutter_module
目录的层级结构:
➜ flutter_module tree
.
├── README.md
├── flutter_module.iml
├── flutter_module_android.iml
├── lib # Flutter源码
│ └── main.dart
├── pubspec.lock
├── pubspec.yaml # 依赖
└── test
└── widget_test.dart
2 directories, 10 files
当我们执行Flutter build ios
会发生什么?
➜ flutter_module flutter build ios
Building com.wtfexample.flutterModule for device (ios-release)...
Found saved certificate choice "Apple Development: xxxxxxxx@gmail.com (xxxxxxxx)". To clear, use
"flutter config".
Signing iOS app for device deployment using developer identity: "Apple Development:
xxxxxxxx@gmail.com (xxxxxxxx)"
Running Xcode build...
├─Building Dart code... 20.0s
├─Generating dSYM file... 0.3s
├─Stripping debug symbols... 0.0s
├─Assembling Flutter resources... 0.7s
└─Compiling, linking and signing... 3.9s
Xcode build done. 29.6s
Built /Users/.../flutter_module/build/ios/iphoneos/Runner.app.
让我们来看看目录结构:
➜ flutter_module tree -da -L 2
.
├── .android # Android编译产物
│ ├── Flutter
│ ├── app
│ └── gradle
├── .idea
│ └── libraries
├── .ios # iOS编译产物
│ ├── Config
│ ├── Flutter
│ ├── Frameworks
│ ├── Pods
│ ├── Runner
│ ├── Runner.xcodeproj
│ └── Runner.xcworkspace
├── build
│ ├── aot
│ ├── dSYMs.noindex
│ └── ios
├── lib
└── test
- 主要是多了以下的部分:
```shell
.
├── .android # Android编译产物
├── .ios # iOS编译产物
├── build
│ ├── aot
│ ├── dSYMs.noindex
│ └── ios
这些也是我们要分析的内容啦,╮(╯▽╰)╭
.iOS/Config
➜ .ios tree Config
Config
├── Debug.xcconfig
├── Flutter.xcconfig
└── Release.xcconfig
0 directories, 3 files
➜ Config cat Debug.xcconfig
#include "Flutter.xcconfig"
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
➜ Config cat Release.xcconfig
#include "Flutter.xcconfig"
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
➜ Config cat Flutter.xcconfig
#include "../Flutter/Generated.xcconfig"
ENABLE_BITCODE=NO # 目前Flutter不支持BitCode模式,默认关闭
Flutter.xcconfig
值得一提的是Flutter.xcconfig
依赖了Flutter/Generated.xcconfig
,这个文件详见下面章节的分析。Flutter/Generated.xcconfig
配置了一些Flutter Module工程的关键环境变量。
.iOS/Flutter
➜ Flutter tree -da -L 2
.
├── .symlinks # 这是Flutter Module依赖的插件的路径,都是使用了Soft Link
│ ├── amap_location -> /Users/.../amap_location-0.2.0
│ ├── flutter_alipay -> /Users/.../flutter_alipay-0.1.2
│ ├── flutter_amap -> /Users/.../flutter_amap-0.0.1
│ ├── flutter_easy_nfc -> /Users/.../flutter_easy_nfc-0.0.1
│ ├── flutter_statusbar -> /Users/.../flutter_statusbar-0.0.1
│ ├── flutter_wechat_ble -> /Users/.../flutter_wechat_ble-0.1.4
│ ├── linker -> /Users/.../linker-0.0.2
│ └── mmkv_flutter -> /Users/.../mmkv_flutter-1.0.10
├── App.framework # Flutter业务代码
│ └── flutter_assets # Flutter依赖的静态资源,如字体、图片等。
├── FlutterPluginRegistrant
│ └── Classes
└── engine # Flutter引擎,默认从$FlutterHome/bin/cache/artifacts复制一份。
└── Flutter.framework
15 directories