首先貼一下Flutter開發環境,由于目前的項目還沒有遷移到Androidx,所以我是以support
包為例:
[?] Flutter (Channel unknown, v1.9.1+hotfix.6, on Mac OS X 10.15.3 19D76, locale
zh-Hans-CN)
[?] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[!] Xcode - develop for iOS and macOS (Xcode 11.3.1)
? CocoaPods installed but not working.
You appear to have CocoaPods installed but it is not working.
This can happen if the version of Ruby that CocoaPods was installed with
is different from the one being used to invoke it.
This can usually be fixed by re-installing CocoaPods. For more info, see
https://github.com/flutter/flutter/issues/14293.
To re-install CocoaPods, run:
sudo gem install cocoapods
[?] Android Studio (version 3.5)
[?] Connected device (1 available)
1. 現在開始接入,主項目以MyApp為例
- 在
MyApp/app/build.gradle
添加so庫相關過濾
android {
//...
defaultConfig {
ndk {
// Filter for architectures supported by Flutter.
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
}
- 進入到
MyApp的父級文件夾
下,創建my_flutter module
cd some/path/
flutter create -t module my_flutter
- 在
MyApp/app/build.gradle
文件中增加java8支持
android {
//...
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
}
- 在
MyApp/settings.gradle
中,添加以下依賴
include ':app' // assumed existing content
setBinding(new Binding([gradle: this])) // new
evaluate(new File( // new
settingsDir.parentFile, // new
'my_flutter/.android/include_flutter.groovy' // new
)) // new
- 在
MyApp/app/build.gradle
中,依賴flutter 模塊
implementation project(':flutter')
2. 下面開始測試從native跳轉flutter頁面
- 在AndroidManifest.xml中注冊FlutterActivity
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
/>
- 任意頁面添加跳轉代碼,以在TestActivity中為例
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
FlutterActivity.createDefaultIntent(TestActivity.this)
);
}
});
以上步驟全是按照官方文檔來的,按道理配置完成應該正常跳轉,但是還是報錯了:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.snbc.honey_app/io.flutter.embedding.android.FlutterActivity}: java.lang.IllegalStateException: ensureInitializationComplete must be called after startInitialization
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2946)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3081)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6806)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
看報錯應該是初始化的問題,但是官方文檔沒有提到任何初始化步驟相關的代碼,這個時候不要慌,查查相關issue,有人也碰到這種問題,表示要加一行初始化代碼:
- 在MyApplication的onCreate方法中添加
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
FlutterMain.startInitialization(this);
}
}
你以為這樣就好了嗎,再運行一次,還會報錯:
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/arch/lifecycle/DefaultLifecycleObserver;
at io.flutter.embedding.engine.FlutterEngine.<init>(FlutterEngine.java:152)
at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.setupFlutterEngine(FlutterActivityAndFragmentDelegate.java:221)
at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onAttach(FlutterActivityAndFragmentDelegate.java:145)
at io.flutter.embedding.android.FlutterActivity.onCreate(FlutterActivity.java:399)
at android.app.Activity.performCreate(Activity.java:7224)
at android.app.Activity.performCreate(Activity.java:7213)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2926)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3081)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6806)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.arch.lifecycle.DefaultLifecycleObserver" on path: DexPathList[[zip file "/data/app/com.example.myapplication-kZH0dnJ-qI1ow1NqGOB2ug==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.myapplication-kZH0dnJ-qI1ow1NqGOB2ug==/lib/arm64, /data/app/com.example.myapplication-kZH0dnJ-qI1ow1NqGOB2ug==/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
只能繼續google,這個時候還要在app/build.gradle
里增加這個依賴:
implementation 'android.arch.lifecycle:common-java8:1.1.0'
好了,再次運行,終于能夠正常跳轉了。
比較坑爹的是,官方文檔沒有任何這樣的相關操作提示,我自己又摸索了好久,最終找到一種更加簡單的解決辦法,直接 將flutter 版本升級到1.12以上
(友情提示,升級的時候請配置好國內鏡像
http://www.lxweimin.com/p/1c31218bffc3
)
flutter version v1.12.13+hotfix.6
升級一下flutter版本,再按照官方文檔來是行得通的,我懷疑文檔是基于高版本寫的
還有一個小問題,native跳轉flutter的時候會有黑屏,這個影響不太大,打release包不會出現,當然也是可以解決的,可以自行google。