From 3cf9e2c256247eba098bf7f6d1fe0f0ff61653d1 Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 16:03:14 +0800 Subject: [PATCH 01/18] Simplify Android build workflow and integrate Fastlane Refactor Android build workflow to simplify configuration and add Fastlane for APK and AAB builds. --- .github/workflows/main.yml | 158 ++++++++++++++++++++++++++----------- 1 file changed, 110 insertions(+), 48 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 643d8abdb..0dbb2c95b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -89,17 +89,10 @@ jobs: name: Build (Android) runs-on: ubuntu-latest if: ${{ github.event_name == 'push' }} - strategy: - fail-fast: false - matrix: - configuration: [Release] - platform: [Android] - channel: [foss, play] - env: - CONFIGURATION: ${{ matrix.configuration }} - TARGET_PLATFORM: ${{ matrix.platform }} - TARGET_CHANNEL: ${{ matrix.channel }} + CONFIGURATION: Release + TARGET_PLATFORM: Android + UNITY_PROJECT_EXPORT_PATH: Release/Android steps: - name: Checkout the repository @@ -120,7 +113,7 @@ jobs: COMMIT_COUNT=$(git rev-list HEAD --count) COUNT=$((COMMIT_COUNT + 100000)) echo "BUNDLE_VERSION_CODE=$COUNT" >> $GITHUB_ENV - echo "BUNDLE_VERSION_CODE_FOR_APK=$COMMIT_COUNT" >> $GITHUB_ENV + echo "BUNDLE_VERSION_CODE_FOR_APK=$COUNT" >> $GITHUB_ENV echo "Android AAB version code: $COUNT" echo "Android APK version code: $COMMIT_COUNT" @@ -132,76 +125,145 @@ jobs: restore-keys: | Library-${{ runner.os }}-${{ env.TARGET_PLATFORM }}- - - name: Build APKs Release - if: ${{ env.TARGET_CHANNEL == 'foss' }} - uses: game-ci/unity-builder@v4 + - name: Setup Java & Gradle Cache + uses: actions/setup-java@v4 with: - unityVersion: ${{ env.UNITY_VERSION }} - targetPlatform: ${{ env.TARGET_PLATFORM }} - versioning: Custom - version: ${{ env.BUNDLE_VERSION_WITH_HASH }} - androidVersionCode: ${{ env.BUNDLE_VERSION_CODE_FOR_APK }} - buildName: MajdataPlay - buildsPath: ${{ env.CONFIGURATION }} - androidTargetSdkVersion: 29 - androidKeystoreName: android-publish.keystore - androidKeystoreBase64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} - androidKeystorePass: ${{ secrets.ANDROID_KEYSTORE_PASS }} - androidKeyaliasName: ${{ secrets.ANDROID_KEYALIAS_NAME }} - androidKeyaliasPass: ${{ secrets.ANDROID_KEYALIAS_PASS }} - - - name: Build AAB Release - if: ${{ env.TARGET_CHANNEL == 'play' }} + distribution: 'zulu' + java-version: '17' + cache: 'gradle' + + - name: Setup Ruby and Fastlane + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + + - name: Install Fastlane + run: gem install fastlane + + - name: Export Android Project uses: game-ci/unity-builder@v4 with: unityVersion: ${{ env.UNITY_VERSION }} targetPlatform: ${{ env.TARGET_PLATFORM }} versioning: Custom version: ${{ env.BUNDLE_VERSION_WITH_HASH }} - androidVersionCode: ${{ env.BUNDLE_VERSION_CODE }} buildName: MajdataPlay buildsPath: ${{ env.CONFIGURATION }} - androidExportType: androidAppBundle - androidTargetSdkVersion: 36 - androidKeystoreName: android-publish.keystore - androidKeystoreBase64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} - androidKeystorePass: ${{ secrets.ANDROID_KEYSTORE_PASS }} - androidKeyaliasName: ${{ secrets.ANDROID_KEYALIAS_NAME }} - androidKeyaliasPass: ${{ secrets.ANDROID_KEYALIAS_PASS }} + androidExportType: androidStudioProject + + - name: Prepare Keystore + run: | + echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 --decode > android-publish.keystore + echo "KEYSTORE_PATH=$(pwd)/android-publish.keystore" >> $GITHUB_ENV + + - name: Create Fastfile + run: | + cat << 'EOF' > Fastfile + default_platform(:android) + + platform :android do + desc "Build FOSS version (APK)" + lane :build_foss do + gradle( + project_dir: ENV['UNITY_PROJECT_EXPORT_PATH'], + task: "assemble", + build_type: "Release", + flags: "--build-cache", + properties: { + "android.injected.versionCode" => ENV['BUNDLE_VERSION_CODE_FOR_APK'], + "android.injected.versionName" => ENV['BUNDLE_VERSION_WITH_HASH'], + "android.injected.signing.store.file" => ENV['KEYSTORE_PATH'], + "android.injected.signing.store.password" => ENV['ANDROID_KEYSTORE_PASS'], + "android.injected.signing.key.alias" => ENV['ANDROID_KEYALIAS_NAME'], + "android.injected.signing.key.password" => ENV['ANDROID_KEYALIAS_PASS'] + } + ) + end + + desc "Build Play version (AAB)" + lane :build_play do + gradle( + project_dir: ENV['UNITY_PROJECT_EXPORT_PATH'], + task: "bundle", + build_type: "Release", + flags: "--build-cache", + properties: { + "android.injected.versionCode" => ENV['BUNDLE_VERSION_CODE'], + "android.injected.versionName" => ENV['BUNDLE_VERSION_WITH_HASH'], + "android.injected.signing.store.file" => ENV['KEYSTORE_PATH'], + "android.injected.signing.store.password" => ENV['ANDROID_KEYSTORE_PASS'], + "android.injected.signing.key.alias" => ENV['ANDROID_KEYALIAS_NAME'], + "android.injected.signing.key.password" => ENV['ANDROID_KEYALIAS_PASS'] + } + ) + end + end + EOF + + - name: Build FOSS (APK) + env: + ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }} + ANDROID_KEYALIAS_NAME: ${{ secrets.ANDROID_KEYALIAS_NAME }} + ANDROID_KEYALIAS_PASS: ${{ secrets.ANDROID_KEYALIAS_PASS }} + run: | + find ${{ env.UNITY_PROJECT_EXPORT_PATH }} -name "build.gradle" -exec sed -i 's/targetSdkVersion [0-9]*/targetSdkVersion 29/g' {} + + fastlane build_foss - name: Collect Android APKs - if: ${{ env.TARGET_CHANNEL == 'foss' }} run: | set -euo pipefail mkdir -p out - cp "${{ env.CONFIGURATION }}/Android/MajdataPlay.apk/MajdataPlay.armeabi-v7a.apk" "out/MajdataPlay-Android-nightly.armeabi-v7a.apk" - cp "${{ env.CONFIGURATION }}/Android/MajdataPlay.apk/MajdataPlay.arm64-v8a.apk" "out/MajdataPlay-Android-nightly.arm64-v8a.apk" + OUTPUT_DIR="${{ env.UNITY_PROJECT_EXPORT_PATH }}/launcher/build/outputs/apk/release" + for file in "$OUTPUT_DIR"/*.apk; do + if [[ "$file" == *"v7a"* ]]; then + cp "$file" "out/MajdataPlay-Android-nightly.armeabi-v7a.apk" + elif [[ "$file" == *"v8a"* ]]; then + cp "$file" "out/MajdataPlay-Android-nightly.arm64-v8a.apk" + else + cp "$file" "out/MajdataPlay-Android-nightly.apk" + fi + done ls -la out + - name: Build Play (AAB) + env: + ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }} + ANDROID_KEYALIAS_NAME: ${{ secrets.ANDROID_KEYALIAS_NAME }} + ANDROID_KEYALIAS_PASS: ${{ secrets.ANDROID_KEYALIAS_PASS }} + run: | + find ${{ env.UNITY_PROJECT_EXPORT_PATH }} -name "build.gradle" -exec sed -i 's/targetSdkVersion [0-9]*/targetSdkVersion 36/g' {} + + fastlane build_play + - name: Collect Android AAB - if: ${{ env.TARGET_CHANNEL == 'play' }} run: | set -euo pipefail mkdir -p out - cp "${{ env.CONFIGURATION }}/Android/MajdataPlay.aab" "out/MajdataPlay-Android-nightly.aab" + cp "${{ env.UNITY_PROJECT_EXPORT_PATH }}/launcher/build/outputs/bundle/release/launcher-release.aab" "out/MajdataPlay-Android-nightly.aab" ls -la out - - name: Upload build outputs as workflow artifact + - name: Upload FOSS APK outputs as workflow artifact uses: actions/upload-artifact@v4 with: - name: out-${{ env.TARGET_PLATFORM }}-${{ env.TARGET_CHANNEL }} - path: out/* + name: MajdataPlay-Android-FOSS-APK + path: out/*.apk + if-no-files-found: error + retention-days: 7 + + - name: Upload Play AAB outputs as workflow artifact + uses: actions/upload-artifact@v4 + with: + name: MajdataPlay-Android-Play-AAB + path: out/*.aab if-no-files-found: error retention-days: 7 - name: Upload to Google Play uses: r0adkll/upload-google-play@v1 - if: ${{ env.TARGET_CHANNEL == 'play' }} continue-on-error: true with: serviceAccountJsonPlainText: ${{ secrets.PLAY_DEPLOY_ACCOUNT_JSON }} packageName: net.majdata.majdataplay - releaseFiles: ${{ env.CONFIGURATION }}/Android/MajdataPlay.aab + releaseFiles: out/MajdataPlay-Android-nightly.aab track: internal status: completed From 96a8e25e39fef0b6abede2a4a39734986d67c0ff Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 16:06:19 +0800 Subject: [PATCH 02/18] Update Java & Gradle setup to use version 5 --- .github/workflows/main.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0dbb2c95b..008cb2629 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -125,13 +125,6 @@ jobs: restore-keys: | Library-${{ runner.os }}-${{ env.TARGET_PLATFORM }}- - - name: Setup Java & Gradle Cache - uses: actions/setup-java@v4 - with: - distribution: 'zulu' - java-version: '17' - cache: 'gradle' - - name: Setup Ruby and Fastlane uses: ruby/setup-ruby@v1 with: @@ -151,6 +144,13 @@ jobs: buildsPath: ${{ env.CONFIGURATION }} androidExportType: androidStudioProject + - name: Setup Java & Gradle Cache + uses: actions/setup-java@v5 + with: + distribution: 'zulu' + java-version: '17' + cache: 'gradle' + - name: Prepare Keystore run: | echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 --decode > android-publish.keystore From 1a26fb84daed1599cffd8dab00f3d88df4ad86b6 Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 16:25:09 +0800 Subject: [PATCH 03/18] Update main.yml --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 008cb2629..db6aa04a1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -113,7 +113,7 @@ jobs: COMMIT_COUNT=$(git rev-list HEAD --count) COUNT=$((COMMIT_COUNT + 100000)) echo "BUNDLE_VERSION_CODE=$COUNT" >> $GITHUB_ENV - echo "BUNDLE_VERSION_CODE_FOR_APK=$COUNT" >> $GITHUB_ENV + echo "BUNDLE_VERSION_CODE_FOR_APK=$COMMIT_COUNT" >> $GITHUB_ENV echo "Android AAB version code: $COUNT" echo "Android APK version code: $COMMIT_COUNT" @@ -170,7 +170,7 @@ jobs: build_type: "Release", flags: "--build-cache", properties: { - "android.injected.versionCode" => ENV['BUNDLE_VERSION_CODE_FOR_APK'], + "android.injected.versionCode" => ENV['BUNDLE_VERSION_CODE'], "android.injected.versionName" => ENV['BUNDLE_VERSION_WITH_HASH'], "android.injected.signing.store.file" => ENV['KEYSTORE_PATH'], "android.injected.signing.store.password" => ENV['ANDROID_KEYSTORE_PASS'], From a109a352c5f89b4e3767410105014bca3993ae97 Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 16:43:08 +0800 Subject: [PATCH 04/18] Add androidVersionCode to workflow configuration --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index db6aa04a1..2438a5f94 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -140,6 +140,7 @@ jobs: targetPlatform: ${{ env.TARGET_PLATFORM }} versioning: Custom version: ${{ env.BUNDLE_VERSION_WITH_HASH }} + androidVersionCode: ${{ env.BUNDLE_VERSION_CODE_FOR_APK }} buildName: MajdataPlay buildsPath: ${{ env.CONFIGURATION }} androidExportType: androidStudioProject From 67a61956eb105f1fcd35f3b26d7d31537a8846db Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 17:04:11 +0800 Subject: [PATCH 05/18] Add step to fix directory permissions --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2438a5f94..a1d7666cd 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -145,6 +145,9 @@ jobs: buildsPath: ${{ env.CONFIGURATION }} androidExportType: androidStudioProject + - name: Fix Directory Permissions + run: sudo chown -R $USER:$USER ${{ env.UNITY_PROJECT_EXPORT_PATH }} + - name: Setup Java & Gradle Cache uses: actions/setup-java@v5 with: From bd72b42baa267f0b696df3425b5241e59d846f7e Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 17:22:04 +0800 Subject: [PATCH 06/18] Create Fastfile in fastlane directory --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a1d7666cd..f50aaca94 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -162,7 +162,8 @@ jobs: - name: Create Fastfile run: | - cat << 'EOF' > Fastfile + mkdir -p fastlane + cat << 'EOF' > fastlane/Fastfile default_platform(:android) platform :android do From 00f6e4d1593c394ba0299c802f82980749bd9744 Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 17:42:18 +0800 Subject: [PATCH 07/18] Disable use_gradlew in Gradle build steps --- .github/workflows/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f50aaca94..639629753 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -173,6 +173,7 @@ jobs: project_dir: ENV['UNITY_PROJECT_EXPORT_PATH'], task: "assemble", build_type: "Release", + use_gradlew: false, flags: "--build-cache", properties: { "android.injected.versionCode" => ENV['BUNDLE_VERSION_CODE'], @@ -191,6 +192,7 @@ jobs: project_dir: ENV['UNITY_PROJECT_EXPORT_PATH'], task: "bundle", build_type: "Release", + use_gradlew: false, flags: "--build-cache", properties: { "android.injected.versionCode" => ENV['BUNDLE_VERSION_CODE'], From 968baff03376abd5b60b6c349ca4d018235eecca Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 18:01:12 +0800 Subject: [PATCH 08/18] Add Gradle Wrapper generation step Added a step to generate the Gradle Wrapper in the workflow. --- .github/workflows/main.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 639629753..851ceb5ad 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -155,6 +155,11 @@ jobs: java-version: '17' cache: 'gradle' + - name: Generate Gradle Wrapper + run: | + cd ${{ env.UNITY_PROJECT_EXPORT_PATH }} + gradle wrapper + - name: Prepare Keystore run: | echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 --decode > android-publish.keystore @@ -173,7 +178,6 @@ jobs: project_dir: ENV['UNITY_PROJECT_EXPORT_PATH'], task: "assemble", build_type: "Release", - use_gradlew: false, flags: "--build-cache", properties: { "android.injected.versionCode" => ENV['BUNDLE_VERSION_CODE'], @@ -192,7 +196,6 @@ jobs: project_dir: ENV['UNITY_PROJECT_EXPORT_PATH'], task: "bundle", build_type: "Release", - use_gradlew: false, flags: "--build-cache", properties: { "android.injected.versionCode" => ENV['BUNDLE_VERSION_CODE'], From 756496a81a0149d16f99c557ce4161ee9b32e639 Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 19:00:27 +0800 Subject: [PATCH 09/18] Modify Unity export path and permissions in workflow Updated the Unity project export path and adjusted directory permissions in the workflow. --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 851ceb5ad..1a9cddb8e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -92,7 +92,7 @@ jobs: env: CONFIGURATION: Release TARGET_PLATFORM: Android - UNITY_PROJECT_EXPORT_PATH: Release/Android + UNITY_PROJECT_EXPORT_PATH: Release/Android/MajdataPlay steps: - name: Checkout the repository @@ -146,7 +146,7 @@ jobs: androidExportType: androidStudioProject - name: Fix Directory Permissions - run: sudo chown -R $USER:$USER ${{ env.UNITY_PROJECT_EXPORT_PATH }} + run: sudo chown -R $USER:$USER ${{ env.CONFIGURATION }}/${{ env.TARGET_PLATFORM }} - name: Setup Java & Gradle Cache uses: actions/setup-java@v5 From ec2d2877344552332c07265788880d079e1a5faf Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 19:27:55 +0800 Subject: [PATCH 10/18] Setup Android NDK and fix SDK/NDK paths Added steps to set up Android NDK and fix SDK paths. --- .github/workflows/main.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1a9cddb8e..41f3bd567 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -155,6 +155,24 @@ jobs: java-version: '17' cache: 'gradle' + - name: Setup Android NDK + uses: nttld/setup-ndk@v1 + id: setup-ndk + with: + ndk-version: r23c + local-cache: true + + - name: Fix Android SDK and NDK paths + run: | + cd ${{ env.UNITY_PROJECT_EXPORT_PATH }} + + echo "sdk.dir=$ANDROID_HOME" > local.properties + echo "ndk.dir=${{ steps.setup-ndk.outputs.ndk-path }}" >> local.properties + + if [ -f "unityLibrary/build.gradle" ]; then + sed -i 's|ndkPath "/opt/unity/Editor/Data/PlaybackEngines/AndroidPlayer/NDK"|ndkPath "${{ steps.setup-ndk.outputs.ndk-path }}"|g' unityLibrary/build.gradle + fi + - name: Generate Gradle Wrapper run: | cd ${{ env.UNITY_PROJECT_EXPORT_PATH }} From 1a2f7ad95d4224489c2f5c68036540ca001a76e0 Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 19:51:59 +0800 Subject: [PATCH 11/18] Update main.yml --- .github/workflows/main.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 41f3bd567..33362ecf1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -166,12 +166,17 @@ jobs: run: | cd ${{ env.UNITY_PROJECT_EXPORT_PATH }} - echo "sdk.dir=$ANDROID_HOME" > local.properties - echo "ndk.dir=${{ steps.setup-ndk.outputs.ndk-path }}" >> local.properties + BAD_NDK="/opt/unity/Editor/Data/PlaybackEngines/AndroidPlayer/NDK" + BAD_SDK="/opt/unity/Editor/Data/PlaybackEngines/AndroidPlayer/SDK" - if [ -f "unityLibrary/build.gradle" ]; then - sed -i 's|ndkPath "/opt/unity/Editor/Data/PlaybackEngines/AndroidPlayer/NDK"|ndkPath "${{ steps.setup-ndk.outputs.ndk-path }}"|g' unityLibrary/build.gradle - fi + GOOD_NDK="${{ steps.setup-ndk.outputs.ndk-path }}" + GOOD_SDK="$ANDROID_HOME" + + find . -type f \( -name "*.gradle" -o -name "*.properties" \) -exec sed -i "s|$BAD_NDK|$GOOD_NDK|g" {} + + find . -type f \( -name "*.gradle" -o -name "*.properties" \) -exec sed -i "s|$BAD_SDK|$GOOD_SDK|g" {} + + + echo "sdk.dir=$GOOD_SDK" > local.properties + echo "ndk.dir=$GOOD_NDK" >> local.properties - name: Generate Gradle Wrapper run: | From b3b3545a2e7f0bdb70d22d366c4d91c256963ec3 Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 20:42:14 +0800 Subject: [PATCH 12/18] Add NDK dependencies installation step Added steps to install NDK dependencies and fix permissions. --- .github/workflows/main.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 33362ecf1..9b96d201f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -162,6 +162,16 @@ jobs: ndk-version: r23c local-cache: true + - name: Install NDK Dependencies & Fix Permissions + run: | + sudo apt-get update -y + sudo apt-get install -y libtinfo5 libncurses5 || { + sudo ln -sf /lib/x86_64-linux-gnu/libtinfo.so.6 /lib/x86_64-linux-gnu/libtinfo.so.5 + sudo ln -sf /lib/x86_64-linux-gnu/libncurses.so.6 /lib/x86_64-linux-gnu/libncurses.so.5 + } + + chmod -R +x ${{ steps.setup-ndk.outputs.ndk-path }} + - name: Fix Android SDK and NDK paths run: | cd ${{ env.UNITY_PROJECT_EXPORT_PATH }} From a24e2a802b5720cc04937fadc4c06351cf24fb67 Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 21:38:24 +0800 Subject: [PATCH 13/18] Update main.yml --- .github/workflows/main.yml | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9b96d201f..8706e03e6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -155,23 +155,11 @@ jobs: java-version: '17' cache: 'gradle' - - name: Setup Android NDK - uses: nttld/setup-ndk@v1 - id: setup-ndk - with: - ndk-version: r23c - local-cache: true - - - name: Install NDK Dependencies & Fix Permissions + - name: Install Android NDK via SDK Manager run: | - sudo apt-get update -y - sudo apt-get install -y libtinfo5 libncurses5 || { - sudo ln -sf /lib/x86_64-linux-gnu/libtinfo.so.6 /lib/x86_64-linux-gnu/libtinfo.so.5 - sudo ln -sf /lib/x86_64-linux-gnu/libncurses.so.6 /lib/x86_64-linux-gnu/libncurses.so.5 - } - - chmod -R +x ${{ steps.setup-ndk.outputs.ndk-path }} + echo "y" | sdkmanager --install "ndk;23.1.7779620" + # ★ 更新:修复 SDK/NDK 绝对路径,指向 sdkmanager 下载的官方路径 - name: Fix Android SDK and NDK paths run: | cd ${{ env.UNITY_PROJECT_EXPORT_PATH }} @@ -179,7 +167,7 @@ jobs: BAD_NDK="/opt/unity/Editor/Data/PlaybackEngines/AndroidPlayer/NDK" BAD_SDK="/opt/unity/Editor/Data/PlaybackEngines/AndroidPlayer/SDK" - GOOD_NDK="${{ steps.setup-ndk.outputs.ndk-path }}" + GOOD_NDK="$ANDROID_HOME/ndk/23.1.7779620" GOOD_SDK="$ANDROID_HOME" find . -type f \( -name "*.gradle" -o -name "*.properties" \) -exec sed -i "s|$BAD_NDK|$GOOD_NDK|g" {} + From 53ee142c384da0c3356e6ad392098c87eb1c60c5 Mon Sep 17 00:00:00 2001 From: LeZi Date: Thu, 27 Aug 2026 22:39:06 +0800 Subject: [PATCH 14/18] Fix Android NDK installation command in workflow Updated the command to install Android NDK to use the correct path for sdkmanager. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8706e03e6..b5371cb97 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -157,7 +157,7 @@ jobs: - name: Install Android NDK via SDK Manager run: | - echo "y" | sdkmanager --install "ndk;23.1.7779620" + echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "ndk;23.1.7779620" # ★ 更新:修复 SDK/NDK 绝对路径,指向 sdkmanager 下载的官方路径 - name: Fix Android SDK and NDK paths From 7021177d3fe744f7e0243d71228530d9f5cf9227 Mon Sep 17 00:00:00 2001 From: LeZi Date: Fri, 28 Aug 2026 00:09:04 +0800 Subject: [PATCH 15/18] Enhance Android build workflow with dynamic versioning Updated Android build process to use dynamic versioning and improved path handling for APK and AAB outputs. --- .github/workflows/main.yml | 68 +++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b5371cb97..dec494bb3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -159,7 +159,6 @@ jobs: run: | echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "ndk;23.1.7779620" - # ★ 更新:修复 SDK/NDK 绝对路径,指向 sdkmanager 下载的官方路径 - name: Fix Android SDK and NDK paths run: | cd ${{ env.UNITY_PROJECT_EXPORT_PATH }} @@ -193,21 +192,44 @@ jobs: default_platform(:android) platform :android do - desc "Build FOSS version (APK)" + + before_all do + gradle_path = File.join(ENV['UNITY_PROJECT_EXPORT_PATH'], 'launcher', 'build.gradle') + content = File.read(gradle_path) + + content = content.gsub(/versionCode\s+\d+/, "versionCode #{ENV['BUNDLE_VERSION_CODE']}") + content = content.gsub(/versionName\s+['"].*?['"]/, "versionName '#{ENV['BUNDLE_VERSION_WITH_HASH']}'") + + signing_block = <<-GRADLE + + // --- Injected by Fastlane --- + android { + signingConfigs { + release { + storeFile file("#{ENV['KEYSTORE_PATH']}") + storePassword "#{ENV['ANDROID_KEYSTORE_PASS']}" + keyAlias "#{ENV['ANDROID_KEYALIAS_NAME']}" + keyPassword "#{ENV['ANDROID_KEYALIAS_PASS']}" + } + } + buildTypes { + release { + signingConfig signingConfigs.release + } + } + } + GRADLE + + File.open(gradle_path, 'w') { |file| file.puts(content + signing_block) } + end + + desc "Build foss version (APK)" lane :build_foss do gradle( project_dir: ENV['UNITY_PROJECT_EXPORT_PATH'], task: "assemble", build_type: "Release", - flags: "--build-cache", - properties: { - "android.injected.versionCode" => ENV['BUNDLE_VERSION_CODE'], - "android.injected.versionName" => ENV['BUNDLE_VERSION_WITH_HASH'], - "android.injected.signing.store.file" => ENV['KEYSTORE_PATH'], - "android.injected.signing.store.password" => ENV['ANDROID_KEYSTORE_PASS'], - "android.injected.signing.key.alias" => ENV['ANDROID_KEYALIAS_NAME'], - "android.injected.signing.key.password" => ENV['ANDROID_KEYALIAS_PASS'] - } + flags: "--build-cache" ) end @@ -217,21 +239,13 @@ jobs: project_dir: ENV['UNITY_PROJECT_EXPORT_PATH'], task: "bundle", build_type: "Release", - flags: "--build-cache", - properties: { - "android.injected.versionCode" => ENV['BUNDLE_VERSION_CODE'], - "android.injected.versionName" => ENV['BUNDLE_VERSION_WITH_HASH'], - "android.injected.signing.store.file" => ENV['KEYSTORE_PATH'], - "android.injected.signing.store.password" => ENV['ANDROID_KEYSTORE_PASS'], - "android.injected.signing.key.alias" => ENV['ANDROID_KEYALIAS_NAME'], - "android.injected.signing.key.password" => ENV['ANDROID_KEYALIAS_PASS'] - } + flags: "--build-cache" ) end end EOF - - name: Build FOSS (APK) + - name: Build foss (APK) env: ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }} ANDROID_KEYALIAS_NAME: ${{ secrets.ANDROID_KEYALIAS_NAME }} @@ -247,11 +261,11 @@ jobs: OUTPUT_DIR="${{ env.UNITY_PROJECT_EXPORT_PATH }}/launcher/build/outputs/apk/release" for file in "$OUTPUT_DIR"/*.apk; do if [[ "$file" == *"v7a"* ]]; then - cp "$file" "out/MajdataPlay-Android-nightly.armeabi-v7a.apk" + cp "$file" "out/MajdataPlay-Android-${{ env.BUNDLE_VERSION_WITH_HASH }}-nightly.armeabi-v7a.apk" elif [[ "$file" == *"v8a"* ]]; then - cp "$file" "out/MajdataPlay-Android-nightly.arm64-v8a.apk" + cp "$file" "out/MajdataPlay-Android-${{ env.BUNDLE_VERSION_WITH_HASH }}-nightly.arm64-v8a.apk" else - cp "$file" "out/MajdataPlay-Android-nightly.apk" + cp "$file" "out/MajdataPlay-Android-${{ env.BUNDLE_VERSION_WITH_HASH }}-nightly.apk" fi done ls -la out @@ -269,13 +283,13 @@ jobs: run: | set -euo pipefail mkdir -p out - cp "${{ env.UNITY_PROJECT_EXPORT_PATH }}/launcher/build/outputs/bundle/release/launcher-release.aab" "out/MajdataPlay-Android-nightly.aab" + cp "${{ env.UNITY_PROJECT_EXPORT_PATH }}/launcher/build/outputs/bundle/release/launcher-release.aab" "out/MajdataPlay-Android-${{ env.BUNDLE_VERSION_WITH_HASH }}-nightly.aab" ls -la out - name: Upload FOSS APK outputs as workflow artifact uses: actions/upload-artifact@v4 with: - name: MajdataPlay-Android-FOSS-APK + name: MajdataPlay-Android-foss-APK path: out/*.apk if-no-files-found: error retention-days: 7 @@ -294,7 +308,7 @@ jobs: with: serviceAccountJsonPlainText: ${{ secrets.PLAY_DEPLOY_ACCOUNT_JSON }} packageName: net.majdata.majdataplay - releaseFiles: out/MajdataPlay-Android-nightly.aab + releaseFiles: out/MajdataPlay-Android-${{ env.BUNDLE_VERSION_WITH_HASH }}-nightly.aab track: internal status: completed From 52cb7dcbb40d3bf22a34c595b0a78af3cf939903 Mon Sep 17 00:00:00 2001 From: LeZi Date: Fri, 28 Aug 2026 02:41:37 +0800 Subject: [PATCH 16/18] Add Gradle setup step to workflow --- .github/workflows/main.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dec494bb3..464f67342 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -155,6 +155,11 @@ jobs: java-version: '17' cache: 'gradle' + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + with: + gradle-version: '9.1.0' + - name: Install Android NDK via SDK Manager run: | echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "ndk;23.1.7779620" From 4e5dfd4aa575175325709f270ad67233017866c6 Mon Sep 17 00:00:00 2001 From: LeZi Date: Fri, 28 Aug 2026 13:41:31 +0800 Subject: [PATCH 17/18] Refactor gradle path construction in workflow Updated gradle path to use PROJECT_ROOT environment variable. --- .github/workflows/main.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 464f67342..76fb99c5a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -92,6 +92,7 @@ jobs: env: CONFIGURATION: Release TARGET_PLATFORM: Android + PROJECT_ROOT: ${{ github.workspace }} UNITY_PROJECT_EXPORT_PATH: Release/Android/MajdataPlay steps: @@ -199,7 +200,12 @@ jobs: platform :android do before_all do - gradle_path = File.join(ENV['UNITY_PROJECT_EXPORT_PATH'], 'launcher', 'build.gradle') + gradle_path = File.join( + ENV['PROJECT_ROOT'], + ENV['UNITY_PROJECT_EXPORT_PATH'], + 'launcher', + 'build.gradle' + ) content = File.read(gradle_path) content = content.gsub(/versionCode\s+\d+/, "versionCode #{ENV['BUNDLE_VERSION_CODE']}") From 8be79d05c9c5f4bc0a2631456efad1f026618b64 Mon Sep 17 00:00:00 2001 From: LeZi Date: Fri, 28 Aug 2026 14:19:50 +0800 Subject: [PATCH 18/18] Fix typo in workflow artifact upload step --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 76fb99c5a..575f5ec17 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -297,7 +297,7 @@ jobs: cp "${{ env.UNITY_PROJECT_EXPORT_PATH }}/launcher/build/outputs/bundle/release/launcher-release.aab" "out/MajdataPlay-Android-${{ env.BUNDLE_VERSION_WITH_HASH }}-nightly.aab" ls -la out - - name: Upload FOSS APK outputs as workflow artifact + - name: Upload foss APK outputs as workflow artifact uses: actions/upload-artifact@v4 with: name: MajdataPlay-Android-foss-APK