From 7fbaea95850f1b347f9078943785ae90aad40bd9 Mon Sep 17 00:00:00 2001 From: Jonas <104419015+jojo-chaechae@users.noreply.github.com> Date: Tue, 3 Nov 2026 12:12:50 +0600 Subject: ci: build Android arm64 APKs in release-binaries (#360) Adds an android-arm64 job that builds the mainline release APK twice: as dev.eglantine.eglantine and as com.antutu.ABenchMark. The package name comes from a new appId Gradle property. Both APKs are published with the release. --- .github/workflows/release-binaries.yml | 83 +++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) (limited to '.github/workflows/release-binaries.yml') diff --git a/.github/workflows/release-binaries.yml b/.github/workflows/release-binaries.yml index 8233a74c94..d1839a7a70 100644 --- a/.github/workflows/release-binaries.yml +++ b/.github/workflows/release-binaries.yml @@ -553,12 +553,82 @@ jobs: compression-level: 0 retention-days: 7 + android: + name: android-arm64 apk + runs-on: ubuntu-24.04 + env: + CCACHE_DIR: ${{ github.workspace }}/.ccache + CCACHE_MAXSIZE: 1500M + # Gradle's .cxx build folders are named by a config hash; relative paths keep hits stable. + CCACHE_BASEDIR: ${{ github.workspace }} + steps: + - name: Check out source + uses: actions/checkout@v5 + + - name: Set up Java + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: '17' + cache: gradle + + # The runner image has the SDK; add the NDK, CMake and platform the Gradle build asks for, + # and glslangValidator for the host shaders. + - name: Install Android packages + shell: bash + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends glslang-tools ccache + yes | "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --licenses > /dev/null || true + "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --install \ + "platforms;android-36" "build-tools;36.0.0" "ndk;28.2.13676358" "cmake;3.31.5" > /dev/null + + - name: Cache CPM downloads + uses: actions/cache@v5 + with: + path: .cache/cpm + key: cpm-android-${{ hashFiles('cpmfile.json', 'CMakeLists.txt', 'src/**/CMakeLists.txt') }} + restore-keys: | + cpm-android- + + - name: Cache compiler objects + uses: actions/cache@v5 + with: + path: .ccache + key: objects-android-arm64-${{ github.sha }} + restore-keys: | + objects-android-arm64- + + # A second APK under AnTuTu's package name, which some GPU drivers run with higher clocks. + # Both share the native build, so the second assemble only repackages. + - name: Build APKs + shell: bash + working-directory: src/android + run: | + set -euo pipefail + for variant in "dev.eglantine.eglantine:" "com.antutu.ABenchMark:-antutu"; do + ./gradlew --no-daemon "-PappId=${variant%%:*}" "-PYUZU_ANDROID_ARGS=-DUSE_CCACHE=ON" \ + assembleMainlineRelease + apk=$(find app/build/outputs/apk/mainline/release -name '*.apk' | head -1) + cp "$apk" "$GITHUB_WORKSPACE/eglantine-${GITHUB_SHA}-android-arm64${variant#*:}.apk" + done + ccache --show-stats + + - name: Upload APKs + uses: actions/upload-artifact@v7 + with: + name: eglantine-android-arm64-${{ github.sha }} + path: eglantine-${{ github.sha }}-android-arm64*.apk + if-no-files-found: error + compression-level: 0 + retention-days: 7 + # Publishes every binary as a GitHub pre-release once every platform built: on pushes to nx2 # and nx2-experimental, and on manual runs unless "Publish the binaries as a GitHub release" is # unticked. release: name: Publish release - needs: build + needs: [build, android] if: github.event_name == 'push' || inputs.publish_release runs-on: ubuntu-24.04 permissions: @@ -585,6 +655,10 @@ jobs: for file in "$artifact"*.AppImage "$artifact"*.tar.gz; do cp "$file" "dist/$(strip_sha "$(basename "$file")")" done + elif compgen -G "$artifact*.apk" > /dev/null; then + for file in "$artifact"*.apk; do + cp "$file" "dist/$(strip_sha "$(basename "$file")")" + done elif compgen -G "$artifact*.zip" > /dev/null; then for file in "$artifact"*.zip "$artifact"*.dmg; do [[ -e "$file" ]] && cp "$file" "dist/$(strip_sha "$(basename "$file")")" @@ -632,6 +706,13 @@ jobs: | arm64 (Apple Silicon) | [zip](${base}/eglantine-macos-arm64.zip) | | macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run \`xattr -dr com.apple.quarantine eglantine.app\`. \`eden-cli\` is inside the app, in \`Contents/MacOS\` | The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eden's profile); prefer them when your CPU supports it. + + ## Android + + | Build Type | APK | Notes | + | --- | --- | --- | + | arm64 | [APK](${base}/eglantine-android-arm64.apk) | Android 13 or newer | + | arm64 (AnTuTu package) | [APK](${base}/eglantine-android-arm64-antutu.apk) | Installed as \`com.antutu.ABenchMark\`, which some GPU drivers run with higher clocks. Cannot be installed alongside AnTuTu itself | EOF gh release create "${tag}" dist/* \ -- cgit v1.2.3 From b6c0eddfd52fcff4cec59958d96dc6545113c0d5 Mon Sep 17 00:00:00 2001 From: Jonas Date: Tue, 3 Nov 2026 13:39:24 +0600 Subject: ci: revert Android release builds Revert the Android APK build and release publication introduced by #360, and restore the default Android application ID. Automated Android releases are paused while support issues are addressed. AI disclosure: This commit message was written by AI and does not comply with the repository AI policy requirement that commit messages be human-written. Assisted-by: GPT-6 (prepared the revert and wrote this commit message) --- .github/workflows/release-binaries.yml | 83 +--------------------------------- src/android/app/build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 83 deletions(-) (limited to '.github/workflows/release-binaries.yml') diff --git a/.github/workflows/release-binaries.yml b/.github/workflows/release-binaries.yml index d1839a7a70..8233a74c94 100644 --- a/.github/workflows/release-binaries.yml +++ b/.github/workflows/release-binaries.yml @@ -553,82 +553,12 @@ jobs: compression-level: 0 retention-days: 7 - android: - name: android-arm64 apk - runs-on: ubuntu-24.04 - env: - CCACHE_DIR: ${{ github.workspace }}/.ccache - CCACHE_MAXSIZE: 1500M - # Gradle's .cxx build folders are named by a config hash; relative paths keep hits stable. - CCACHE_BASEDIR: ${{ github.workspace }} - steps: - - name: Check out source - uses: actions/checkout@v5 - - - name: Set up Java - uses: actions/setup-java@v5 - with: - distribution: temurin - java-version: '17' - cache: gradle - - # The runner image has the SDK; add the NDK, CMake and platform the Gradle build asks for, - # and glslangValidator for the host shaders. - - name: Install Android packages - shell: bash - run: | - sudo apt-get update - sudo apt-get install -y --no-install-recommends glslang-tools ccache - yes | "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --licenses > /dev/null || true - "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --install \ - "platforms;android-36" "build-tools;36.0.0" "ndk;28.2.13676358" "cmake;3.31.5" > /dev/null - - - name: Cache CPM downloads - uses: actions/cache@v5 - with: - path: .cache/cpm - key: cpm-android-${{ hashFiles('cpmfile.json', 'CMakeLists.txt', 'src/**/CMakeLists.txt') }} - restore-keys: | - cpm-android- - - - name: Cache compiler objects - uses: actions/cache@v5 - with: - path: .ccache - key: objects-android-arm64-${{ github.sha }} - restore-keys: | - objects-android-arm64- - - # A second APK under AnTuTu's package name, which some GPU drivers run with higher clocks. - # Both share the native build, so the second assemble only repackages. - - name: Build APKs - shell: bash - working-directory: src/android - run: | - set -euo pipefail - for variant in "dev.eglantine.eglantine:" "com.antutu.ABenchMark:-antutu"; do - ./gradlew --no-daemon "-PappId=${variant%%:*}" "-PYUZU_ANDROID_ARGS=-DUSE_CCACHE=ON" \ - assembleMainlineRelease - apk=$(find app/build/outputs/apk/mainline/release -name '*.apk' | head -1) - cp "$apk" "$GITHUB_WORKSPACE/eglantine-${GITHUB_SHA}-android-arm64${variant#*:}.apk" - done - ccache --show-stats - - - name: Upload APKs - uses: actions/upload-artifact@v7 - with: - name: eglantine-android-arm64-${{ github.sha }} - path: eglantine-${{ github.sha }}-android-arm64*.apk - if-no-files-found: error - compression-level: 0 - retention-days: 7 - # Publishes every binary as a GitHub pre-release once every platform built: on pushes to nx2 # and nx2-experimental, and on manual runs unless "Publish the binaries as a GitHub release" is # unticked. release: name: Publish release - needs: [build, android] + needs: build if: github.event_name == 'push' || inputs.publish_release runs-on: ubuntu-24.04 permissions: @@ -655,10 +585,6 @@ jobs: for file in "$artifact"*.AppImage "$artifact"*.tar.gz; do cp "$file" "dist/$(strip_sha "$(basename "$file")")" done - elif compgen -G "$artifact*.apk" > /dev/null; then - for file in "$artifact"*.apk; do - cp "$file" "dist/$(strip_sha "$(basename "$file")")" - done elif compgen -G "$artifact*.zip" > /dev/null; then for file in "$artifact"*.zip "$artifact"*.dmg; do [[ -e "$file" ]] && cp "$file" "dist/$(strip_sha "$(basename "$file")")" @@ -706,13 +632,6 @@ jobs: | arm64 (Apple Silicon) | [zip](${base}/eglantine-macos-arm64.zip) | | macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run \`xattr -dr com.apple.quarantine eglantine.app\`. \`eden-cli\` is inside the app, in \`Contents/MacOS\` | The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eden's profile); prefer them when your CPU supports it. - - ## Android - - | Build Type | APK | Notes | - | --- | --- | --- | - | arm64 | [APK](${base}/eglantine-android-arm64.apk) | Android 13 or newer | - | arm64 (AnTuTu package) | [APK](${base}/eglantine-android-arm64-antutu.apk) | Installed as \`com.antutu.ABenchMark\`, which some GPU drivers run with higher clocks. Cannot be installed alongside AnTuTu itself | EOF gh release create "${tag}" dist/* \ diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index bef72206aa..69dd6a8e4f 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -64,7 +64,7 @@ android { } defaultConfig { - applicationId = providers.gradleProperty("appId").orNull ?: "dev.eden.eden_emulator" + applicationId = "dev.eden.eden_emulator" minSdk = 24 targetSdk = 36 versionName = getGitVersion() -- cgit v1.2.3 From 0c6f441b1abd756e326f2a6316b5272c75c9a166 Mon Sep 17 00:00:00 2001 From: kraibse <33869366+kraibse@users.noreply.github.com> Date: Tue, 3 Nov 2026 14:51:22 +0100 Subject: ci: skip the release binaries for test-only pushes The release build configures with BUILD_TESTING=OFF and YUZU_TESTS=OFF, so a push that only touches src/tests produces the same binaries on all seven platforms. Exclude that directory from the path filter so it does not queue a rebuild; a push that also touches a build input still runs. Assisted-by: DeepSeek V4.1 Flash (diagnosis and patch) --- .github/workflows/release-binaries.yml | 3 +++ 1 file changed, 3 insertions(+) (limited to '.github/workflows/release-binaries.yml') diff --git a/.github/workflows/release-binaries.yml b/.github/workflows/release-binaries.yml index 8233a74c94..36b69d029e 100644 --- a/.github/workflows/release-binaries.yml +++ b/.github/workflows/release-binaries.yml @@ -14,6 +14,9 @@ on: # A binary only changes when build inputs change; docs-only pushes skip the build. paths: - "src/**" + # Test-only changes cannot change a binary: the build configures with BUILD_TESTING=OFF and + # YUZU_TESTS=OFF below, so a push that only touches src/tests has nothing to rebuild. + - "!src/tests/**" - "CMakeLists.txt" - "CMakeModules/**" - "externals/**" -- cgit v1.2.3 From fe5a9278740d121e543d2f89cdd459eca7aeb761 Mon Sep 17 00:00:00 2001 From: Mcm190 Date: Tue, 3 Nov 2026 19:13:08 +0000 Subject: ci: bundle Wayland plugins in Linux AppImages Request the Wayland platform plugins and their client graphics and shell integrations from linuxdeploy's Qt plugin. The existing Qt installation already contains them, so no extra Qt downloads are needed. Addresses #298. Assisted-by: Codex (diagnosis, packaging fix, validation, and draft text) --- .github/workflows/release-binaries.yml | 3 +++ 1 file changed, 3 insertions(+) (limited to '.github/workflows/release-binaries.yml') diff --git a/.github/workflows/release-binaries.yml b/.github/workflows/release-binaries.yml index 36b69d029e..4273e129e8 100644 --- a/.github/workflows/release-binaries.yml +++ b/.github/workflows/release-binaries.yml @@ -391,6 +391,9 @@ jobs: cp dist/Eglantine.png "$icon" export APPIMAGE_EXTRACT_AND_RUN=1 export QMAKE="$QT_ROOT_DIR/bin/qmake" + # Include Wayland platform plugins and their graphics/shell integrations. + export EXTRA_QT_MODULES=waylandcompositor + export EXTRA_PLATFORM_PLUGINS='libqwayland-egl.so;libqwayland-generic.so' export LDAI_OUTPUT="eglantine-${GITHUB_SHA}-${{ matrix.platform }}.AppImage" export OUTPUT="$LDAI_OUTPUT" export ARCH="$arch" -- cgit v1.2.3 From 4383b9787afbf6c63291bf803c8330afb4f21a16 Mon Sep 17 00:00:00 2001 From: PastaLaPate Date: Tue, 3 Nov 2026 21:56:38 +0100 Subject: ci(release): add build number to appimage --- .github/workflows/release-binaries.yml | 2 ++ 1 file changed, 2 insertions(+) (limited to '.github/workflows/release-binaries.yml') diff --git a/.github/workflows/release-binaries.yml b/.github/workflows/release-binaries.yml index 4273e129e8..9e5030c471 100644 --- a/.github/workflows/release-binaries.yml +++ b/.github/workflows/release-binaries.yml @@ -394,6 +394,8 @@ jobs: # Include Wayland platform plugins and their graphics/shell integrations. export EXTRA_QT_MODULES=waylandcompositor export EXTRA_PLATFORM_PLUGINS='libqwayland-egl.so;libqwayland-generic.so' + # Embedded in the AppImage metadata; matches the release tag (build-N) plus the commit. + export LDAI_VERSION="build-${GITHUB_RUN_NUMBER}-${GITHUB_SHA::7}" export LDAI_OUTPUT="eglantine-${GITHUB_SHA}-${{ matrix.platform }}.AppImage" export OUTPUT="$LDAI_OUTPUT" export ARCH="$arch" -- cgit v1.2.3