Flutter 插件开发之引入aar到安卓部分 并使用本地maven

本篇主题: 在 flutter 插件中引入 aar

本篇只包含 android 部分, iOS 的 framework 直接在 podspec 中引入就可以了,所以本篇略过不表

做过安卓开发的朋友可能知道, aar 文件如果作为本地文件直接引入 library, 然后 app 引用 library 是会报找不到aar的, 需要在 app 中使用 flatDir 进行引入, 这种方式的缺点在于, 你必须在每个项目去配置, 很有侵入性

熟悉 flutter 插件开发的朋友都知道,在我们开发 flutter 插件时, 插件是以 library module 的形式引入到项目中的

这时如果 sdk 方对于安卓只提供了 aar, 在这种大前提下,我们有如下几种方法:

  1. 使用 maven 公开服, 比如 jcenter, 或其他的 maven 仓库
  2. 使用本地 maven 仓库

本篇就使用这种本地 maven 仓库的方案来做

完成本地 maven 的步骤

创建插件项目

第一步肯定是创建一个 flutter 插件

flutter create -t plugin example_for_flutter_plugin_local_maven
复制代码

置入 aar

我这里用蒲公英的的 aar 举例:

下载下来放在 android 目录

github.com/Pgyer/mvn_r…

在插件的 android 目录下创建一个文件夹,把 aar 放进去, 我这里取名为 aar

mkdir android/aar
cd android/aar
wget https://github.com/Pgyer/mvn_repo_pgyer/blob/master/com/pgyersdk/sdk/3.0.9/sdk-3.0.9.aar?raw=true #下载
mv sdk-3.0.9.aar?raw=true sdk.aar #改名
复制代码

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

$ brew install maven
$ mvn -v
mvn deploy:deploy-file -Dfile=sdk.aar -Durl="file://." # 这步会报错

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file (default-cli) on project standalone-pom: The artifact information is incomplete or not valid:
[ERROR]   [0]  'groupId' is missing.
[ERROR]   [1]  'artifactId' is missing.
[ERROR]   [2]  'version' is missing.
[ERROR]
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
复制代码

这里-Dfile 指向 aar 文件, url 指向目标地址, 我这里因为要部署在 aar 文件夹里, 所以直接用.代表当前文件夹, 它提示我缺少 3 个东西, 组名,品名,版本号

mvn deploy:deploy-file -Dfile=sdk.aar -Durl="file://." -DgroupId="com.pgyer" -DartifactId="sdk" -Dversion="3.0.9"

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-deploy-plugin:2.7:deploy-file (default-cli) @ standalone-pom ---
Uploading to remote-repository: file://./com/pgyer/sdk/3.0.9/sdk-3.0.9.aar
Uploaded to remote-repository: file://./com/pgyer/sdk/3.0.9/sdk-3.0.9.aar (134 kB at 3.3 MB/s)
Uploading to remote-repository: file://./com/pgyer/sdk/3.0.9/sdk-3.0.9.pom
Uploaded to remote-repository: file://./com/pgyer/sdk/3.0.9/sdk-3.0.9.pom (415 B at 208 kB/s)
Downloading from remote-repository: file://./com/pgyer/sdk/maven-metadata.xml
Downloaded from remote-repository: file://./com/pgyer/sdk/maven-metadata.xml (292 B at 32 kB/s)
Uploading to remote-repository: file://./com/pgyer/sdk/maven-metadata.xml
Uploaded to remote-repository: file://./com/pgyer/sdk/maven-metadata.xml (292 B at 146 kB/s)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.407 s
[INFO] Finished at: 2020-03-30T16:00:25+08:00
[INFO] ------------------------------------------------------------------------
复制代码

这样就 ok 了, 所有文件都生成了

tree .
.
├── com
│   └── pgyer
│       └── sdk
│           ├── 3.0.9
│           │   ├── sdk-3.0.9.aar
│           │   ├── sdk-3.0.9.aar.md5
│           │   ├── sdk-3.0.9.aar.sha1
│           │   ├── sdk-3.0.9.pom
│           │   ├── sdk-3.0.9.pom.md5
│           │   └── sdk-3.0.9.pom.sha1
│           ├── maven-metadata.xml
│           ├── maven-metadata.xml.md5
│           └── maven-metadata.xml.sha1
└── sdk.aar
复制代码

这是标准的 maven 目录结构

这时候 sdk.aar 就没用了, 可以删除

编辑 gradle 文件

用 studio 打开项目 example/android

// 定义一个方法, 用于获取当前moudle的dir
def getCurrentProjectDir() {
    String result = ""
    rootProject.allprojects { project ->
        if (project.properties.get("identityPath").toString() == ":example_for_flutter_plugin_local_maven") { // 这里是flutter的约定, 插件的module名是插件名, :是gradle的约定. project前加:
            result = project.properties.get("projectDir").toString()
        }
    }
    return result
}

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

dependencies {
    implementation "com.pgyer:sdk:3.0.9" // 添加这个, 接着点sync project with gradle file 刷新一下项目就可以了. 是使用api还是implementation根据你的实际情况来看就好了
}


复制代码

原文 

https://juejin.im/post/5e81adaa6fb9a03c8d49e478

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Flutter 插件开发之引入aar到安卓部分 并使用本地maven

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址