我们直接进入正题,这两天需要接入一个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"
}
完活,在解决问题的时候很多东西都没记,等到解决了之后,一时很多细节性的东西想不起来,排版有点乱,大家见谅。