CCGO Gradle 插件参考¶
版本:v3.0.10 | 更新时间:2026-01-21
概述¶
CCGO Gradle 插件为使用 CCGO 进行原生 C++ 库开发的 Android 和 Kotlin 多平台项目提供基于约定的配置。这些插件在 CCGO 项目中标准化了构建配置、原生库集成和发布工作流程。
发布到 Maven Central:com.mojeter.ccgo.gradle
主要特性¶
- 基于约定的配置:基于 CCGO 最佳实践的标准化构建设置
- CCGO.toml 集成:自动从 CCGO.toml 读取项目配置
- 原生构建支持:基于 Python 的(ccgo CLI)和基于 CMake 的原生构建
- 发布就绪:预配置 Maven Central 和自定义仓库发布
- Android 和 KMP:完全支持 Android 库和 Kotlin 多平台
- 类型安全:基于 Kotlin DSL 的插件,带编译时验证
可用插件¶
Android 库插件¶
com.mojeter.ccgo.gradle.android.library¶
支持 Kotlin 的基本 Android 库配置。
应用:
- com.android.library
- org.jetbrains.kotlin.android
- com.mojeter.ccgo.gradle.android.lint
配置: - Kotlin 编译(JVM 目标、源代码兼容性) - 产品变体(从 CCGO.toml 读取) - Gradle 管理的测试设备 - APK 归档任务
用法:
com.mojeter.ccgo.gradle.android.library.compose¶
支持 Jetpack Compose 的 Android 库。
扩展:android.library
额外配置: - Compose 编译器设置 - Compose 依赖
用法:
com.mojeter.ccgo.gradle.android.feature¶
模块化 Android 应用的功能模块配置。
扩展:android.library
额外配置: - 功能模块依赖 - Navigation 组件设置 - Hilt 依赖注入集成
用法:
原生构建插件¶
com.mojeter.ccgo.gradle.android.library.native.python¶
集成使用 ccgo CLI(基于 Python 的构建编排器)构建的原生 C++ 库。
扩展:android.library
构建流程:
1. 读取 CCGO.toml 获取项目配置
2. 创建 buildLibrariesForMain 任务
3. 执行 ccgo build android --arch <archs> --native-only
4. 将原生库(.so 文件)集成到 AAR 中
Gradle 任务流程:
环境变量:
- ANDROID_HOME:Android SDK 路径
- NDK_ROOT:Android NDK 路径
- CMAKE_HOME:CMake 安装路径
用法:
plugins {
alias(libs.plugins.ccgo.android.library)
alias(libs.plugins.ccgo.android.library.native.python)
}
构建命令:
com.mojeter.ccgo.gradle.android.library.native.cmake¶
直接 CMake 集成,无需 ccgo CLI 即可进行原生构建。
扩展:android.library
配置:
android {
externalNativeBuild {
cmake {
path = file("${rootDir.parentFile}/CMakeLists.txt")
version = "3.22.1"
}
}
defaultConfig {
externalNativeBuild {
cmake {
cppFlags += listOf("-fpic", "-frtti", "-fexceptions", "-Wall")
arguments += listOf(
"-GNinja",
"-DANDROID_PLATFORM=android-21",
"-DANDROID_TOOLCHAIN=clang",
"-DANDROID_STL=c++_shared"
)
}
}
ndk {
abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86_64")
}
}
}
用法:
plugins {
alias(libs.plugins.ccgo.android.library)
alias(libs.plugins.ccgo.android.library.native.cmake)
}
com.mojeter.ccgo.gradle.android.library.native.empty¶
没有原生代码的 Android 库(纯 Kotlin/Java 包装器)。
使用场景: - 预构建原生库的 Kotlin 包装器 - 带 JNI 绑定的纯 Kotlin/Java SDK - 无原生编译的测试和调试
用法:
plugins {
alias(libs.plugins.ccgo.android.library)
alias(libs.plugins.ccgo.android.library.native.empty)
}
Android 应用插件¶
com.mojeter.ccgo.gradle.android.application¶
Android 应用配置。
应用:
- com.android.application
- org.jetbrains.kotlin.android
- com.mojeter.ccgo.gradle.android.lint
用法:
com.mojeter.ccgo.gradle.android.application.compose¶
带 Jetpack Compose UI 的 Android 应用。
用法:
com.mojeter.ccgo.gradle.android.application.flavors¶
产品变体配置(dev、staging、prod)。
用法:
代码质量和测试插件¶
com.mojeter.ccgo.gradle.android.lint¶
采用 CCGO 最佳实践的 Android Lint 配置。
配置: - 警告严重级别 - 基线文件支持 - HTML 和 XML 报告
用法:
com.mojeter.ccgo.gradle.android.library.jacoco¶
Android 库的 Jacoco 代码覆盖率。
用法:
com.mojeter.ccgo.gradle.android.application.jacoco¶
Android 应用的代码覆盖率。
依赖注入和数据库插件¶
com.mojeter.ccgo.gradle.android.hilt¶
Hilt 依赖注入设置。
应用:
- com.google.dagger.hilt.android
- 用于注解处理的 KSP
用法:
com.mojeter.ccgo.gradle.android.room¶
使用 KSP 的 Room 数据库配置。
用法:
发布插件¶
com.mojeter.ccgo.gradle.android.publish¶
Android 库的 Maven 发布配置。
应用:
- com.vanniktech.maven.publish
- signing
特性: - 自动 CCGO.toml 集成 - 源代码和 Javadoc JAR 生成 - 带依赖的 POM 生成 - 签名配置(GPG 或内存密钥) - Maven Central、本地和自定义仓库支持
发布命令:
# 发布到 Maven Local(~/.m2/repository)
./gradlew publishToMavenLocal
# 发布到 Maven Central
./gradlew publishToMavenCentral
# 发布到自定义仓库
./gradlew publishToMavenCustom
配置源(优先级顺序): 1. 环境变量(CI/CD 覆盖) 2. CCGO.toml(项目根目录) 3. gradle.properties(项目级) 4. ~/.gradle/gradle.properties(用户级)
用法:
com.mojeter.ccgo.gradle.kmp.publish¶
Kotlin 多平台库发布。
支持: - Android、iOS、JVM 目标 - 自动依赖配置 - 多平台产物发布
用法:
Kotlin 多平台插件¶
com.mojeter.ccgo.gradle.kmp.library.native.python¶
使用 CCGO 构建原生代码的 KMP 库。
目标: - Android(ARM、ARM64、x86_64) - iOS(ARM64、模拟器 x86_64/ARM64) - JVM
用法:
com.mojeter.ccgo.gradle.kmp.library.native.empty¶
没有原生代码的 KMP 库。
根项目插件¶
com.mojeter.ccgo.gradle.android.root¶
多模块 Android 项目的根项目配置。
配置: - 构建缓存设置 - 公共仓库 - Gradle 版本目录
用法(根 build.gradle.kts):
com.mojeter.ccgo.gradle.kmp.root¶
KMP 项目的根配置。
JVM 插件¶
com.mojeter.ccgo.gradle.jvm.library¶
纯 JVM/Kotlin 库(无 Android)。
应用:
- org.jetbrains.kotlin.jvm
- Java 库约定
用法:
CCGO.toml 集成¶
所有插件自动从项目根目录(或父目录)的 CCGO.toml 读取配置。
CCGO.toml 示例¶
[project]
name = "ccgonow"
version = "1.0.0"
repository = "https://github.com/zhlinh/ccgo-now"
[build]
cmake_version = "3.22.1"
[android]
compile_sdk = 34
min_sdk = 21
target_sdk = 34
ndk_version = "25.2.9519653"
build_tools = "34.0.0"
stl = "c++_shared"
default_archs = ["armeabi-v7a", "arm64-v8a", "x86_64"]
[publish.maven]
group_id = "com.mojeter.ccgo"
artifact_id = "ccgonow"
channel_desc = "beta"
dependencies = [
"androidx.core:core-ktx:1.12.0",
"org.jetbrains.kotlin:kotlin-stdlib:1.9.20"
]
[publish.kmp]
group_id = "com.mojeter.ccgo.kmp"
artifact_id = "ccgonow-kmp"
android_min_sdk = 24
ios_deployment_target = "14.0"
[[publish.kmp.dependencies]]
group = "org.jetbrains.kotlinx"
artifact = "kotlinx-coroutines-core"
version = "1.7.3"
插件读取的配置字段¶
| 字段 | 插件 | 用途 |
|---|---|---|
project.name |
全部 | 项目名称 |
project.version |
发布 | 版本号 |
project.repository |
发布 | Git 仓库 URL |
android.compile_sdk |
Android | 编译 SDK 版本 |
android.min_sdk |
Android | 最低 SDK 版本 |
android.target_sdk |
Android | 目标 SDK 版本 |
android.ndk_version |
原生 | NDK 版本 |
android.stl |
原生 | STL 类型(c++_shared/c++_static) |
android.default_archs |
原生 | 构建架构 |
build.cmake_version |
原生 | CMake 版本 |
publish.maven.group_id |
发布 | Maven group ID |
publish.maven.artifact_id |
发布 | Maven artifact ID |
publish.maven.dependencies |
发布 | POM 依赖 |
publish.kmp.* |
KMP | KMP 特定设置 |
设置和安装¶
1. 配置插件仓库¶
在 settings.gradle.kts 中:
pluginManagement {
repositories {
mavenCentral() // 已发布的版本
mavenLocal() // 本地开发
google()
gradlePluginPortal()
}
}
2. 声明插件版本¶
在 gradle/libs.versions.toml 中:
[versions]
ccgo-buildlogic = "1.0.0"
[plugins]
ccgo-android-library = { id = "com.mojeter.ccgo.gradle.android.library", version.ref = "ccgo-buildlogic" }
ccgo-android-library-native-python = { id = "com.mojeter.ccgo.gradle.android.library.native.python", version.ref = "ccgo-buildlogic" }
ccgo-android-publish = { id = "com.mojeter.ccgo.gradle.android.publish", version.ref = "ccgo-buildlogic" }
ccgo-kmp-library-native-python = { id = "com.mojeter.ccgo.gradle.kmp.library.native.python", version.ref = "ccgo-buildlogic" }
ccgo-kmp-publish = { id = "com.mojeter.ccgo.gradle.kmp.publish", version.ref = "ccgo-buildlogic" }
3. 应用插件¶
根 build.gradle.kts:
plugins {
alias(libs.plugins.ccgo.android.root) apply false
alias(libs.plugins.ccgo.android.library) apply false
alias(libs.plugins.ccgo.android.library.native.python) apply false
alias(libs.plugins.ccgo.android.publish) apply false
}
模块 build.gradle.kts:
plugins {
alias(libs.plugins.ccgo.android.library)
alias(libs.plugins.ccgo.android.library.native.python)
alias(libs.plugins.ccgo.android.publish)
}
android {
namespace = "com.mojeter.ccgo.example"
}
完整示例¶
示例 1:带原生代码的 Android 库(Python 构建)¶
项目结构:
myproject/
├── CCGO.toml # 项目配置
├── CMakeLists.txt # 原生构建(ccgo CLI 使用)
├── src/ # C++ 源代码
├── android/ # Android Gradle 项目
│ ├── settings.gradle.kts
│ ├── build.gradle.kts
│ ├── gradle/
│ │ └── libs.versions.toml
│ └── library/
│ ├── build.gradle.kts
│ └── src/main/
│ ├── AndroidManifest.xml
│ └── kotlin/... # Kotlin 包装器代码
android/library/build.gradle.kts:
plugins {
alias(libs.plugins.ccgo.android.library)
alias(libs.plugins.ccgo.android.library.native.python)
alias(libs.plugins.ccgo.android.publish)
}
android {
namespace = "com.mojeter.ccgo.myproject"
defaultConfig {
consumerProguardFiles("consumer-rules.pro")
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.kotlin.stdlib)
}
构建命令:
# 构建带原生库的 AAR
cd android
./gradlew assembleProdRelease
# 发布到 Maven Local
./gradlew publishToMavenLocal
# 发布到 Maven Central
./gradlew publishToMavenCentral
示例 2:使用 CMake 的 Android 库(无 CCGO CLI)¶
android/library/build.gradle.kts:
plugins {
alias(libs.plugins.ccgo.android.library)
alias(libs.plugins.ccgo.android.library.native.cmake)
alias(libs.plugins.ccgo.android.publish)
}
android {
namespace = "com.example.native"
externalNativeBuild {
cmake {
path = file("${rootDir.parentFile}/CMakeLists.txt")
}
}
}
示例 3:带原生代码的 Kotlin 多平台¶
kmp/build.gradle.kts:
plugins {
alias(libs.plugins.ccgo.kmp.library.native.python)
alias(libs.plugins.ccgo.kmp.publish)
}
kotlin {
androidTarget {
publishLibraryVariants("release")
}
iosX64()
iosArm64()
iosSimulatorArm64()
jvm()
sourceSets {
val commonMain by getting {
dependencies {
implementation(libs.kotlinx.coroutines.core)
}
}
val androidMain by getting {
dependencies {
implementation(libs.androidx.core.ktx)
}
}
}
}
android {
namespace = "com.mojeter.ccgo.kmp"
compileSdk = 34
}
示例 4:发布配置¶
在 ~/.gradle/gradle.properties 中配置凭据:
# Maven Central(从 https://central.sonatype.com/account 获取)
mavenCentralUsername=your-user-token-username
mavenCentralPassword=your-user-token-password
# 签名(内存 PGP 密钥)
signingInMemoryKey=-----BEGIN PGP PRIVATE KEY BLOCK-----\n...\n-----END PGP PRIVATE KEY BLOCK-----
signingInMemoryKeyPassword=your-key-password
# 自定义 Maven 仓库(可选)
mavenCustomUrls=https://maven.example.com/releases
mavenCustomUsernames=your-username
mavenCustomPasswords=your-password
# 本地 Maven 路径(可选,默认为 ~/.m2/repository)
mavenLocalPath=~/custom-maven-local
或使用环境变量(用于 CI/CD):
export MAVEN_CENTRAL_USERNAME=your-username
export MAVEN_CENTRAL_PASSWORD=your-password
export SIGNING_IN_MEMORY_KEY="$(cat signing-key.asc)"
export SIGNING_IN_MEMORY_KEY_PASSWORD=your-password
export MAVEN_CUSTOM_URLS=https://maven.example.com/releases
export MAVEN_CUSTOM_USERNAMES=your-username
export MAVEN_CUSTOM_PASSWORDS=your-password
./gradlew publishToMavenCentral
配置优先级¶
配置值按以下优先级顺序解析(从高到低):
- 环境变量 - CI/CD 覆盖
- CCGO.toml - 项目特定设置
- gradle.properties(项目级) - 项目默认值
- gradle.properties(用户级 ~/.gradle/) - 用户默认值
- 插件默认值 - 回退值
解析示例:
NDK 版本解析:
1. 检查 CCGO.toml:[android].ndk_version = "25.2.9519653" ✓(使用)
2. 检查 gradle.properties:ndkVersion=26.0.0(忽略)
3. 插件默认值:"25.2.9519653"(未到达)
结果:"25.2.9519653"
发布工作流程¶
本地开发¶
# 1. 本地构建和测试
./gradlew assembleProdRelease
./gradlew test
# 2. 发布到 Maven Local
./gradlew publishToMavenLocal
# 3. 在另一个项目中使用
// settings.gradle.kts
repositories {
mavenLocal()
}
// build.gradle.kts
dependencies {
implementation("com.mojeter.ccgo:myproject:1.0.0")
}
Maven Central 发布¶
# 1. 更新 CCGO.toml 中的版本
[project]
version = "1.0.0"
# 2. 构建和测试
./gradlew clean assembleProdRelease
./gradlew test
# 3. 发布到 Maven Central
./gradlew publishToMavenCentral
# 4. 在 https://central.sonatype.com 监控发布状态
自定义仓库¶
# 在 gradle.properties 或环境变量中配置
mavenCustomUrls=https://maven.example.com/releases
mavenCustomUsernames=deploy-user
mavenCustomPasswords=deploy-password
# 发布
./gradlew publishToMavenCustom
故障排除¶
问题:插件未找到¶
错误:
解决方案:
// settings.gradle.kts
pluginManagement {
repositories {
mavenCentral() // 添加这个!
google()
gradlePluginPortal()
}
}
问题:CCGO.toml 未找到¶
警告:
解决方案:
- 将 CCGO.toml 放在项目根目录(android/ 目录的父目录)
- 或在 Gradle 根项目上方最多 3 层
示例结构:
myproject/ ← CCGO.toml 在这里
├── CCGO.toml ← 或在这里
├── android/ ← Gradle 根目录
│ ├── CCGO.toml ← 或在这里
│ └── build.gradle.kts
问题:原生构建失败¶
错误:
解决方案:
# 安装 ccgo CLI
pip install ccgo
# 验证安装
which ccgo
ccgo --version
# 或使用 Rust CLI
cargo install --path ccgo-rs
问题:签名失败¶
错误:
解决方案:
- 确保 PGP 密钥具有正确的格式和换行符
- 转换转义的换行符:"...\n..." → 实际换行符
- 本地开发使用 GPG 代理(无需密钥)
GPG 代理设置(本地开发):
# 生成 GPG 密钥
gpg --full-generate-key
# 列出密钥(验证)
gpg --list-secret-keys
# 插件将自动检测并使用 GPG 代理
./gradlew publishToMavenLocal # 无需签名配置!
问题:NDK 未找到¶
错误:
解决方案:
# 选项 1:设置环境变量
export NDK_ROOT=/path/to/android-sdk/ndk/25.2.9519653
# 选项 2:在 local.properties 中配置
ndk.dir=/path/to/android-sdk/ndk/25.2.9519653
# 选项 3:让 Gradle 从 CCGO.toml 自动检测
[android]
ndk_version = "25.2.9519653" # 如果缺失,Gradle 会下载
最佳实践¶
1. 使用 CCGO.toml 进行配置¶
❌ 不要:在 build.gradle.kts 中硬编码
✅ 应该:在 CCGO.toml 中集中管理
2. 版本插件目录¶
✅ 应该:使用版本目录
[versions]
ccgo-buildlogic = "1.0.0"
[plugins]
ccgo-android-library = { id = "com.mojeter.ccgo.gradle.android.library", version.ref = "ccgo-buildlogic" }
3. 将发布与构建分离¶
✅ 应该:单独应用发布插件
// library/build.gradle.kts
plugins {
alias(libs.plugins.ccgo.android.library)
alias(libs.plugins.ccgo.android.library.native.python)
}
// publishing/build.gradle.kts(单独模块)
plugins {
alias(libs.plugins.ccgo.android.publish)
}
4. 对 CI/CD 使用环境变量¶
✅ 应该:对敏感凭据使用环境变量
# .github/workflows/publish.yml
env:
MAVEN_CENTRAL_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }}
MAVEN_CENTRAL_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }}
SIGNING_IN_MEMORY_KEY: ${{ secrets.SIGNING_KEY }}
SIGNING_IN_MEMORY_KEY_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}
steps:
- run: ./gradlew publishToMavenCentral
5. 发布前先本地测试¶
✅ 应该:发布前验证
# 1. 发布到 Maven Local
./gradlew publishToMavenLocal
# 2. 在示例项目中测试
cd sample-project
./gradlew build # 使用本地产物
# 3. 如果成功,发布到 Maven Central
cd ../
./gradlew publishToMavenCentral
迁移¶
从手动 Gradle 配置¶
之前(手动配置):
plugins {
id("com.android.library")
kotlin("android")
}
android {
compileSdk = 34
defaultConfig {
minSdk = 21
targetSdk = 34
externalNativeBuild {
cmake {
cppFlags += "-std=c++17"
arguments += "-DANDROID_STL=c++_shared"
}
}
}
}
publishing {
publications {
create<MavenPublication>("release") {
// 手动 POM 配置...
}
}
}
之后(使用 CCGO 插件):
plugins {
alias(libs.plugins.ccgo.android.library)
alias(libs.plugins.ccgo.android.library.native.python)
alias(libs.plugins.ccgo.android.publish)
}
android {
namespace = "com.example.lib"
// 所有设置来自 CCGO.toml!
}
从其他构建系统¶
从 Conan + CMake¶
详细说明请参见从 Conan 迁移指南。
从 vcpkg¶
使用 CCGO.toml 依赖替换 vcpkg 清单,并使用 CCGO Gradle 插件进行 Android 构建。
常见问题¶
Q: 可以不使用 CCGO.toml 而使用插件吗?¶
A:可以,插件将使用默认值。但建议使用 CCGO.toml 进行集中配置。
Q: 如何自定义 NDK/CMake 版本?¶
A:在 CCGO.toml 中配置:
Q: 可以同时发布到多个仓库吗?¶
A:可以,使用逗号分隔的 URL:
mavenCustomUrls=https://repo1.example.com,https://repo2.example.com
mavenCustomUsernames=user1,user2
mavenCustomPasswords=pass1,pass2
Q: 如何为 Maven Central 签名产物?¶
A:两个选项:
选项 1:内存 PGP 密钥(推荐用于 CI/CD)
signingInMemoryKey=-----BEGIN PGP PRIVATE KEY BLOCK-----\n...\n-----END PGP PRIVATE KEY BLOCK-----
signingInMemoryKeyPassword=your-password
选项 2:GPG 代理(推荐用于本地开发)
Q: 可以同时使用 Python 和 CMake 插件吗?¶
A:不可以,选择一个:
- Python 插件:使用 ccgo build android 进行构建(推荐)
- CMake 插件:直接 CMake 与 Android Gradle 插件集成
其他资源¶
更新日志¶
v1.0.0(2024-01-21)¶
- 初始发布,包含 20+ 个约定插件
- CCGO.toml 集成
- Maven Central 发布支持
- Android 和 KMP 支持
本文档是 CCGO 项目的一部分。有关贡献指南,请参见 CONTRIBUTING.md。