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 仅对必要分支/环境开放 |