kotlin dsl library工程怎么配置

配置 Kotlin DSL 的 Android Library 工程主要涉及两个核心文件:模块级的 build.gradle.kts 和根目录的配置文件。以下是基于现代 Android 开发标准(AGP 8.x + Gradle 8.x)的配置指南。

  1. 模块级配置 (build.gradle.kts)

这是库模块的核心配置文件。与 Application 模块不同,Library 模块需要应用 com.android.library 插件,并且通常不需要配置 applicationId。

plugins {

// 1. 应用 Android Library 插件

id("com.android.library")

// 2. 如果库中包含 Kotlin 代码,应用 Kotlin Android 插件

id("org.jetbrains.kotlin.android")

// 3. 如果需要发布到 Maven,可选应用 maven-publish 插件

// id("maven-publish")

}

android {

// 命名空间,替代旧版的 package name,用于生成 R 类

namespace = "com.example.mylibrary"

// 编译 SDK 版本

compileSdk = 34

defaultConfig {

// 最小 SDK 版本

minSdk = 24

// 注意:Library 模块没有 applicationId

// 如果有测试需求,可以配置 testInstrumentationRunner

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

}

buildTypes {

release {

isMinifyEnabled = false

proguardFiles(

getDefaultProguardFile("proguard-android-optimize.txt"),

"proguard-rules.pro"

)

}

}

compileOptions {

sourceCompatibility = JavaVersion.VERSION_17

targetCompatibility = JavaVersion.VERSION_17

}

// 如果是 Kotlin 库,确保 Kotlin 编译选项一致

kotlinOptions {

jvmTarget = "17"

}

// 开启构建特性(如 ViewBinding, DataBinding, Compose 等)

buildFeatures {

viewBinding = true

// compose = true // 如果是一个 Compose UI 库

}

}

dependencies {

// 示例依赖

implementation("androidx.core:core-ktx:1.12.0")

implementation("androidx.appcompat:appcompat:1.6.1")

// 测试依赖

testImplementation("junit:junit:4.13.2")

androidTestImplementation("androidx.test.ext:junit:1.1.5")

androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")

}

  1. 根目录配置 (build.gradle.kts 或 settings.gradle.kts)

在现代项目中,推荐在 settings.gradle.kts 中管理仓库,在根目录 build.gradle.kts 中管理插件版本(如果使用 Version Catalog 则更简洁)。

A. settings.gradle.kts (推荐方式)

集中管理依赖仓库和模块包含关系。

pluginManagement {

repositories {

google()

mavenCentral()

gradlePluginPortal()

}

}

dependencyResolutionManagement {

repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)

repositories {

google()

mavenCentral()

}

}

rootProject.name = "MyLibraryProject"

// 包含你的库模块

include(":my-library-module")

B. 根目录 build.gradle.kts (声明插件版本)

如果你不使用 Version Catalog (libs.versions.toml),可以在这里声明插件版本。

plugins {

// apply false 表示只声明版本,不在此处应用,供子模块使用

id("com.android.library") version "8.1.0" apply false

id("org.jetbrains.kotlin.android") version "1.9.0" apply false

}

  1. 关键注意事项
  2. 插件 ID 区别:
    1. App 模块使用:id("com.android.application")
    2. Library 模块使用:id("com.android.library")
    3. 切勿在 Library 模块中误用 application 插件,否则会导致构建错误。
  1. Namespace vs Package Name:
    1. AGP 7.0+ 引入了 namespace 属性,它取代了 AndroidManifest.xml 中的 package 属性用于资源生成。
    2. AndroidManifest.xml 中的 package 属性现在主要用于定义 R 类的 Java 包名(如果未指定 namespace)或作为唯一标识符,建议保持两者一致或在 build.gradle.kts 中明确指定 namespace。
  1. 依赖暴露:
    1. implementation: 依赖仅在当前库内部使用,不会传递给引用该库的 App 模块。
    2. api: 依赖会传递给引用该库的 App 模块(类似 Java 的 public 导出)。谨慎使用 api,以避免依赖膨胀。
  1. Kotlin 版本兼容性:
    1. 确保 org.jetbrains.kotlin.android 插件版本与项目中其他 Kotlin 模块兼容。
    2. 在 gradle.properties 中启用 Kotlin 增量编译以提升构建速度:

kotlin.incremental=true

  1. 发布配置 (可选):
    如果该库需要发布到 Maven 仓库,需额外配置 maven-publish 插件和 signing 配置,这通常涉及更复杂的 publishing {} 块配置。

通过以上配置,你可以建立一个标准的、类型安全的 Kotlin DSL Android Library 项目。如果遇到 Unresolved reference: android 错误,请确保已正确应用 com.android.library 插件并执行了 Gradle 同步。

相关推荐
xys_6781 小时前
JavaEE通关手册:初识Java
java·开发语言
Starry-sky(jing)2 小时前
Vidda ADB 开启:R Pro 65 找不到开发者选项的处理与连接验收
android·adb·远程控制·电视·vidda
雨白2 小时前
从原理到实践:使用 Kotlin KSP 仿写 ButterKnifeLite
android·kotlin
ShineWinsu2 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
疯华整猫3 小时前
把二十七个 init 从首帧前面搬走:用 Trae 把启动优化钉进 CI
android·性能优化·ai编程
灿飞3 小时前
Kotlin与Java虚拟机十一:类与属性:构造顺序、backing field 与显式 backing field
java·后端·kotlin
ShineWinsu3 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
传奇开心果4 小时前
【探秘 Jetpack Compose 框架深水区】 第8课:rememberSaveable 的边界在哪里?——Bundle、Saver 与什么值得跨进程存活
android·kotlin
吴名氏.4 小时前
Java转AI Agent教程(第十二周)检索与切分
java·开发语言·人工智能·ai·ai agent
瑞雪兆丰年兮4 小时前
JavaWeb-day10-SpringBootWeb案例
java·开发语言·javaweb·web