Flutter 集成到Android项目中遇到的坑

目录

1.VM snapshot invalid and could not be inferred from settings/Could not setup VM data to bootstrap the VM from.

2.couldn't find "libflutter.so"

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

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"

10.org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithDexForDebug'.

11.签名打包,运行崩溃

[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,所以没找到mergeAssetsmergeAssets为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

image

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.**  { *; }

如果你觉得对你有用,就点个赞支持一下吧~ 谢谢啦~


持续更新。。。

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值