This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Android CI | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
branches: | |
- main | |
jobs: | |
build: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Set up JDK 17 | |
uses: actions/setup-java@v4 | |
with: | |
java-version: '17' | |
distribution: 'temurin' | |
- name: Cache Gradle packages | |
uses: actions/cache@v4 | |
with: | |
path: | | |
~/.gradle/caches | |
~/.gradle/wrapper | |
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
restore-keys: | | |
${{ runner.os }}-gradle- | |
- name: Set up Android SDK | |
uses: android-actions/setup-android@v3 | |
- name: Generate signing key | |
run: | | |
keytool -genkey -v \ | |
-keystore my-release-key.keystore \ | |
-alias my-key-alias \ | |
-keyalg RSA \ | |
-keysize 2048 \ | |
-validity 10000 \ | |
-storepass password \ | |
-keypass password \ | |
-dname "CN=Android, OU=Android, O=Android, L=Unknown, ST=Unknown, C=US" | |
- name: Configure signing | |
run: | | |
# 创建临时签名配置脚本 | |
cat << EOF > signing-config.gradle | |
android { | |
signingConfigs { | |
release { | |
storeFile file('my-release-key.keystore') | |
storePassword 'password' | |
keyAlias 'my-key-alias' | |
keyPassword 'password' | |
} | |
} | |
buildTypes { | |
release { | |
signingConfig signingConfigs.release | |
} | |
} | |
} | |
EOF | |
- name: Build signed APK | |
run: | | |
# 应用签名配置并构建 | |
./gradlew -Psigning-config.gradle assembleRelease | |
ls -l app/build/outputs/apk/release | |
- name: Verify APK signature | |
run: | | |
# 设置apksigner路径 | |
BUILD_TOOLS_DIR=$(ls $ANDROID_HOME/build-tools | sort -V | tail -n 1) | |
APKSIGNER="$ANDROID_HOME/build-tools/$BUILD_TOOLS_DIR/apksigner" | |
# 查找已签名的APK(排除未签名文件) | |
apk_path=$(find app/build/outputs/apk/release -name "*.apk" ! -name "*-unsigned*" | head -n 1) | |
if [ ! -f "$apk_path" ]; then | |
echo "❌ Signed APK not found!" | |
find app/build/outputs/apk/release -type f | |
exit 1 | |
fi | |
echo "Verifying signed APK at: $apk_path" | |
$APKSIGNER verify --verbose "$apk_path" | |
echo "✅ APK verification successful" | |
- name: Upload signed APK | |
uses: actions/upload-artifact@v4 | |
with: | |
name: app-release-signed.apk | |
path: app/build/outputs/apk/release/*-release.apk |