跳转至

第10章 部署流程与持续集成

部署流程与持续集成图

学习目标:掌握Android应用发布流程,建立CI/CD管道。

预计学习时间:3-5天 实践时间:1-2天


目录

  1. 应用签名与打包
  2. Play Store发布
  3. CI/CD管道搭建
  4. 版本管理
  5. 应用监控
  6. 实践练习

1. 应用签名与打包

1.1 签名配置

Kotlin
// build.gradle.kts (App Module)
android {
    signingConfigs {
        create("release") {
            storeFile = file("my-release-key.jks")
            storePassword = System.getenv("STORE_PASSWORD")
            keyAlias = "my-alias"
            keyPassword = System.getenv("KEY_PASSWORD")
        }
    }

    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
            signingConfig = signingConfigs.getByName("release")
        }
    }
}

1.2 密钥管理

Bash
# 生成签名密钥
keytool -genkey -v \
    -keystore my-release-key.jks \
    -keyalg RSA \
    -keysize 2048 \
    -validity 10000 \
    -alias my-alias

# 查看密钥信息
keytool -list -v -keystore my-release-key.jks

# 提取证书指纹(用于Google Play)
keytool -exportcert -alias my-alias -keystore my-release-key.jks | openssl sha1 -binary | openssl base64  # |管道:将前一命令的输出作为后一命令的输入

1.3 打包命令

Bash
# 构建Release APK
./gradlew assembleRelease

# 构建Release Bundle (推荐)
./gradlew bundleRelease

# 构建并安装Debug版本
./gradlew installDebug

# 清理并构建
./gradlew clean assembleRelease

2. Play Store发布

2.1 Google Play Console

  1. 创建开发者账号
  2. 访问 https://play.google.com/console
  3. 支付$25注册费
  4. 完成账号验证

  5. 创建应用

  6. 填写应用名称
  7. 选择默认语言
  8. 选择应用类型

  9. 配置应用信息

  10. 应用描述
  11. 截图和图标
  12. 隐私政策

2.2 发布配置

Kotlin
// build.gradle.kts
android {
    defaultConfig {
        applicationId = "com.example.myapp"
        versionCode = 1
        versionName = "1.0.0"

        // 目标SDK必须是最新稳定版
        targetSdk = 35
    }
}

// 版本号管理脚本
// version.gradle.kts
object AppVersion {
    const val major = 1
    const val minor = 0
    const val patch = 0

    const val versionCode = major * 10000 + minor * 100 + patch
    const val versionName = "$major.$minor.$patch"
}

2.3 发布流程

Text Only
1. 内部测试 -> 2. 封闭测试 -> 3. 开放式测试 -> 4. 正式版

3. CI/CD管道搭建

3.1 GitHub Actions配置

