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

  • Post author:
  • Post category:其他



目录


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


,所以没找到

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

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

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


持续更新。。。



版权声明:本文为l707941510原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。