目录
2.couldn’t find “libflutter.so”
4./Users/*/*/WorkSpace/my_flutter/.android/include_flutter.groovy
5.D8: Invoke-customs are only supported starting with Android O (–min-api 26)
6.Unable to run flutter from Android Studio- Entry point isn’t within current project
7.Android Studio not found at /Users/*/Application/Android Studio.app/Contents
8.flutter项目在Android Studio中显示no devices,没法flutter run
9.ndk { abiFilters “armeabi” }打包apk,找不到libflutter.so
lib/armeabi, /vendor/lib, /system/lib]]] couldn’t find “libflutter.so”
[FATAL:flutter/shell/platform/android/library_loader.cc(24)] Check failed: result.
1.VM snapshot invalid and could not be inferred from settings/Could not setup VM data to bootstrap the VM from.
完整的报错日志:
[ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
[ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from.
[ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
[FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.
flutter项目集成到Android原生项目后,有时候汇报上面的错误:
解决方法:
1.在AS中打开flutter项目
2.命令行执行:
flutter clean
3.
cd .android
4.
./gradlew clean
5.
./gradlew assembleDebug
6.回到Android项目中运行APP(不需要 sync 或 rebuild)
以上方法治标不治本,有时还会出现,于是对比了demo的build目录和公司项目的build目录,找到了原因:缺少flutter_assets文件
下面是demo的flutter build目录
下面是公司项目的flutter目录
可以看出公司项目out文件下没有flutter_assets,于是我就对比了一下build日志,把关于flutter的日志都对比了一下。
这个是demo编译的日志
这是公司项目的编译日志
大致可以定位到时没有执行
copyFlutterAssetsDevelopmentDebug
flutter module的build.gradle没有执行
copyFlutterAssets
,是它依赖的flutter.gradle执行的。
找到
$flutterRoot/packages/flutter_tools/gradle/flutter.gradle
,搜索
copyFlutterAssets
。
可以找到有个
copyFlutterAssetsTask
,就是它没有被执行,看下gradle里是怎么写的。
根据打印日志发现走的是上面的if分支,通过代码可以看出:
gradle根据
mainModuleName
去找
mergeAssets
,如果Android项目没有配置
project.rootProject.ext.mainModuleName
,就会默认用”
app
“这个名字去找
mergeAssets
,而我们公司项目的app module的名字是”
app.oa
“而不是”
app
“,也没有配置
project.rootProject.ext.mainModuleName
,所以没找到
mergeAssets
,
mergeAssets
为null,就没有去执行
copyFlutterAssets
。
终极解决方案:在settings.gradle文件中加上
mainModuleName
的配置
setBinding(new Binding([gradle: this, mainModuleName: '主module名称']))
evaluate(new File(
settingsDir.parentFile,
'my_flutter/.android/include_flutter.groovy'
))
2.couldn’t find “libflutter.so”
引发的原因
导致这个问题出现的原因是因为我们在项目种使用了so库,或者项目中引用的三方sdk使用了so库。在引用so库时需要针对不同的cpu架构使用不同的.so文件。armeabi,armeabi-v7a,x86,arm64-v8a,大家通常会对这几个cpu架构进行适配。然而问题就出在现在Flutter在打包Apk时不能同引入arm32和arm64的
libflutter.so
。我门将打好包的Apk安装到arm64架构(默认打包会引入arm32)的手机上就出现了couldn’t find
libflutter.so
这个异常。
解决方式:在app的build.gradle中android下的buildTypes中添加armeabi-v7a
buildTypes {
release {
ndk{
//这里其实我觉可以直接是用"armeabi-v7a",但国内大多使用的都是"armeabi"
abiFilters "armeabi"
}
}
debug {
ndk {
//这里要加上,否则debug包会出问题,后面两个为可选,x86建议加上不然部分模拟器回报错
abiFilters "armeabi","armeabi-v7a","arm64-v8a", "x86"
}
}
}
添加armeabi-v7a后,发现项目中其他模块报错了,解决方式就是在soLibs中新建一个armeabi-v7a文件夹,把报错的.so文件从armeabi文件夹中的copy一份,例如我的报找不到libvadLib.so,就从armeabi文件中复制一份到armeabi-v7a文件即可
3.ERROR: Java 8 language support, as requested by ‘android.enableD8.desugaring= true’ in your gradle.properties file, is not supported when ‘android.useDexArchive= false’. Affected Modules: flutter
按照官方文档把flutter项目集成到现有Android项目中时,报错,如上
解决方法:在gradle.propertites文件中加上:
android.enableD8.desugaring= true
android.useDexArchive= true
此种解决方式并不是最优,还会报警告错误,但是可以正常运行代码
4./Users/*/*/WorkSpace/my_flutter/.android/include_flutter.groovy
错误原因:
AS创建的flutter项目集成到现有项目中报错,原因是没有.android隐藏文件,只有使用命令:
flutter create -t module flutter_module
创建的flutter项目才有.android文件
解决方法:用命令生成flutter项目,缺点是项目中没有android文件目录,导致报:AndroidManifest.xml could not be found.(可以用AS创建一个相同名字的项目,把android文件拷过来)
5.D8: Invoke-customs are only supported starting with Android O (–min-api 26)
flutter集成到Android项目中,启动Android项目点击flutter模块,报错
解决方法:在
android/app/build.gradle
文件中的android项中加入如下设置即可:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
incremental false
}
6.Unable to run flutter from Android Studio- Entry point isn’t within current project
flutter集成到Android项目后,打开flutter项目,项目结构错乱
解决方式:
File -> Project Structure -> Module然后添加项目的根文件夹,然后它将再次检测到它是一个flutter的应用程序,然后再次构建和工作。
7.Android Studio not found at
/Users/*
/Application/Android Studio.app/Contents
当运行flutter doctor -v命令时:发现flutter配置项报错,如下图:
[!] Android Studio
✗
Flutter plugin not installed; this adds Flutter specific functionality.
✗
Dart plugin not installed; this adds Dart specific functionality.
✗ Android Studio not found at /Users/*/Application/Android Studio.app
/Contents
解决方法:运行命令:
flutter config –android-studio-dir=
flutter config --android-studio-dir=
删除android-studio-dir设置,重启项目运行flutter doctor -v查看
8.flutter项目在Android Studio中显示no devices,没法flutter run
解决方法:
Fill –> Other Settings –> Default Project Structure…找到Android SDK的路径,如图
运行命令:
flutter config --android-sdk {上面截图中的SDK路径}
重启AndroidStudio即可显示连接的真机设备
9.ndk { abiFilters “armeabi” }打包apk,找不到libflutter.so
lib/armeabi, /vendor/lib, /system/lib]]] couldn’t find “libflutter.so”
问题出现原因:Flutter官方只提供了四种CPU架构的SO库:armeabi-v7a、arm64-v8a、x86和x86-64,其中x86系列只支持Debug模式,但是公司原项目中大多SDK都只提供了armeabi架构的库(比如地图sdk和语音sdk等),这就导致了打包时缺少armeabi的libflutter.so库而无法运行flutrer模块,按照
美团技术方案
的SO库兼容性这一块,复制armeabi-v7a中的so到armeabi中,结果release包flutter模块报Check failed: vm. Must be able to initialize the VM
解决方案:尝试使用aar的方式集成到原项目,参考我的另一篇文章:
Flutter 打包aar集成到Android项目
10.org.gradle.api.tasks.TaskExecutionException: Execution failed for task ‘:app:transformClassesWithDexForDebug’.
命令行中执行如下命令查看详细报错(需先切换到当前工程目录下):
Windows:
gradlew clean build –stacktrace
MAC/Linux:
./gradlew clean build –stacktrace
查看详细的报错,发现存在如下报错:
Uncaught translation error: com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires –min-sdk-version >= 26)
解决方案:
build.gradle中android节点下增加如下配置:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
11.签名打包,运行崩溃
[FATAL:flutter/shell/platform/android/library_loader.cc(24)] Check failed: result.
既然debug运行ok,八成就是签名文件的问题了。添加flutter混淆:
-keep class io.flutter.facade.**{*;}
-keep class io.flutter.plug.**{*;}
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
如果你觉得对你有用,就点个赞支持一下吧~ 谢谢啦~
持续更新。。。