Flutter 打包aar

2,898 阅读1分钟

在Flutter的混合开发中,我们通过Flutter_module 嵌入原生,这样原生开发都需要配置Flutter环境,所以为了减少开发成本,我们需要把Flutter_module 打包成一个库直接供原生使用。

下面我们学习一下Flutter打包aar的步骤:

  • 项目app下build.gradle配置

配置成 apply plugin: 'com.android.library',为了解决第三方库不能一起打包在aar的问题,需要配置 apply plugin: 'com.kezong.fat-aar' ,

	   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 GradleException("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'
}

def isLib = true

if(isLib) {
    apply plugin: 'com.android.library'
} else  {
    apply plugin: 'com.android.application'
}
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
if(isLib) {
    apply plugin: 'com.kezong.fat-aar'
}

android {
    compileSdkVersion 28

    lintOptions {
        disable 'InvalidPackage'
    }
    
    defaultConfig {
        
        if (!isLib){
            applicationId "com.moom.flutter_app_module"
        }
    
        minSdkVersion 16
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    
    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
    if(isLib) {
        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, _ ->
            println name
            embed project(path: ":$name", configuration: 'default')
        }
    }
}

  • 在项目根build.gradle 配置

为了解决第三方库,一起不能打包到aar文件中,还需要在项目根build.gradle 配置 classpath 'com.kezong:fat-aar:1.0.3'

	   buildscript {
	repositories {
	    google()
	    jcenter()
	}
	
	dependencies {
	    classpath 'com.android.tools.build:gradle:3.2.1'
	    classpath 'com.kezong:fat-aar:1.0.3'
	}
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

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

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


  • 在项目终端下,切换到cd android ,执行打包命令,build下生成release的aar文件
	   ./gradlew assembleRelease

通过以上的步骤,我们就可以把Flutter项目打包成aar库。