之前在开发 百度人脸采集flutter插件 的时候,遇到了一个问题,百度提供的SDK是aar, 导入插件后,编译项目时,如果项目或插件项目的的Gradle插件版本是4.x的话,无法编译成功,会出现下面类似问题:

Execution failed for task ':library_module:bundleDebugAar'.
> Direct local .aar file dependencies are not supported when building an AAR. 
The resulting AAR would be broken because the classes and Android resources from any local .aar 
file dependencies would not be packaged in the resulting AAR. Previous versions of the Android 
Gradle Plugin produce broken AARs in this case too (despite not throwing this error).

但是引用jcenter 、maven等的arr库却不会有这种问题,这种情况下,我们要么把aar上传至这些公开仓库,要么就做私服。但是吧,做私服还是有些麻烦的。当然也有使用github做私服的方法,这不是本次笔记的重点。

新办法

在插件的android 项目文件夹下创建一个文件夹,我的插件是创建的一个libs文件夹。将百度提供的aar 放入libs下,我这里aar文件名为faceplatform-release.aar
接下来,编辑插件的android/build.gradle文件

rootProject.allprojects {
    // 这个闭包是循环所有project, 我们让这个仓库可以被所有module找到
    repositories {
        google()
        jcenter()
        flatDir { dirs project(":flutter_bdface_collect").file("libs") }
    }
}

dependencies {
    implementation(name: "faceplatform-release, ext: "aar")
}

老办法

这次我们用本地maven仓库的方式引入aar。方法来自于 Flutter 插件开发之引入aar到安卓部分 并使用本地maven

这里默认电脑安装了 maven。mac 可用 brew 安装 brew install maven

在插件的android 项目文件夹下创建一个文件夹,我的插件是创建的一个libs文件夹。将百度提供的aar 放入libs下,我这里aar文件名为faceplatform-release.aar

把终端 cd 到libs 目录下,执行mvn deploy:deploy-file -Dfile=faceplatform-release.aar -Durl="file://." -DgroupId="com.baidu.idl.face" -DartifactId="platform" -Dversion="4.1"

这里-Dfile 指向 aar 文件, -Durl 指向目标地址, 我这里因为要部署在libs文件夹里, 所以直接用.代表当前文件夹, DgroupId, DartifactId,Dversion分别是组名,品名,版本号。

执行完成后,就可以删除faceplatform-release.aar了。

接下来,编辑插件的android/build.gradle文件

String moudleDir = ""
// 获取当前moudle的dir
rootProject.allprojects { project ->
    try {
        // 这里的flutter_bdface_collect是flutter的约定, 插件的module名是插件名, :是gradle的约定. project前加:
        if (project.properties.get("identityPath").toString() == ":flutter_bdface_collect") {
            moudleDir = project.properties.get("projectDir").toString()
        }
    } catch (e) {
    }
}
rootProject.allprojects {
    // 这个闭包是循环所有project, 我们让这个仓库可以被所有module找到
    repositories {
        google()
        jcenter()
        // 添加这个指向本地的仓库目录
        maven { url "$moudleDir/libs" }
    }
}

dependencies {
    implementation "com.baidu.idl.face:platform:4.1"
}

以上。