创建签名密钥库和配置CICD签名

5 阅读2分钟

1. 创建签名密钥

在终端执行以下命令生成密钥库文件:

keytool -genkey -v -keystore 文件名.jks -keyalg RSA -keysize 2048 -validity 10000 -alias 密钥别名

参数说明:

  • -keystore: 密钥库文件存储路径(建议放在项目根目录之外)
  • -alias: 后面写密钥别名
  • 按提示设置密码并填写证书信息
  • RSA是加密算法

创建后可验证

keytool -list -v -keystore 文件名.jks -alias 密钥别名

2. 项目配置

步骤1:创建密钥属性文件

在 android/ 目录下创建 key.properties 文件:

storePassword=你的密钥库密码
keyPassword=你的密钥密码
keyAlias=upload
storeFile=/path/to/upload-keystore.jks  # 使用绝对路径或相对路径
步骤2:配置build.gradle

修改 android/app/build.gradle 文件:

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')

if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
    // ... 其他配置
    
    signingConfigs {
        release {
            if (keystorePropertiesFile.exists()) {
                keyAlias keystoreProperties['keyAlias']
                keyPassword keystoreProperties['keyPassword']
                storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
                storePassword keystoreProperties['storePassword']
            }
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
            // ... 其他配置
        }
        
        // 为开发者提供调试配置
        debug {
            signingConfig signingConfigs.debug
        }
    }
}
步骤3:git 忽略

在 .gitignore 文件中添加:

# 安卓签名密钥
android/key.properties
*.jks
*.keystore

3. 配置 GitHub Secrets

我来详细说明如何将 .jks 文件转换为 GitHub Actions 可用的 KEYSTORE_FILE 格式。

步骤1:将 .jks 转为 Base64 字符串

Linux/macOS:

base64 -i 文件名.jks | pbcopy  # 直接复制到剪贴板
# 或输出到文件
base64 -i 文件名.jks > keystore_base64.txt

Windows (PowerShell):

[Convert]::ToBase64String([IO.File]::ReadAllBytes("文件名.jks")) | Set-Clipboard

验证编码结果(可选):

# 检查文件大小是否匹配
cat keystore_base64.txt | base64 -d | wc -c
ls -la 文件名.jks
# 两个数字应该一致
步骤2:配置 GitHub Secrets

进入你的 GitHub 仓库 → Settings → Secrets and variables → Actions → New repository secret

Secret 名称
KEYSTORE_FILE上面生成的 Base64 字符串
KEYSTORE_PASSWORD你的密钥库密码
KEY_ALIAS密钥别名
KEY_PASSWORD你的密钥密码

一般来说 KEY_PASSWORD 跟 KEYSTORE_PASSWORD 就是同一个密码

4. GitHub Actions 工作流配置

创建 .github/workflows/android-release.yml

name: Android Release Build

on:
  push:
    branches: [main, release/*]
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
      # 1. 检出代码
      - uses: actions/checkout@v4
      
      # 2. 设置 JDK
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      
      # 3. 解码还原 keystore 文件(关键步骤!)
      - name: Decode Keystore
        run: |
          mkdir -p ~/.android
          echo "${{ secrets.KEYSTORE_FILE }}" | base64 -d > ~/.android/release.jks
          ls -la ~/.android/release.jks  # 验证文件存在
      
      # 4. 构建签名 APK
      - name: Build Signed APK
        env:
          KEYSTORE_PATH: ~/.android/release.jks
          KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
          KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
          KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
        run: |
          ./gradlew assembleRelease \
            -Pandroid.injected.signing.store.file=$KEYSTORE_PATH \
            -Pandroid.injected.signing.store.password=$KEYSTORE_PASSWORD \
            -Pandroid.injected.signing.key.alias=$KEY_ALIAS \
            -Pandroid.injected.signing.key.password=$KEY_PASSWORD
      
      # 5. 上传构建产物
      - name: Upload APK
        uses: actions/upload-artifact@v4
        with:
          name: release-apk
          path: app/build/outputs/apk/release/*.apk

5. 安全注意事项

风险防护措施
Base64 字符串泄露务必存入 GitHub Secrets,绝不硬编码
日志泄露使用 ::add-mask:: 或避免打印密钥
密钥文件残留使用 GitHub Actions 临时环境,每次销毁
权限过大Secrets 仅对必要分支/环境开放