Flutter 混合开发实战问题记录(五)1.9.1-hotfix 打包aar差异

2,276 阅读3分钟

目前flutter稳定版已经升级到了1.12.*,跟以前相比变化异较大,具体差异网上的帖子已经很多了,我也抽时间做些适配,计划等原生项目迁移到androidx后再升级,毕竟项目大了一举一动都要谨慎。

过年的时候做了个过渡,由用了很久的1.5.4版本小升到了1.9.1,简单罗列下细节。

一、dart端API小变化

我使用的代码变化较小,只有一处:

旧的方式:

final ImageStream stream = provider.resolve(config);
stream.addListener(listener, onError: errorListener);
completer.future.then((List<ImageInfo> _) { stream.removeListener(listener); });

新的方式

final ImageStream stream = provider.resolve(config);
ImageStreamListener imageStreamListener = ImageStreamListener(listener ,onError: errorListener);
stream.addListener(imageStreamListener);
completer.future.then((List<ImageInfo> _) { stream.removeListener(imageStreamListener); });

其实就是参数个数的变化。


二、编译中间产物的变化

这个变化是从1.7.8开始的,查看我之前的帖子,四个中间产物不再独立产生,现在统一被打包进入了so文件,对于需要干预打包流程的朋友来说方便了些。


三、打包aar方式的变化

假如你需要构造打包aar同步到自己的maven私服上,针对之前的打包过程(例如基于1.5.4)有点小变化。

宿主项目三方依赖过多,你想精简包大小,需要兼容Cpu架构,只配置

ndk {
    abiFilters 'armeabi'
    }

不过flutter只支持armeabi-v7a、arm64-v8a、x86和x86-64几种模式,导致你的命令

flutter build aot --target lib/main.dart --target-platform android-arm

的结果跟预期不符,你的jni内没有armeabi文件夹,这样。你需要两步:

1 移动armeabiV7到armeabi
cd $FLUTTER_ROOT/bin/cache/artifacts/engine
for arch in android-arm android-arm-profile android-arm-release; do
  pushd $arch
  cp flutter.jar flutter-armeabi-v7a.jar # 备份
  unzip flutter.jar lib/armeabi-v7a/libflutter.so
  mv lib/armeabi-v7a lib/armeabi
  zip -d flutter.jar lib/armeabi-v7a/libflutter.so
  zip flutter.jar lib/armeabi/libflutter.so
  popd
done

这样之后在1.5.4时代就可以直接打包了,不过如果是1.9.1还需要

2 设置flutter_gradle脚本

将 flutter/packages/flutter_tools/gradle/flutter.gradle的第52行的

private static final String ARCH_ARM32      = "armeabi-v7a";

改为

private static final String ARCH_ARM32      = "armeabi";

这样就可以了。


四 其他

我升级了自己的电脑系统到mac 10.15,执行打包后出现了报错

ProcessException: ProcessException: Bad CPU type in executable
  Command: /fluttersdk/flutter/bin/cache/artifacts/engine/android-arm-release/darwin-x64/gen_snapshot --causal_async_stacks --deterministic --print-snapshot-sizes --snapshot_kind=app-aot-blobs --vm_snapshot_data=build/app/intermediates/flutter/release/vm_snapshot_data --isolate_snapshot_data=build/app/intermediates/flutter/release/isolate_snapshot_data --vm_snapshot_instructions=build/app/intermediates/flutter/release/vm_snapshot_instr --isolate_snapshot_instructions=build/app/intermediates/flutter/release/isolate_snapshot_instr --no-sim-use-hardfp --no-use-integer-division build/app/intermediates/flutter/release/app.dill

查询issue(@alexayub using flutter on macOS Catalina is supported on v1.9.1 (the latest stable release) and later. More details here github.com/flutter/flu… 得知,flutter旧版(1.5.4)还未支持新版本mac系统,官方直接要求你升级,我也未找到什么兼容解决方案。暂时不想升级的朋友们不要手欠。

[✓] Flutter (Channel stable, v1.9.1+hotfix.6, on Mac OS X 10.15.2 19C57, locale zh-Hans-CN)
 
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[!] Xcode - develop for iOS and macOS (Xcode 11.3)
    ✗ CocoaPods installed but not working.
        You appear to have CocoaPods installed but it is not working.
        This can happen if the version of Ruby that CocoaPods was installed with is different from the one being used to invoke it.
        This can usually be fixed by re-installing CocoaPods. For more info, see https://github.com/flutter/flutter/issues/14293.
      To re-install CocoaPods, run:
        sudo gem install cocoapods
[✓] Android Studio (version 3.5)
[!] IntelliJ IDEA Ultimate Edition (version 2019.1)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
[!] Connected device
    ! No devices available

! Doctor found issues in 3 categories.