Flutter 插件開發之引入aar到安卓部分 並使用本地maven

本篇主題: 在 flutter 插件中引入 aarandroid

本篇只包含 android 部分, iOS 的 framework 直接在 podspec 中引入就能夠了,因此本篇略過不表git

作過安卓開發的朋友可能知道, aar 文件若是做爲本地文件直接引入 library, 而後 app 引用 library 是會報找不到aar的, 須要在 app 中使用 flatDir 進行引入, 這種方式的缺點在於, 你必須在每一個項目去配置, 頗有侵入性github

熟悉 flutter 插件開發的朋友都知道,在咱們開發 flutter 插件時, 插件是以 library module 的形式引入到項目中的apache

這時若是 sdk 方對於安卓只提供了 aar, 在這種大前提下,咱們有以下幾種方法:api

  1. 使用 maven 公開服, 好比 jcenter, 或其餘的 maven 倉庫
  2. 使用本地 maven 倉庫

本篇就使用這種本地 maven 倉庫的方案來作bash

完成本地 maven 的步驟

建立插件項目

第一步確定是建立一個 flutter 插件閉包

flutter create -t plugin example_for_flutter_plugin_local_maven
複製代碼

置入 aar

我這裏用蒲公英的的 aar 舉例:app

下載下來放在 android 目錄下maven

github.com/Pgyer/mvn_r…ide

在插件的 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 倉庫

  1. 須要一個 maven 二進制程序, mac 的話是用$ brew install maven便可, 其餘系統自行搜索 maven 安裝
  2. 驗證安裝$ mvn -v
  3. 使用命令行建立
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根據你的實際狀況來看就行了
}


複製代碼

後記

本篇使用了 gradle 來完成了對主項目無侵入的方式配置 maven

這樣主工程不管是任何項目能夠引用到這個 aar 的內容, 固然這個方案也適用於非 flutter 項目

倉庫地址: github

以上

相關文章
相關標籤/搜索