Flutter打包aar

打包步骤

1、Google推荐的打包AAR方式:将flutter module打包成aar

1733c6bfaar96c490a7~tplv-t2oaga2asx-zoom-in-crop-mark-3024-0-0-0.image.png

官方文档:
中文 flutter.cn/docs/development/add-to-app/android/project-setup
英文 docs.flutter.dev/add-to-app/android/project-setup

2、fat-aar打包Flutter工程(开源的Android打包AAR插件)

1733c8bd05278265~tplv-t2oaga2asx-zoom-in-crop-mark-3024-0-0-0.image.png

2.1 修改settings.gradle文件,新增代码:

def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}

plugins.each { name, path ->
    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
    include ":$name"
    project(":$name").projectDir = pluginDirectory
}

2.2 修改.android/build.gradle文件

引入依赖:com.github.kezong:fat-aar:1.3.6

buildscript {
    ext.kotlin_version = '1.7.10'
    repositories {
        mavenCentral()
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public'}
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }

    }

    dependencies {
        classpath 'com.android.tools.build:gradle:7.1.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
       // 增加此配置
        classpath "com.github.kezong:fat-aar:1.3.6"
    }
}

allprojects {
    repositories {
        mavenCentral()
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }

    }
}

ext {
    minSdkVersion = 21
    targetSdkVersion = 28
    compileSdkVersion = 31
    buildToolsVersion = '28.0.3'

    multidexVersion = '2.0.1'

    timberVersion = '4.7.0'
    rxjavaVersion = '2.2.16'
    rxandroidVersion = '2.1.1'
    zxingEmbeddedVersion = '3.5.0'
    gsonVersion = '2.8.5'
    okhttpVersion = '3.12.0'

    ossVersion = '2.9.3'
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

2.3 修改 .android/app/build.gradle

//新增: 是否作为依赖
def isAarLibrary = true
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new FileNotFoundException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

//新增:当需要打包aar时,修改项目为library模式
if (isAarLibrary) {
    apply plugin: 'com.android.library'
} else {
    apply plugin: 'com.android.application'
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
//新增:引入fat-aar
if (isAarLibrary) {
    apply plugin: 'com.kezong.fat-aar'
}
static def buildTime() {
    return new Date().format("yyyyMMdd_HHmmss", TimeZone.getDefault());
}
android {
    compileSdkVersion 33
    ndkVersion flutter.ndkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        //新增:需要打包aar时候,不能有applicationId
        if (!isAarLibrary){
            applicationId "com.xx.xx.xx"
        }
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion flutter.targetSdkVersion
        versionCode 9
        versionName '1.0.18'
        multiDexEnabled true
        // 设置支持的SO库框架
        if (isAarLibrary) {
            ndk {
                abiFilters 'armeabi', 'x86'
            }
        }
    }

    signingConfigs {
        release_store {
            storeFile file('../**.keystore')
            storePassword '**'
            keyAlias '**'
            keyPassword '**'
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }

    buildTypes {
        debug {
            signingConfig signingConfigs.release_store
        }
        profile {
            signingConfig signingConfigs.release_store
        }
        release {
//            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release_store
        }

    }
}

flutter {
    source '../..'
}

dependencies {
 
   //添加fat-aar处理flutter打包成aar中三方依赖
  if (isAarLibrary) {
        def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
        def plugins = new Properties()
        def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
        if (pluginsFile.exists()) {
            pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
        }

        plugins.each { name, path ->
            println name
            embed project(path: ":$name", configuration: 'default')
        }
    }

}

2.4修改AndroidManifest.xml文件

项目作为子项目寄存于原生app中,不需要icon、label等属性,项目作为子项目寄存于原生app中,入口acitvity不需要配置LAUNCHER,不然应用集成到宿主app中,启动会在桌面上生成两个应用图标固删除以下内容:


企业微信20230720-164120.png

2.5 最后在pubspec.yaml执行Packages get获取第三方包,再执行flutter clean,并通过Terminal命令进入到android目录下 cd android 并执行./gradlew assembleRelease,打包成aar 与 libapp.so(注:flutter更新功能后,libapp.so文件也需要实时更新至引入aar的项目中)

所在目录:


企业微信20230719-162301.png

企业微信20230906-110124.png

踩坑之旅

1、Flutter项目中引入插件后,打包过程中出现

插件异常.png

原因:进到本地磁盘发现出现问题的库没有android目录。
很多web,linux,macos专用的flutter包,这些包内部并没有android文件夹,所以,打aar包的时候不识别它们。


企业微信20230719-162859.png

解决方案:打包时过滤

dependencies {
   //添加fat-aar处理flutter打包成aar中三方依赖
    if (isAarLibrary) {
        def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
        def plugins = new Properties()
        def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
        if (pluginsFile.exists()) {
            pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
        }

        plugins.each { name, path ->
            println name
            if (name.toString() != “platform_device_id_web”) {
                embed project(path: ":$name", configuration: 'default')
            }

        }
    }

}

2、Caused by: groovy.lang.MissingPropertyException: Could not get unknown property 'applicationVariants' for extension 'android' of type com.android.build.gradle.LibraryExtension.

企业微信20230719-163738.png

解决方案:将错误指向的地方的applicationVariants改为libraryVariants


企业微信20230719-164107.png

3、Resource shrinker cannot be used for libraries.

企业微信20230720-155122.png

解决方案:


企业微信20230720-155538.png

将shrinkResources改为false。

Android项目引入Flutter项目打包生成的aar文件

1、将生成的aar包拷贝到原生项目libs目录下,如下图:

企业微信20230720-160420.png

2、在app/build.gradle文件里进行依赖,如下图:

企业微信20230720-160726.png

注:implementation 'io.flutter:flutter_embedding_release:1.0.0-d1b9a6*********'中1.0.0-后面的版本号源于

2.1 采取Google推荐方式将flutter module打包成aar后,此版本号来源于 flutter_release-1.0.pom 文件如下图:

企业微信20230720-165058.png

2.2 采用fat-aar方式将Flutter工程打包aar方式,此版本号来源于:

企业微信20230720-164823.png

3、配置maven库

修改settings.gradle

pluginManagement {
     // 新增
    String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
    repositories {
        gradlePluginPortal()
//        google()
        mavenCentral()
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }
       // 新增
        maven {
            url "$storageUrl/download.flutter.io"
        }
        flatDir {
            dirs 'libs'
        }
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
      // 新增
    String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
    repositories {
        mavenCentral()
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }
         // 新增
        maven {
            url "$storageUrl/download.flutter.io"
        }
    }
}
rootProject.name = "FlutterAarTest"
include ':app'

4、再将Flutter项目打包出来apk,将打包好的.apk文件后缀改为.zip,解压后拿到arm64_v7a、arm64-v8a、x86_64文件下so库,如下图:

企业微信20230720-162901.png

5、将libflutter.so与libapp.so库拷贝到原生项目的jniLibs文件夹下,如图所示:

企业微信20230720-163143.png

5、在app/build.gradle中添加如下配置:

   defaultConfig {
        ndk { abiFilters "arm64-v8a", "armeabi-v7a","x86_64" }
    }

5 修改AndroidManifest.xml

 <activity
            android:name="io.flutter.embedding.android.FlutterActivity"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:exported="true"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize"
            tools:ignore="MissingClass" />

6、跳转flutter页面

 FlutterActivity.withNewEngine()   
.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)
//.initialRoute("/autoShopListLoginView")
 .build(this)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容