一个基于 Jetpack Compose 的现代 Android 应用示例项目,演示如何使用 云原生构建(CNB) 进行自动化构建和打包。
本项目是一个现代化的 Android 应用示例,使用 Kotlin 语言和 Jetpack Compose UI 框架开发。它展示了如何使用云原生构建(CNB)平台进行持续集成和自动化构建,实现了从源码到 APK 的完整构建流程。
| 库名称 | 版本 | 说明 |
|---|---|---|
| androidx.core:core-ktx | 1.10.1 | Android 核心库 KTX 扩展 |
| androidx.lifecycle:lifecycle-runtime-ktx | 2.6.1 | 生命周期运行时 |
| androidx.activity:activity-compose | 1.8.0 | Compose Activity 支持 |
| androidx.compose:compose-bom | 2024.04.01 | Compose 材料清单 |
| androidx.compose.ui:ui | - | Compose UI 基础库 |
| androidx.compose.material3 | - | Material Design 3 组件 |
| junit | 5.0-SNAPSHOT | 单元测试框架 |
| androidx.test.espresso:espresso-core | 3.5.1 | UI 测试框架 |
完整的依赖信息请参考 gradle/libs.versions.toml。
# 克隆项目
git clone https://cnb.cool/examples/ecosystem/android-demo.git
cd android-demo
# 给 gradlew 添加执行权限(Linux/macOS)
chmod +x gradlew
# 使用云原生构建初始化项目
cnb-init-from https://cnb.cool/examples/ecosystem/android-demo.git
# 清理旧的构建
./gradlew clean
# 构建调试版本
./gradlew assembleDebug
# 构建发布版本
./gradlew assembleRelease
# 运行测试
./gradlew test
构建产物位置:
app/build/outputs/apk/debug/app-debug.apkapp/build/outputs/apk/release/app-release.apk在项目根目录创建 .cnb.yml 文件:
master:
push:
- docker:
# 可以在 hub.docker.com 上找需要的 android sdk 版本的 docker 镜像
# https://hub.docker.com/r/mobiledevops/android-sdk-image
# https://github.com/docker-android-sdk
# 当这些都不满足您的需求时,您可以制作自己的 docker 镜像安装您需要的 sdk 版本和工具
image: mobiledevops/android-sdk-image:34.0.1
volumes:
- /root/.gradle:cow
stages:
- name: android-build
script: ./gradlew build
- name: "ls"
script: ls ./app/build/outputs/apk/release
编辑 app/build.gradle.kts 文件:
defaultConfig {
applicationId = "com.example.android_demo" // 修改为您的包名
versionCode = 1 // 版本号
versionName = "1.0" // 版本名称
minSdk = 24 // 最低 SDK 版本
targetSdk = 34 // 目标 SDK 版本
}
发布版本需要配置签名信息,在 app/build.gradle.kts 中:
signingConfigs {
create("release") {
storeFile = file("your-keystore.jks")
storePassword = "your-store-password"
keyAlias = "your-key-alias"
keyPassword = "your-key-password"
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
在 gradle.properties 文件中可以配置以下选项:
# Android 构建选项 android.useAndroidX=true android.enableJetifier=true # 构建性能优化 org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.caching=true org.gradle.daemon=true
在 app/proguard-rules.pro 文件中自定义混淆规则:
# 保持类成员不被混淆 -keepclassmembers class * { public <init>(...); } # 保留特定类 -keep class com.example.android_demo.** { *; }
android-demo/ ├── .cnb.yml # 云原生构建配置文件 ├── .gitignore # Git 忽略文件配置 ├── build.gradle.kts # 项目级构建脚本 ├── gradle.properties # Gradle 属性配置 ├── settings.gradle.kts # Gradle 设置文件 ├── gradlew # Gradle 包装器(Unix) ├── gradlew.bat # Gradle 包装器(Windows) ├── LICENSE.txt # MIT 许可证文件 ├── README.md # 项目说明文档 ├── app/ # 应用模块 │ ├── build.gradle.kts # 应用模块构建脚本 │ ├── proguard-rules.pro # ProGuard 混淆规则 │ └── src/ │ ├── main/ │ │ ├── AndroidManifest.xml # 应用清单文件 │ │ ├── java/com/example/android_demo/ │ │ │ ├── MainActivity.kt # 主 Activity │ │ │ └── ui/theme/ # UI 主题配置 │ │ │ ├── Color.kt # 颜色定义 │ │ │ ├── Theme.kt # 主题配置 │ │ │ └── Type.kt # 字体样式 │ │ └── res/ # 资源文件 │ │ ├── drawable/ # 可绘制资源 │ │ └── mipmap-*/ # 应用图标 │ ├── test/ # 单元测试 │ └── androidTest/ # Android UI 测试 └── gradle/ # Gradle 配置 ├── libs.versions.toml # 依赖版本管理 └── wrapper/ # Gradle 包装器 JAR
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
AndroidDemoTheme {
// Surface 容器使用 'background' 颜色
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Greeting("Android")
}
}
}
}
}
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Hello $name!",
modifier = modifier
)
}
@Composable
fun AndroidDemoTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit
) {
val colorScheme = when {
darkTheme -> DarkColorScheme
else -> LightColorScheme
}
MaterialTheme(
colorScheme = colorScheme,
typography = Typography,
content = content
)
}
master:
push:
- docker:
image: mobiledevops/android-sdk-image:34.0.1
volumes:
- /root/.gradle:cow # 启用构建缓存
stages:
- name: clean
script: ./gradlew clean
- name: build
script: ./gradlew assembleRelease
- name: test
script: ./gradlew test
- name: upload
script: ls ./app/build/outputs/apk/release
A: 在 gradle.properties 中增加堆内存:
org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=512m
A: 修改 .cnb.yml 中的 Docker 镜像版本:
image: mobiledevops/android-sdk-image:33.0.2 # 改为所需版本
A: 确保 .cnb.yml 中配置了 volumes:
volumes:
- /root/.gradle:cow # cow = Copy On Write,启用缓存
A: 替换 app/src/main/res/mipmap-*/ 目录下的图标文件:
ic_launcher.webp - 应用图标ic_launcher_round.webp - 圆形图标A: 在 gradle/libs.versions.toml 中添加:
[versions]
yourLibrary = "1.2.3"
[libraries]
your-library = { group = "com.example", name = "library", version.ref = "yourLibrary" }
然后在 app/build.gradle.kts 中使用:
dependencies { implementation(libs.your.library) }
A: 完全支持。使用 Android Studio 打开项目,它会自动检测 Gradle 配置并进行同步。建议使用 Android Studio Hedgehog (2023.1.1) 或更高版本以获得最佳体验。
我们欢迎任何形式的贡献!如果您想为项目做出贡献,请遵循以下步骤:
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)请遵循 Conventional Commits 规范:
feat: 添加新功能 fix: 修复 bug docs: 文档更新 style: 代码格式调整 refactor: 重构代码 test: 添加测试 chore: 构建/工具链更新
本项目采用 MIT 许可证 - 详见 LICENSE.txt 文件。
The MIT License (MIT) Copyright (c) 2024-present, cnb.cool Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
注意: 本项目主要用于演示云原生构建在 Android 项目中的应用。如果您在生产环境中使用,请根据实际需求调整配置。