Flutter打包aar并且集成现有Android项目

本文详细介绍了如何将Flutter项目打包成aar并集成到现有的Android项目中,包括Flutter项目的目录分析、打包流程、aar的目录结构检查以及在Android项目中的集成步骤。还解决了Flutter打包aar时遇到的第三方依赖问题。
摘要由CSDN通过智能技术生成

一、前言

Flutter现在已经很火了,但是如果我们要想使用Flutter开发,在新的Flutter项目上集成以前的所有代码肯定是不现实的,同时又不想将Flutter直接侵入到我们的项目结构中去,于是最优解就是将开发的Flutter项目单独编译成aar,然后以组件的形式被主工程依赖。

这样做的好处是显而易见的:对Flutter进行探索开发的同学可以在自己的Flutter工程内编写dart代码,独立运行调试,完成的时候打包成aar集成到主工程中供写native代码的同学接入,两方协同工作,不会产生冲突。

二、打包apk并分析

首先创建flutter工程,会得到如下目录

在这里插入图片描述

在命令行输入打包命令 flutter build apk

会编译生成apk文件 位于 build/app/outputs/apk/release/app-release.apk

打开apk可以看到,里面目录为

在这里插入图片描述

可以看到多出来很多东西,这些产物都来自于flutter的构建代码,

android/app/build.gradle中依赖了了flutter.gradle

apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

通过阅读flutter.gradle的构建源码,可以发现在构建apk的过程中,会将需要的文件构建到apk中。

注意:flutter新版本sdk打出来的apk已经不包括flutter_assets文件了

1、assets文件夹

assets文件夹下面有flutter_assets文件夹、flutter_shared文件夹、isolate_snapshot_data、isolate_snapshot_instr、vm_snapshot_data、vm_snapshot_instr文件

  • flutter_assets里是flutter工程产生的assets文件
  • flutter_shared里是封装在flutter.jar里面的处理字符编码的ICU库 (新版本已经不需要了)
  • isolate_snapshot_data、isolate_snapshot_instr、vm_snapshot_data、vm_snapshot_instr为特定平台的数据和指令

debug模式下编译出来的apk没有vm/isolate_snapshot_instr文件,而是kernel_blob.bin,这是因为编译模式不同造成的。

2、lib文件夹

lib文件夹下是特定平台(arm或者x86)的so文件,flutter在Android平台下会默认生成arm-v7架构的的so库,debug模式下会同时生成x86的so文件。

当然有的项目可能配置了

ndk {
      abiFilters 'armeabi'
 }

所以为了解决so对齐问题,你需要在你的flutter项目中手动添加armeabi的so文件,这样的话打包出来的aar就包含了armeabi的so文件,这个armeabi的so文件可以拷贝armeabi-v7a下面的,一般情况下他们两个是没什么区别的,这里拷贝的话亲测可用。
在app目录下创建libs/armeabi,然后将libflutter.so拷贝到armeabi的目录下,然后在gradle中配置

android{
	sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

但是由于flutter sdk版本升级比较快,每个版本打出的so可能稍有不同,所以只要升级sdk可能就需要拷贝so,比较麻烦,那么我通过监听打包aar的任务来进行自动拷贝,在gradle文件中配置以下代码

//以下任务为了拷贝so  因为Flutter默认只生成v7的so
task copyFlutterSo(dependsOn: 'transformNativeLibsWithSyncJniLibsForRelease', type: Copy) {
    //${buildDir} =  /Users/xueshanshan/project/flutter/flutter_debug_library/build/app
    def dir = "${buildDir}/intermediates/library_and_local_jars_jni/release"
    from "${dir}/armeabi-v7a/libflutter.so"
    into "${dir}/armeabi/"
}

三、打包aar

上面通过编译命令得到了apk,如果要想打包aar,理论上只需要把
app/build.gradle中的apply plugin: 'com.android.application
改为apply plugin: 'com.android.library,
同时注释掉applicationId "com.flutterappfirst",
并且将清单文件修改为:

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值