Flutter 混合开发实战问题记录(六)1.12.13-hotfix9 变化和打包aar

983 阅读4分钟

目前(截止到7月8号)flutter SDK最新的版本是1.17.5,不知道为什么不再继续采用hotfix版本名称(很稳定了?不用fix了?)

版本变化

1.12作为较大的一个稳定版正式提供了嵌入式方式接入宿主项目,这也是在官方的文档中唯一提到的。 使用命令

flutter build aar

之后会在控制台提示

Built build/host/outputs/repo.

代表在你本地生成一个(maven)仓库,仓库完全生成后会提供一个完整的接入方式

1. Open <host>/app/build.gradle
2. Ensure you have the repositories configured, otherwise add them:

      repositories {
        maven {
            url '/Users/XXX/flutter_module/build/host/outputs/repo'
        }
        maven {
            url 'http://download.flutter.io'
        }
      }

3. Make the host app depend on the Flutter module:

    dependencies {
      debugImplementation 'com.xxx.flutter_module:flutter_debug:1.0
      profileImplementation 'com.xxx.flutter_module:flutter_profile:1.0
      releaseImplementation 'com.xxx.flutter_module:flutter_release:1.0
    }

4. Add the `profile` build type:

    android {
      buildTypes {
        profile {
          initWith debug
        }
      }
    }

To learn more, visit Integrate a Flutter module into your Android project

然后就按着这个东西接入到宿主吧,然后一堆坑,一堆报错等你解决,要么配置问题,要么墙问题,小团队或者单人负责项目可以直接忽略这些,以源码形式依赖;

但凡想弄个自动化CI、想维护公司自己的maven就很麻烦了。下边我分享下我的解决方案,之前网上参考了10几篇帖子,再加上自己试错,总算能简单打包了

跟上一个版本的区别

我使用的上一个版本是1.9.1(可以参考我之前的帖子),跟它相比,编译产物又发生了变化。 下图是已经接入好aar的完整项目apk 拖到as上的反编译情况(release打包)

1、虽然和1.9.1相同也是两个so,不过 libflutter.so中已经包含了flutter engin,不再在aar中提供,而且通过远程仓库依赖。

2、flutter提供原生代码

3、资源文件

总结下,release打包的情况下的产物为

libflutter.so ------包含flutter engin
libapp.so ------ dart源码相关
flutter_assets ------ flutter资源文件
flutter_embedding.jar ------ 提供了 flutter 嵌入 native 的能力(即flutter提供的java代码和三方插件的原生代码)



flutter SDK

在官网上下载1.12.13-hotfix9的稳定版,照理还是需要修改引擎,还是armeabi问题,不再解释为什么了。

flutte sdk root/packages/flutter_tools/gradle/flutter.gradle

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

改为

private static final String ARCH_ARM32 = "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



flutter_module

跟1.9.1相比 ,flutter_module本身代码不需要什么变化,如果你使用了boost ,可以在github上找对应1.12的版本,可以是支持androidx ,也可以不是,比如

flutter_boost:
    git:
      url: 'https://github.com/alibaba/flutter_boost.git'
      ref: 'task/task_v1.12.13_support_hotfixes'

其他的三方插件对应下版本,一般通过报错就能发现问题。

根目录下会发生些变化,比如多了点文件

.flutter-plugins-dependencies

可能你的yaml文件需要修改些东西比如

environment:
  sdk: ">=2.1.0 <3.0.0"

需要修改为

environment:
  sdk: ">=2.2.0 <3.0.0"

然后run一下你的flutter module,基本都能跑起来

然后利用我之前帖子里提供的shell脚本进行打包(仍然可以复用,只是fat-aar版本提升下,使用1.2.8),上传到你自己的maven仓库



宿主

你的Android主项目需要依赖flutter module,如果是通过源码依赖必然是不方便的,团队人多别人不开发flutter怎么办,如果通过官方提供的本地maven依赖更是不可以的。最起码得本地打出来个aar文件来吧

在1.9.1中其实可以直接依赖你打的aar路径了,不过由于1.12中引擎不再包含在flutter module的aar中,而且远程maven提供,所以你需要在你的宿主中

allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }
        maven { url 'http://download.flutter.io' }
    }
}

其中 maven { url 'download.flutter.io' } 是为了可以下载引擎

然后app的gradle中依赖

implementation '你打出来的aar:1.0.0@aar'
implementation ('io.flutter:flutter_embedding_release:1.0.0-engine版本号'){
            exclude group: 'com.android.support'
        }
implementation 'io.flutter:armeabi_release:1.0.0-engine版本号'

其中exclude group: 'com.android.support'是为了解决你仍然在使用support包,且出现了不兼容的情况

由于我本地不需要v7或v8的的so,所以直接剔除了对应的,如果你需要根据情况进行依赖



其他

官方build aar 或者自定义脚本打包最多出现的编译报错的问题多集中于

Could not resolve io.flutter:arm64_v8a_release:1.0.0-b851c718295a896918dc93cb1ff14f2f895a1b90. 

等 你可以采用fan qiang或配置

maven { url'https://maven.aliyun.com/repository/google'}
maven { url'https://maven.aliyun.com/repository/jcenter'}
maven { url'http://maven.aliyun.com/nexus/content/groups/public'}

来解决