创建签名密钥库和配置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 仅对必要分支/环境开放
相关推荐
wangruofeng5 小时前
8 小时 10000 星,xAI 把内部编码 Agent 开源了:Grok Build 的架构拆解
开源·github·aigc
胡萝卜术5 小时前
RAG 的知识炼油厂:从原始网页到可检索知识块的工程化之路
面试·架构·github
GoGeekBaird5 小时前
我用 BeeWeave 跑完了一次完整写作闭环
后端·github
wangruofeng6 小时前
2026 年 7 月 GitHub 趋势观察:Skills 生态爆发,744B MoE 跑进消费级机器
github·aigc·ai编程
风向决定发型d78210 小时前
Github Copilot 新手极速上手指南
人工智能·github·copilot
有想法的py工程师11 小时前
GPG 密钥迁移指南:多私钥备份、批量导入与自动信任
git·github
OpenTiny社区12 小时前
WebSkill - Agentic Web 面向 SaaS (Skill as a Service) 的进化
github·agent
举个栗子。14 小时前
Skill Store github 压缩包
ai·github·skills
半夜修仙14 小时前
RabbitMQ的推模式和拉模式
java·分布式·中间件·rabbitmq·github·java-rabbitmq
秋天的一阵风15 小时前
✨ 原来文本转换可以这么丝滑!UnifiedJS 实战指南来了
前端·github·markdown