1.couldn't find “libflutter.so“
场景:Flutter 工程中引入了一个三方库,只支持 armeabi-v7a 的架构,结果我在 arm64-v8a 架构的手机上进行真机调试时,报错
java.util.concurrent.ExecutionException: java.lang.UnsatisfiedLinkError:
dalvik.system.PathClassLoader[DexPathList[[zip file
"/data/app/com.tal.intelligence.xxx/base.apk"],nativeLibraryDirectories=
[/data/app/com.tal.intelligence.xxx/lib/arm,
/data/app/com.tal.intelligence.xxx/base.apk!/lib/armeabi-v7a,
/vendor/lib, /system/lib]]] couldn't find "libflutter.so"
原因:由于编译时 Android Studio 检测到测试手机设备是 arm64-v8a 的架构,会按照支持 arm64-v8a 架构去编译运行,这里会引入相应的 64 位的 libflutter.so 库。而由于我们的三方库仅支持 armeabi-v7a 的架构,最终编译出来的包由于缺少 32 位的 libflutter.so 而报错。
解决方案
指定工程编译支持的架构为 armeabi-v7a。
选中工程中 android 文件夹下的 build.gradle 文件,加上下面一句设置
project.setProperty('target-platform', 'android-arm')
具体如下图所示
问题:在 build.gradle 的 buildTypes 里面做如下设置为什么不行呢?
ndk {
abiFilters 'armeabi-v7a'
}
在连接上真机并选中的情况下,IDE 会首先选择检测到的设备 cpu 架构去进行针对性的编译,无论是 build apk 或者是真机运行调试。所以需要强行的设置支持的 cpu 架构。这也许是当初安卓 IDE 的开发者设计这一块时一个小小的坑吧,暂无解!
2.NDK at /User/**/Android/sdk/ndk-bundle did not have a source.properties file
具体报错如下图所示
这个是由于工程中缺少 NDK 导致的。顺着报错的路径找,你会发现文件夹下是空的,当然也就没有 source.properties 文件。
解决方法
你可以打开一个安卓的工程,然后在菜单栏选择 File -> Project Structure ,打开一个控制面板
图中黄色框中点击 Download 下载即可。
3、SingleTickerProviderStateMixin 报错
flutter: is a SingleTickerProviderStateMixin but multiple tickers were created.
A SingleTickerProviderStateMixin can only be used as a TickerProvider once.
If a State is used for multiple AnimationController objects, or if it is passed to other objects and those objects might use it more than one time in total, then instead of mixing in a SingleTickerProviderStateMixin, use a regular TickerProviderStateMixin.
原因是多个地方调用setState请求重绘,但是state使用的是SingleTickerProviderStateMixin ,将其改成 TickerProviderStateMixin 即可。
推荐相关链接
Flutter couldn‘t find “libflutter.so“
Android arm64-v8a、armeabi-v7a、armeabi、x86详解
NDK at /User/**/Android/sdk/ndk-bundle did not have a source.properties file
Flutter杂症(couldn't find "libflutter.so")
Flutter使用SingleTickerProviderStateMixin报错
网友评论