This website records my snippets, patterns, and some practices.
- Macbook Air M2/macOS 15.2
- Android Studio Ladybug 2024.2.1 Patch 3
- Gradle Plugin 8.7.3
- Gradle 8.9
- Git Host: GitHub
- Git Client: Fork
git clone git@github.com:${account}/${repository name}.git
app/
${module_name}/
${module_name}
區塊,同時,Gradle Scripts
區塊下,會多一個模組專屬的 build.gradle.kts(Module: ${module_name})
檔案。build.gradle.kts(Module: ${module_name})
maven-publish
組件如下:
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
id("maven-publish")
}
build.gradle.kts(Module: ${module_name})
中,android
區塊的最後面,加上 publishing
區塊,描述發佈資訊如下:
publishing {
publications {
register<MavenPublication>("release") {
groupId = "com.github.${github_account}"
artifactId = "${name_of_artifact}"
version = "0.0.1"
afterEvaluate {
from(components["release"])
}
}
}
}
groupId 和 artifactId 是用來識別函式庫的(註1),需要保持獨一無二,以便與他人的成果作出區別。 通常 groupId 會採用反向域名表示所屬組織/個人,artifactId 則與專案名相同。本例中,因為使用GitHub做為Git host,所以直接用GitHub網域當做範例。
android {
defaultConfig {
aarMetadata {
minCompileSdk = 29
}
minSdk = 29
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
}
透過在 aarMetatdata
(註2) 區塊中填加限制,可以在其他人取用此函式庫時,要求其符合條件。以上例而言,若取用函式庫的專案,使用的sdk版本小於29,Gradle會發出警告要求專案昇級。
完成上述設定步驟後,並將成果推到GitHub倉儲後,發佈相關設定就完成了。理論上,此時的專案,應可以透過 Apach Maven 相容的服務發佈。
但實務上,因為開發環境與發佈環境不同,還會有一些額外工作要處理。
build.gradle.kts
,預設 JDK 版本為 11build.gradle.kts(Module: ${module_name})
以及 build.gradle.kts(Module: app)
:
在 android
區塊中,找到 compileOptions
與 kotlinOptions
,改寫內容如下:
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
jitpack.yml
(註7) 檔案如下:
jdk:
- openjdk17
基本上,JitPack會依照設定,自動切換環境,如果要做更細緻的設定(例如使用 17.0.1 而非最新版本 17.0.12),可以參考官方文件(註7)再進行設定。
專案根目錄/.circleci/
下會有 config.yml
描述檔。
在檔案開頭會有一段指令如下,告訴Circle CI要用那一種硬體來建構程式:
orbs:
android: circleci/android@3.0.2
目前,Android Orb 的 3.0.0+ 版本(註9),預設JDK為 OpenJDK 17,以這次的例子來說,不需要改動。
但如果想要使用更新版本的JDK來建構程式,可以在 config.yml
裡面,每一個job裡面,加上以下步驟:
jobs:
${job_name}:
executor:
// 設定執行者
steps:
- checkout
- android/change_java_version:
java_version: 23
- // 後續步驟
如果選擇的Android Orb比較舊,則預設的JDK版本為 OpenJDK 11,此時則需要改寫如下:
jobs:
${job_name}:
executor:
// 設定執行者
steps:
- checkout
// 注意!舊版本使用折線連接字符
- android/change-java-version:
java-version: 17
- // 後續步驟
build.gradle.kts(Module: ${module_name})
加入以下區塊:
configurations.all {
resolutionStrategy {
force "androidx.core:core:1.13.1" //降回前一穩定版本
}
}
android {
compileSdk = 35
defaultConfig {
// Other settings
targetSdk = 35 // 非必要,但最好與compileSdk一致.
}
}
在創建函式庫專案的設定工作完成後,就可以實際發布函式庫了。 不過因為函式庫尚未實作,以下的步驟只是要確認發佈流程沒有問題,之後才可以專注在函式庫的開發上。
用 GitHub 帳號,登入 JitPack 網站如下:
左側,會顯示登入帳號在 GitHub 上所有的公開倉儲,不論是否為 Java/Kotlin/Android 函式庫。
中間的輸入欄位,可以用來搜尋所有在 JitPack 上有紀錄的倉儲。搜尋到後,會顯示如下畫面:
因為目前專案還是初始狀態,所以只能看到提交紀錄,以及目前的狀態快照(SNAPSHOT)。
點擊最後一筆提交紀錄的Get it
按鈕,JitPack就會開始建構函式庫,過程大約5-10分鐘左右。完成後,會顯示如下狀態:
將滑鼠指標移至Log圖示上,會顯示出此次發佈函式是成功,還是失敗。點擊Log圖示,則可以看到詳細的紀錄。
一但確定測試發佈成功,接下來就可以專注在函式庫本身的實作上。
若想要在函式庫內,引入並使用 JetPack Compose 相關功能,設定的方式與一般應用程式相同(註10),直接參照官方文件設定即可。
注意,官方的文件在依賴管理的部分寫法並不一致。大部分文件採取在build.gradle.kts
中直接宣告,但部分文件教學會使用 Gradle版本目錄(Gradle Version Catelogs)(註11)的寫法,將宣告統一寫在 ‘libs.versions.toml’ 檔案中,再由 build.gradle.kts
引用。基本上兩種寫法是等效的,不過以目前開發環境的發展來看,建議儘量使用 Gradle版本目錄,而不要直接宣告依賴。(註12)
完成函式庫功能後,在正式發佈前,最好能提供範例程式,用來說明函式庫功能,同時也兼做本地端測試,確保函式庫能被正確引入。
範例程式可以直接使用創建專案時產生的 app 模組。為了讓 app 模組能直接存取函式庫,在 ‘build.gradle.kts(Module: app)’ 中,加入以下依賴宣告:
dependencies {
// 其他依賴宣告
// ...
implementation(project(":${module_name}"))
}
接著,檢查Java環境以及SDK版本,是否與函式庫設定相同。 同步後沒有問題,就可以直接開始撰寫範例程式,撰寫的過程中若發現問題,也可以隨時更正,修改函式庫。
函式庫開發告一段落後,便可以考慮透過 JitPack 正式發佈。 發佈的方式,大致上與測試發佈函式庫相同。唯一差異點在於發佈前,要先在 GitHub 服務上發佈對應的版本。
在頁面的右側,可以看到 Release 區塊:
點擊 Create a new release,開始創建發佈版本。
如下圖所示,產生新的版本,必需對應到某個標簽(Tag),如果尚未有對應的標簽,可以在輸入標簽文字後,點擊 Create new tag
字樣,產生新的標簽。
Publish Release
按鈕,即可完成 GitHub 上的版本發佈。 brew install gh
另外也可透過 MacPorts, Conda, Spack, Webi等不同的套件管理工具安裝。
gh auth login
執行後,依照畫面上的互動式指令設定,給予 gh 執行權限操作GitHub倉儲。
gh release create 0.0.1 --notes "My Release"
GitHub CLI 還有其他更進階的功能,有興趣可以直接參閱官方文件(註13)。
在 GitHub 版本發佈完成後,登入JitPack網站,選擇函式庫,應該會看到 Release 分頁下,多出一個版本列表。同時,會看到 JitPack 自動觸發建構版本的工作。
在 JitPack 函式庫版本建構完成後,點擊對應版本的 Get it
按鈕,或是將畫面拉到最下方,就可以看到如何在其他專案中引用此函式庫的教學。
主要有兩個步驟:
settings.gradle.kts
,加入以下內容:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven(url = "https://jitpack.io")
}
}
注意,JitPack提供的教學比較舊,在新版Android Studio中,應該如上設定。
dependencies {
// 直接宣告,形式為 groupId:artifactId:version
implementation 'com.github.${github_account}:${name_of_artifact}:${version}'
// Gradle Kotlin DSL 語法則如下:
// implementation("com.github.${github_account}:${name_of_artifact}:${version}")
}
當然,也可使用 Gradle版本目錄 :
[versions]
libversion = "${version}"
[libraries]
my-library = { module = "${groupId}:${artifactId}", version.ref = libversion }
然後在 build.gradle.kts 中引用:
dependencies {
implmentation(libs.my.library) //前綴 libs.,函式別名用點取代折線
}
到此,自建的函式庫就可以透過 Maven + JitPack,在不同專案中複用。
jitpack.yml
)maven(url = "https://jitpack.io")
用來協助處理 "建立 Android 函式庫專案" 以及 "檢查環境" 兩項工作的小工具。