如何在Flutter插件中使用本地AAR文件?

24

我已经使用Flutter创建了一个插件,包含:

flutter create --template plugin flutter_plugin

我已将我的aar文件放置在flutter_plugin/android/src/main/libs文件夹中
我已修改了flutter_plugin/android/build.gradle文件

并将rootProject.allprojects部分更改为

rootProject.allprojects {                                                                                               
     repositories {                                                                                                      
         google()                                                                                                        
         jcenter()                                                                                                       
         flatDir {                                                                                                       
             dirs "src/main/libs"                                                                                  
         }                                                                                                               
     }                                                                                                                   
}  

在 android {} 后面添加了 dependencies 部分:

And added dependencies section, after android {}:

dependencies {                                                                                                          
     implementation (name:"mylib",ext:"aar")                                                                     
} 

但是当我尝试使用"flutter run"运行时,出现了gradle异常,显然它试图在example目录中查找mylib.aar,路径为:example/src/main/libs/mylib.aar,但是失败了。

我可以将我的库放到example目录中,但我认为这不是正确的方法,因为我想让我的aar成为插件的一部分。


对我来说,.aar文件已经编译完成,Balazs Banyai的回答很有帮助。 - sophie
有人尝试将Android模块导入到Flutter插件中吗? - Sujith Royal
5个回答

43

我将本地的 .aar 依赖项添加到 Flutter 插件中的解决方案如下(基于这里的说明 How to add .aar dependency in library module?):

  1. 在你的 Android 插件源代码中创建一个 libs 文件夹(<plugin_name>/android/libs)(在插件的顶层,而不是示例项目中)

  2. 将你的 .aar 文件添加到此文件夹中(例如 myFirstDependency.aar

  3. 将你的 .aar 依赖项(不包括 .aar 扩展名)添加到你的插件的 build.gradle 文件中(<plugin_name>/android/build.gradle),例如:

dependencies {
    ...
    implementation (name: 'myFirstDependency', ext: 'aar')
    implementation (name: 'myOtherDependency', ext: 'aar')
}

为了让Gradle能够找到这些依赖项,您需要指示Gradle在插件内的libs文件夹中搜索。因此,请在plugins build.gradle(与依赖项相同的/android/build.gradle)的rootProject.allprojects repositories部分下添加以下内容。 (注意:还有一个buildscripts repositories部分,您不应更改此部分)。
rootProject.allprojects {
    repositories {
        google()
        jcenter()

        //Add this below <plugin_name> is whatever your plugin is called eg. url_launcher
        flatDir {
            dirs project(':<plugin_name>').file('libs')
            // e.g. dirs project(':url_launcher').file('libs')  - don't miss the ':'
        }
    }
}

因此,您的插件中没有直接包含.aar库依赖项。


谢谢你的回答,很有帮助。如果有人遇到了“在根项目<project_name>中找不到路径为<plugin_name>的项目”错误,可以通过在Android文件夹的settings.gradle中添加include ':<plugin_name>'来解决它。 - yazicifatihcan

10

我在我的插件的 android 目录下创建了一个名为 libs 的文件夹,并将我生成的 aar 文件放置在该目录中:

输入图像描述

我更新了 Android 代码的 build.gradle 文件,添加了以下内容:

rootProject.allprojects {
    repositories {
        google()
        jcenter()
        flatDir {
            dirs 'libs'
        }
    }
}

在依赖关系部分:

implementation fileTree(dir: 'libs', include: ['*.aar'])

输入图像描述


7
根据我的经验,在另一个插件项目(Flutter插件的Android项目)中添加直接插件aar要么非常困难,要么不允许。在这种情况下,您有两个选择:
  1. 如果您的aar依赖可在gradle上使用,请在您的构建文件中使用gradle。您可以在此处搜索它:here
  2. 或者,如果您正在从另一个项目构建aar,则可以将aar发布到本地maven并通过将“mavenLocal()”添加到您的插件构建文件中来使用该依赖项。
例如,以下是我解决相同问题所做的事情: 我的依赖项的build.gradle
group 'com.companyname.artifactname'
version '1.0-SNAPSHOT'

buildscript {
    repositories {
        mavenLocal()
        google()
        jcenter()
        maven {
            url "https://maven.google.com" // Google's Maven repository
        }        
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
    }
}
allprojects {
    repositories {
        mavenLocal()
        google()
        jcenter()
        maven {
            url "https://maven.google.com" // Google's Maven repository
        }        
    }
}


apply plugin: 'com.android.library'


uploadArchives {
    repositories {
        mavenLocal()
    }
}

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 2
        versionName "2.0.1"
    }
    lintOptions {
        abortOnError false
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dependencies {
        compile 'com.android.support:appcompat-v7:23.2.1'
        compile 'com.android.support:support-v4:23.2.1'
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
}


apply plugin: 'maven-publish'
publishing {
    publications {
      library(MavenPublication) {
        version "1.1"
        artifact(bundleRelease)
      }
    }
}

然后只需运行以下命令将其发布到本地Maven仓库。
gradlew publishToMavenLocal

然后在你的Flutter插件的repositories部分添加mavenLocal(),并将dependancy添加为

compile 'com.companyname.artifactname:libraryname:1.1@aar'

我可以在CI/CD中使用本地Maven存储库吗? - Den

1

使用flatDir解决方案时,当您尝试将项目与Gradle文件同步时,会收到警告:

应避免使用flatDir,因为它不支持任何元数据格式。

您可以将以下内容放入build.gradle中,以消除警告:

android {
    sourceSets {
        main.jniLibs.srcDirs += project(':<plugin_name>').file('libs')
    }
}

dependencies {
    implementation files('libs/<dependency_name>.aar')
}

很遗憾,使用这两种解决方案时,在尝试构建项目时会出现以下错误:
直接本地.aar文件依赖项不支持构建AAR时使用。 由于任何本地.aar文件依赖项的类和Android资源不会打包在生成的AAR中,因此生成的AAR将无法正常工作。即使是Android Gradle插件的早期版本在这种情况下也会产生损坏的AAR(尽管没有抛出此错误)。
被接受的答案似乎是正确的。我将库放在了应用程序项目内,因为在我的情况下接受的答案的两个选项都不可行。
为此,我不得不在我的应用程序的android目录中创建一个新目录(即example/android/),并将我的.aar文件和一个新的build.gradle文件放在该目录中。
android/build.gradle:
dependencies {
    implementation project(':<dependency_name>')
}

example/android/<dependency_name>/build.gradle:

configurations.maybeCreate("default")
artifacts.add("default", file('<dependency_name>.aar'))

example/android/settings.gradle:

include ':<dependency_name>'

你将依赖项放在示例文件夹里了吗? - DarkNeuron
在使用该依赖项的每个应用程序的android文件夹中。如果您可以自己构建aar,则接受答案的解决方案更好。 - Colin

0

我通过添加代码成功使其工作

maven { url("${project(':test_flutter_plugin').file('libs').path}/my_lib") }

加入到 rootProject.allprojects 中

在 plugin/android/build.gradle 文件中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接