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

CaiJingLong發表於2020-03-30

本篇主題: 在 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 倉庫

  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

以上

相關文章