YAML
# .github/workflows/android.yml
name: Android CI

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'
        cache: gradle

    - name: Grant execute permission for gradlew
      run: chmod +x gradlew

    - name: Run unit tests
      run: ./gradlew testDebugUnitTest

    - name: Generate test report
      uses: asadmansr/android-test-report-action@v1.2.0
      if: always()

  build:
    runs-on: ubuntu-latest
    needs: test

    steps:
    - uses: actions/checkout@v4

    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'
        cache: gradle

    - name: Build APK
      run: ./gradlew assembleDebug

    - name: Upload APK
      uses: actions/upload-artifact@v3
      with:
        name: app-debug
        path: app/build/outputs/apk/debug/*.apk

  release:
    runs-on: ubuntu-latest
    needs: [test, build]
    if: github.ref == 'refs/heads/main'

    steps:
    - uses: actions/checkout@v4

    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'
        cache: gradle

    - name: Decode keystore
      run: |
        echo "${{ secrets.KEYSTORE }}" | base64 -d > my-release-key.jks

    - name: Build Release Bundle
      run: ./gradlew bundleRelease
      env:
        STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
        KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}

    - name: Upload to Play Store
      uses: r0adkll/upload-google-play@v1
      with:
        serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
        packageName: com.example.myapp
        releaseFiles: app/build/outputs/bundle/release/*.aab
        track: internal

3.2 自动化版本管理

YAML
# .github/workflows/version-bump.yml
name: Version Bump

on:
  workflow_dispatch:
    inputs:
      versionType:
        description: 'Version type'
        required: true
        default: 'patch'
        type: choice
        options:
          - patch
          - minor
          - major

jobs:
  bump-version:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
      with:
        token: ${{ secrets.GITHUB_TOKEN }}

    - name: Bump version
      run: |
        ./gradlew bumpVersion -PversionType=${{ github.event.inputs.versionType }}

    - name: Commit changes
      run: |
        git config --local user.email "action@github.com"
        git config --local user.name "GitHub Action"
        git add .
        git commit -m "Bump version to $(cat version.txt)"
        git push

4. 版本管理

4.1 语义化版本

Text Only
版本格式:主版本号.次版本号.修订号(MAJOR.MINOR.PATCH)

MAJOR:不兼容的API修改
MINOR:向下兼容的功能新增
PATCH:向下兼容的问题修正

示例:
1.0.0 -> 初始发布
1.1.0 -> 新增功能
1.1.1 -> Bug修复
2.0.0 -> 重大更新(可能不兼容)

4.2 Git工作流

Text Only
main: 生产分支,只能合并,不能直接提交
develop: 开发分支,功能分支合并目标
feature/*: 功能分支,从develop创建
release/*: 发布分支,从develop创建
hotfix/*: 热修复分支,从main创建
Bash
# 功能开发流程
git checkout develop
git pull origin develop
git checkout -b feature/new-feature
# 开发...
git commit -m "Add new feature"
git push origin feature/new-feature
# 创建PR合并到develop

# 发布流程
git checkout develop
git checkout -b release/1.1.0
# 版本号更新、最后测试...
git checkout main
git merge release/1.1.0
git tag -a v1.1.0 -m "Release version 1.1.0"
git push origin main --tags

5. 应用监控

5.1 Firebase Crashlytics

Kotlin
// build.gradle.kts (Project)
plugins {
    id("com.google.gms.google-services") version "4.4.0" apply false
    id("com.google.firebase.crashlytics") version "2.9.9" apply false
}

// build.gradle.kts (App)
plugins {
    id("com.google.gms.google-services")
    id("com.google.firebase.crashlytics")
}

dependencies {
    implementation(platform("com.google.firebase:firebase-bom:32.6.0"))
    implementation("com.google.firebase:firebase-crashlytics-ktx")
    implementation("com.google.firebase:firebase-analytics-ktx")
}
Kotlin
// 自定义崩溃报告
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        // 配置Crashlytics
        FirebaseCrashlytics.getInstance().apply {
            setCustomKey("app_version", BuildConfig.VERSION_NAME)
            setCustomKey("device_model", Build.MODEL)
            setUserId(userId)
        }
    }
}

// 记录非致命异常
try {  // try/catch捕获异常
    riskyOperation()
} catch (e: Exception) {
    FirebaseCrashlytics.getInstance().recordException(e)
}

5.2 性能监控

Kotlin
// Firebase Performance
dependencies {
    implementation("com.google.firebase:firebase-perf-ktx")
}

// 自定义跟踪
val trace = FirebasePerformance.getInstance().newTrace("load_data")
trace.start()

// 加载数据...

trace.stop()

// HTTP监控
val httpTrace = FirebasePerformance.getInstance()
    .newHttpMetric(url, FirebasePerformance.HttpMethod.GET)
httpTrace.start()

// 执行请求...

httpTrace.setHttpResponseCode(responseCode)
httpTrace.stop()

6. 实践练习

练习1:完整CI/CD管道

任务:为项目搭建完整的CI/CD管道

要求: 1. 配置GitHub Actions 2. 自动运行测试 3. 自动构建Release包 4. 配置Play Store自动部署

练习2:版本发布流程

任务:完成一次完整的版本发布

要求: 1. 使用Git Flow工作流 2. 更新版本号和CHANGELOG 3. 创建Release分支 4. 打标签并发布


本章小结

核心要点

  1. 应用签名是发布的前提,妥善保管密钥
  2. Play Store是主要发布渠道,支持多种测试轨道
  3. CI/CD自动化构建、测试和部署流程
  4. 语义化版本清晰传达版本变更
  5. 应用监控及时发现和解决问题

发布检查清单

  • 版本号已更新
  • 签名密钥已配置
  • 所有测试通过
  • ProGuard/R8配置正确
  • 隐私政策已更新
  • 应用截图和描述已更新
  • CHANGELOG已更新
  • 崩溃监控已配置

教程总结

恭喜你完成了本教程的全部内容!你已经掌握了:

  1. ✅ 现代Android开发框架(Kotlin + Compose + MVVM)
  2. ✅ VS Code开发环境配置
  3. ✅ Kotlin语言核心特性
  4. ✅ Jetpack Compose UI开发
  5. ✅ MVVM架构与组件交互
  6. ✅ 数据处理与API集成
  7. ✅ 状态管理与性能优化
  8. ✅ AI辅助开发集成
  9. ✅ 测试策略与质量保证
  10. ✅ 部署流程与持续集成

下一步建议

  1. 完成实践案例:动手实现教程中的示例项目
  2. 阅读官方文档:深入学习Android官方文档
  3. 参与开源项目:贡献代码,学习最佳实践
  4. 持续学习:关注Android技术动态

推荐资源


本章完成时间:预计3-5天