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

1. 创建签名密钥

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

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

参数说明:

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

创建后可验证

bash 复制代码
keytool -list -v -keystore 文件名.jks -alias 密钥别名

2. 项目配置

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

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

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

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

scss 复制代码
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 文件中添加:

bash 复制代码
# 安卓签名密钥
android/key.properties
*.jks
*.keystore

3. 配置 GitHub Secrets

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

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

Linux/macOS:

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

Windows (PowerShell):

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

验证编码结果(可选):

bash 复制代码
# 检查文件大小是否匹配
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_PASSWORDKEYSTORE_PASSWORD 就是同一个密码

4. GitHub Actions 工作流配置

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

yaml 复制代码
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 仅对必要分支/环境开放
相关推荐
今夕资源网18 分钟前
一只鹈鹕骑着单车闯海岛:开源 3D 网页游戏《鹈鹕骑车》体验与部署教程 github开源
开源·github·ai智能测试题·ai智能测试
沙蒿同学2 小时前
我把架构约定编译成了会变红的测试:Wails v2 + Go + Vue3 桌面脚手架实战
前端·后端·github
落魄大学生之流水线上谋生计3 小时前
幻境相机 Mirage Camera
github
wangruofeng3 小时前
从一个 10 万星 AI Agent 项目里,能学到什么真正的软件工程
github·agent·ai编程
子林super3 小时前
复杂JSON Schema结构与输出校验
github
子林super3 小时前
结构化输出解析失败处理策略
github
怕浪猫4 小时前
拆解 Google《AI Agent Handbook》:企业级 Agent 的六层架构与产品矩阵
面试·github·agent
kali-Myon4 小时前
分享一个网络安全 AI 工具导航项目 SecSkills
安全·ai·github·ctf
峰向AI14 小时前
Kage: 一个 244KB 文件,做出百万级视觉效果
github
m4Rk_18 小时前
【论文阅读】Agent 记忆机制(74):CompassMem——从相似度检索走向事件图上的记忆导航
论文阅读·人工智能·学习·开源·github