背景:flutter经过去年的公司内部培训及重写公司项目主页面,效果得到领导认可,能节约人力是重点,疫情后打算落地。牵头落地Flutter开发第一件事就是开发环境的统一,截止到上周我使用的flutter 版本一直是1.5.4_hotfix4版本,目前官方的稳定版本已经升级到1.12.13版本。最初想法是全部升级到最新,避免版本升级的bug还存在,1.12版本改动较多,主要是flutterActivity等涉及到原生跳转aar参数传递用到的类位置移动,刚开始以为导入新的包即可,后续发现除了参数传递丢失外1.12版本对AndroidX有要求,为了求稳,打算升级到1.9版本。
版本切换
如果配置flutter环境变量,直接终端输入以下命令查看当前flutter版本
flutter --version
如下:
zhouhaodeMacBook-Pro:~ zhouhao$ flutter --version
Flutter 1.9.1+hotfix.4 • channel unknown • unknown source
Framework • revision cc949a8e8b (6 months ago) • 2019-09-27 15:04:59 -0700
Engine • revision b863200c37
Tools • Dart 2.5.0
zhouhaodeMacBook-Pro:~ zhouhao$
再使用命令查看当前所在的分支,如果不在任何分支上,执行flutter upgrade时候会报错,无法链接到“https:flutter .io.xxxx”这个是flutter的仓库地址,当时我以为是缓存等问题尝试了重启还是没能解决,后面网上查了很多资料,才看到执行下面命令时候,任何分支都没勾选,
flutter channel
修复也是简单的切换到对应的分支就可以了,一般开发是切到stable稳定分支,当然如果你能使用flutter update就不用管了
flutter channel stable
当然如果你要升级到最新版本直接使用
flutter upgrade
flutter version v1.7.8+hotfix4 //指定具体的版本
项目限制
公司项目较老有点年纪了,为了控制包体积,在项目build.gradle文件中做了如下配置:
ndk { abiFilters "armeabi" }
先说下表现的现象吧:年前时候,遇到各种坑,为了适配cpu版本在工程lib下创建了armeabi文件夹,并添加了flutter.so库,解决运行到公司项目报错问题。当时使用版本为1.5.4_hotfix4,没有任何问题,可以运行起来。
现在升级到后续版本,运行起来就会报错:
分析原因还是因为so库的问题,于是简化demo尝试不添加ndk { abiFilters "armeabi" }发现 运行正常,分析对应打出来的包,因为手机是华为P20pro当前的cpu架构是arm64位的,可以使用命令查看,默认打出来的是比较新的V8包:
再添加ndk { abiFilters "armeabi" } 代码,打包出来是指定armeabi 包,里面对比发现少了一个app.so ,这个应该就是问题。
我第一反应就是去把V8的aar解压,然后把这个app.so文件手动搞到armeabi里的aar 中,这个直接报错了,这里就不贴代码了
解决方案
其实当时就想过放弃去研究,比较1.5.4版本是支持的,另一边又放不下,想解决这个问题,升级到一个更高的版本,毕竟低版本到高版本是修复了不少bug.
把工程修改配置后,对比不添加任何限制打出来的包:
这里遇到一个比较干扰的问题,对应去网上一找,说是混淆的问题,轮番尝试后发现并没有修复
说回正题:
正常新建工程使用命令打包:
思路很重要,之前默认打包也是没有armarbi,我是手动添加了,然而这次明显添加了还不行,主要是flutter 版本升级后更改了这个so库的依赖及调用关系。
于是我用同样的思想,自己创建替换,在更改配置,打成aar,然后决绝问题。
遇到的问题
1.升级1.5.4_fix4以上版本,因为工程默认支持armeabi的CPU 导致升级后运行报错,解决方式,手动搞一份;没在公司项目运行验证
2.更新flutter版本 flutter upgrade报错找不到仓库地址“https://fluter.xxxx”,原因是不在任何channel上,执行flutter channel stable 再次执行即可
3.工程切换版本后,提示如下:暂无好的修复办法,因为切换一个正常工程就是正常的 临时方案,删除该工程,到其他工程下切换版本
4.升级到1.12版本后,原生代码如何传递参数到Flutter工程:
调用如下方法:另外如果集成的不是io.flutter下的FlutterActivity是另一个,那么不再需要初始化
customFlutter = FlutterActivity.withNewEngine()
.initialRoute("newRoute")
.build(this)
startActivity(customFlutter)
5.还遇到一个比较诡异的问题:能导包进来,但是运行就报错找不到这个包,我使用命令行./gradlew clean了很多次,仍然存在,估计是AS的一个bug吧,我重启电脑后发现怎么都找不到这个FlutterActivity了,估计就是之前的缓存问题引起
6.在处理升级问题时候,还大致看了1.12版本的更新,主要是移动了FlutterActivity的位置,目前我的理解是对安卓X的支持还不是很好,暂时等别的人先去踩坑吧,我们暂时使用1.9.1的fix版本。