Stark Wong 的個人開發網站
 


 此頁面:更新於 2023 年 8 月 7 日 23 時 21 分 33 秒,頁面處理需時 0.0018 秒
 網站內容版權所有(C)Stark Wong。頁面(不包括檔案)可自由連結。網站系統版本 1.90-AngularJSBase (2015/9/27)
 
網站地圖

Warning: Undefined variable $row in /var/www/html/blog.inc.php on line 25

Warning: Trying to access array offset on value of type null in /var/www/html/blog.inc.php on line 25
如何在 Android Studio 使用 Local Repository (本端資源庫)

我們最近用 Kotlin 開發了一個程式庫,不過當把程式庫提供予其他團隊整合時發現我們用的 Kotlin 版本太新 (1.7.10),導致他們也要升級 Kotlin 版本,而升級 Kotlin 版本則需要同時升級 Gradle 及 Android Gradle Plugin 版本,然而升級 AGP 後則因為他們的程式含本端 aar 而導致編譯失敗。官方的解決方法是每個本端 aar 都開一個 module,這對於只用一兩個本端 aar 的開發者是沒什麼問題,但比較大的專案往往會從第三方取得 aar,結果會有超過 10 個 aar,這樣每個 aar 都開一個 module 的話看起來會比較亂。另一個方法就是將 aar 放在 maven repository,不過要為這個原因而架一個網站伺服器來放 aar 又是有點過份。不過其實 Gradle 是支援本端 maven repository 的,只需要將本來放在網站伺服器上的檔案放在指定的目錄下就可以,而且這個目錄可以相對於專案的目錄,其他開發者從 VCS checkout 專案後不需要進行任何修改即可進行編譯。

目錄結構

首先說一下目錄結構,將 maven 的檔案放入與專案的 app 目錄相同層級就可以,以下是一個例子:

AndroidProject
|-app
|-build
|-maven
| |-com
|   |-amulyakhare
|     |-textdrawable
|       |-1.0.1
|         |-textdrawable-1.0.1.aar
|         |-textdrawable-1.0.1.pom
|-build.gradle

Maven Artifact 的格式為 ‘groupId:artifactId:version’,在以上例子就是 ‘com.amulyakhare:textdrawable:1.0.1’,也就是在 build.gradle 裡 implementation / compileOnly 裡的那個。

POM 檔案

至於 pom 檔案可以用簡單幾句描述這個 Artifact 的內容,另可以宣告這個 Artifact 的相依性,令 Gradle 會自動引用這個 Artifact 所需的其他 Artifact。以下是 pom 檔案的例子:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.amulyakhare</groupId>
   <artifactId>textdrawable</artifactId>
   <version>1.0.1</version>
   <packaging>aar</packaging>
   <dependencies>
     <dependency>
       <groupId>androidx.fragment</groupId>
        <artifactId>fragment</artifactId>
        <version>1.3.6</version>
        <scope>compile</scope>
     </dependency>
   </dependencies>
</project>

這裡的 groupId、artifactId 和 version 必須與目錄結構相同,而 dependencies 裡面則為選填的內容,如無相依性則保留空白內容的 dependencies 即可。如以上的範例所示,每個相依性可以是在不同的 maven repository。

引用本端 maven respository

完成放置所有 aar 並編寫所需的 pom 後,最後的步驟就是在 build.gradle 引用這個本端資源庫。這個引用可以寫在全域或 app 的 build.gradle,這裡的示範是在 app 的 build.gradle (在 dependencies 上面):

repositories {
     maven {
         url "${rootProject.projectDir}/maven"
         content {
             includeGroup "com.amulyakhare"
         }
     }
}

利用 ${rootProject.projectDir} 變數就可以引用相對路徑的 maven repository。content 這個區塊可加可不加,加的話可以確保包含群組以外的 Artifact 不會嘗試在這個 maven repository 中下載。

引用後,要使用這個 Artifact 跟一般的使用方法完全相同:

implementation 'com.amulyakhare:textdrawable:1.0.1'

這樣就可以確保與以後的 Gradle / AGP 版本相容。


撰寫於:2023/6/14 14:49:15 / 回應:0
正在讀取回響內容...
其他內容請回到主頁