Flutter 插件开发-安卓引入aar 并使用本地maven

2,808 阅读4分钟

我们直接进入正题,这两天需要接入一个android第三方广告SDK,因厂商未提供Flutter插件,只能我们自己来处理,经过和ios同事讨论认为抽成一个插件更合适一点,因为我们应用不止一款,我们就提供一个Flutter插件供其他App使用,在解决这个问题的过程中碰到的一些问题以及解决方法。

报错问题

我添加aar到libs里面,在build.gradle引入,但当我编译时却在flutter_plugin/example/android中去寻找我所添加的aar(能找到都有鬼了),我查了一些资料Flutter不支持这种插件添加本地aar的方式,有一种折中的笨办法,我哪个项目引用这个插件我就把aar添加到对应的flutter_project/android/libs中,但这种显然和我要写插件的想法背道而驰。

解决方案

既然他是去flutter_project/android里面找,那我们就使用远程maven仓库来测试一下可行性。

1.和第三方厂商技术沟通

和对接的技术沟通是否有maven仓库的第三方库,这样如果他们后期有改动,对我们的影响也是很小的,但是很遗憾,没有。

2.放到公司的私有maven仓库

但是我原来并没有上传过library里面还带着aar的,在我上传的过程中提示检测到多个AndroidManifest.xml,这条路也堵死了。

3.放到本地私有maven仓库

1.创建本地 maven 仓库

请确保你本地有JDK环境(我的是1.8)

使用背景:

安装环境:Windows10 64
JDK版本:1.8
Maven版本:3.0.4 (传送门: pan.baidu.com/s/1MDknLmhW… 密码: ge9u)
开发工具:Android Studio 4.0.1

开始

解压Maven到你指定的硬盘下

这里要注意一下,刚解压之后应该是红色方框内的,如果不改镜像的话有些对应的包会下载失败,你懂得,我们换成阿里云的,复制粘贴就行

	<mirrors>
		<mirror>
			<id>nexus-aliyun</id>
			<mirrorOf>central</mirrorOf>
			<name>Nexus aliyun</name>
			<url>http://maven.aliyun.com/nexus/content/groups/public</url>
		</mirror>
	</mirrors>

上面那一步完成之后就需要去配置path环境变量了,配置完验证一下就好了,
一定要注意的是在Terminal使用之前,一定要重启android studio,一定要重启android studio,别忘了。
这一步完成之后Maven就配置完成了。

4.使用 aar 文件创建本地 maven 仓库

这一步才是重点,我们打开插件的android项目,创建一个文件夹里面存放我们第三方的aar文件

我们进入我们创建的aar里面,Dfile你的aar文件, Durl指向目标地址,其他的是,组名,品名,版本号之类的看你自己修改,


mvn deploy:deploy-file -Dfile=adhub_ad_sdk_3.4.8.aar -Durl="file://." -DgroupId="com.adhub_ad" -DartifactId="sdk" -Dversion="3.4.8"

下面就是生成之后的,

我们引入本地maven,编辑 gradle 文件,adhub_plugin是我们flutter和原生约定的

// 定义一个方法, 用于获取当前moudle的dir
def getCurrentProjectDir() {
    String result = ""
    rootProject.allprojects { project ->
        if (project.properties.get("identityPath").toString() == ":adhub_plugin") {
            // 这里是flutter的约定, 插件的module名是插件名, :是gradle的约定. project前加:
            result = project.properties.get("projectDir").toString()
        }
    }
    return result
}
//补充:如果上面报错,这一行if (project.properties.get("identityPath"),
原因是flutter插件有的会有引用其他Linux\macOS\win\web、之类的其他包,而这下包里面是没有android文件夹的,所以找不到,下面放了一个connectivity_for_web包的目录结构图
Build file 'D:\flutter\.pub-cache\git\adhub_plugin-97145c094a41ad698e72896dbe0440842b180918\android\build.gradle' line: 31

* What went wrong:
A problem occurred evaluating project ':adhub_plugin'.
> Basedir D:\flutter\.pub-cache\hosted\pub.flutter-io.cn\connectivity_for_web-0.3.1+4\android does not exist

我们在这里把上面的方法补充一下,只有当前编译的项目是我指定的项目(adhub_plugin),我才去找对应的aar路径
        if (project.toString().contains ("adhub_plugin")) {
            if (project.properties.get("identityPath").toString() == ":adhub_plugin") {
                // 这里是flutter的约定, 插件的module名是插件名, :是gradle的约定. project前加:
                //可能有朋友会纳闷这个本地的地址具体指向哪里,其实指向的是你插件项目存放的本地路径
                D:\flutter\.pub-cache\git\adhub_plugin-97145c094a41ad698e72896dbe0440842b180918\android\aar
                result = project.properties.get("projectDir").toString()
            }
        }

rootProject.allprojects {
    // 这个闭包是循环所有project, 我们让这个仓库可以被所有module找到
    def dir = getCurrentProjectDir()
    repositories {
        google()
        jcenter()
        maven { // 添加这个指向本地的仓库目录
            url "$dir/aar"
        }
    }
}
dependencies {
	//引入我们刚刚生成的aar
    implementation "com.adhub_ad:sdk:3.4.8"
}


完活,在解决问题的时候很多东西都没记,等到解决了之后,一时很多细节性的东西想不起来,排版有点乱,大家见谅。