Skip to content

chore: 删除无效残留 commonMain/TextSelectionColors.kt #1

chore: 删除无效残留 commonMain/TextSelectionColors.kt

chore: 删除无效残留 commonMain/TextSelectionColors.kt #1

Workflow file for this run

name: Android Release
# 打 Tag(如 v1.0.0)时触发:构建三个签名 Release APK
# - universal : arm64-v8a + x86_64,含 arm + x86 两套容器镜像(通用,体积最大)
# - armsolo : 仅 arm64-v8a,仅含 arm 镜像(真机首选,体积约为 universal 的一半)
# - x86solo : 仅 x86_64,仅含 x86 镜像(x86 模拟器/Chromebook,体积约为 universal 的一半)
# 创建 GitHub Release 并把三个 APK 作为资产发布。
on:
push:
tags:
- 'v*'
# 允许在 Actions 页面手动触发,便于验证构建链路。
workflow_dispatch:
jobs:
build:
name: Build & Release
runs-on: ubuntu-latest
permissions:
contents: write # 创建 Release 与上传资产需要写权限
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- name: Set up Gradle
uses: gradle/actions/setup-gradle@v4
with:
# 复用 Gradle 构建缓存,加速后续构建。
cache-read-only: ${{ github.ref != 'refs/heads/main' }}
- name: Restore release keystore
env:
# keystore 文件以 base64 存入 Secret,避免二进制文件被破坏。
# 还原到 app/aicode.jks,与 build.gradle.kts 期望的位置一致。
KEYSTORE_BASE64: ${{ secrets.AICODE_KEYSTORE_BASE64 }}
run: |
echo "$KEYSTORE_BASE64" | base64 -d > app/aicode.jks
echo "keystore restored ($(stat -c%s app/aicode.jks) bytes)"
- name: Generate keystore.properties
env:
KEYSTORE_PASSWORD: ${{ secrets.AICODE_KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.AICODE_KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.AICODE_KEY_PASSWORD }}
run: |
cat > app/keystore.properties <<EOF
storeFile=aicode.jks
storePassword=$KEYSTORE_PASSWORD
keyAlias=$KEY_ALIAS
keyPassword=$KEY_PASSWORD
EOF
echo "app/keystore.properties generated"
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
# 一次性构建全部 flavor 的 release APK(universal/armsolo/x86solo)
- name: Build all flavor Release APKs
run: ./gradlew assembleRelease
# 给三个 APK 加上更可读的文件名,便于用户在 Release 页区分架构。
- name: Rename APKs by flavor
run: |
mkdir -p dist
for f in universal armsolo x86solo; do
src="app/build/outputs/apk/$f/release/app-$f-release.apk"
if [[ -f "$src" ]]; then
cp "$src" "dist/aicode-${GITHUB_REF_NAME:-manual}-${f}.apk"
echo "packaged dist/aicode-${GITHUB_REF_NAME:-manual}-${f}.apk"
else
echo "::warning::missing $src"
fi
done
ls -lh dist/
- name: Verify signed APKs
# 用 build-tools 自带 apksigner 逐个校验签名;任一未签名仅告警不阻断。
uses: r0adillll/check-signed-apk-action@v1
with:
apkPath: app/build/outputs/apk/universal/release/app-universal-release.apk
continue-on-error: true
- name: Determine release name
id: release
run: |
# 手动触发(无 tag)时用 run id 作为临时名,避免破坏 tag 发布。
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
echo "tag=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
else
echo "tag=manual-${GITHUB_RUN_NUMBER}" >> "$GITHUB_OUTPUT"
fi
- name: Create GitHub Release & Upload assets
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.release.outputs.tag }}
name: Release ${{ steps.release.outputs.tag }}
generate_release_notes: true
files: |
dist/aicode-*-universal.apk
dist/aicode-*-armsolo.apk
dist/aicode-*-x86solo.apk
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}