Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 91 additions & 0 deletions .github/workflows/android-bionic.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: Build Android Bionic layer

on:
push:
branches:
- "**"
tags:
- "v*"
pull_request:
branches:
- release
workflow_dispatch:

concurrency:
group: android-bionic-${{ github.ref }}
cancel-in-progress: true

env:
ANDROID_NDK_VERSION: 27.3.13750724
ANDROID_PLATFORM: android-28

jobs:
build:
name: Build ${{ matrix.abi }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
abi:
- arm64-v8a
- x86_64

steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive

- name: Set up Android SDK
uses: android-actions/setup-android@v3

- name: Install Android build tools
run: |
sudo apt-get update
sudo apt-get install -y cmake ninja-build file
sdkmanager --install "ndk;${ANDROID_NDK_VERSION}"
echo "ANDROID_NDK_ROOT=${ANDROID_HOME}/ndk/${ANDROID_NDK_VERSION}" >> "$GITHUB_ENV"
echo "ANDROID_NDK=${ANDROID_HOME}/ndk/${ANDROID_NDK_VERSION}" >> "$GITHUB_ENV"

- name: Build ${{ matrix.abi }}
env:
ANDROID_ABI: ${{ matrix.abi }}
HOST_TAG: linux-x86_64
run: bash ./scripts/build/android.sh Release

- name: Inspect ${{ matrix.abi }} artifact
run: |
file "build-android-${{ matrix.abi }}/dist/liblsfg-vk-${{ matrix.abi }}.so"
"${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-readelf" \
-h -d "build-android-${{ matrix.abi }}/dist/liblsfg-vk-${{ matrix.abi }}.so"

- name: Upload ${{ matrix.abi }} artifact
uses: actions/upload-artifact@v4
with:
name: liblsfg-vk-${{ matrix.abi }}
path: build-android-${{ matrix.abi }}/dist/liblsfg-vk-${{ matrix.abi }}.so
if-no-files-found: error

release:
name: Publish GitHub release
needs: build
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/v')
permissions:
contents: write

steps:
- name: Download layer artifacts
uses: actions/download-artifact@v4
with:
path: release-assets
merge-multiple: true

- name: List release assets
run: ls -lh release-assets/

- name: Create GitHub release
uses: softprops/action-gh-release@v2
with:
files: release-assets/*.so
generate_release_notes: true
47 changes: 34 additions & 13 deletions scripts/build/android.sh
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,24 +1,27 @@
#!/usr/bin/env bash
# Build lsfg-vk for the GameNative Android emulator (Wine-on-Android).
# Build lsfg-vk for GameNative's Android/Bionic Wine-on-Android runtime.
#
# Produces:
# build-android/liblsfg-vk.so (aarch64 shared library)
# build-android/VkLayer_LS_frame_generation.json (copied from repo root)
# Produces by default:
# build-android-${ANDROID_ABI}/liblsfg-vk.so
# build-android-${ANDROID_ABI}/dist/liblsfg-vk-${ANDROID_ABI}.so (stripped)
# build-android-${ANDROID_ABI}/dist/VkLayer_LS_frame_generation.json
#
# Requirements:
# ANDROID_NDK env var pointing at an Android NDK r25+ (we use the CMake toolchain it ships).
# ANDROID_NDK env var pointing at an Android NDK r25+.
#
# Usage:
# ANDROID_NDK=/path/to/android-ndk-r26d ./scripts/build/android.sh [Release|Debug]
# ANDROID_NDK=/path/to/android-ndk-r27d ./scripts/build/android.sh [Release|Debug]
# ANDROID_ABI=x86_64 ANDROID_NDK=/path/to/android-ndk-r27d ./scripts/build/android.sh

set -euo pipefail

BUILD_TYPE="${1:-Release}"
ABI="${ANDROID_ABI:-arm64-v8a}"
API="${ANDROID_PLATFORM:-android-28}"
GENERATOR="${CMAKE_GENERATOR:-Ninja}"

if [[ -z "${ANDROID_NDK:-}" ]]; then
echo "error: ANDROID_NDK must be set to your NDK root (e.g. /opt/android-ndk-r26d)" >&2
echo "error: ANDROID_NDK must be set to your NDK root (e.g. /opt/android-ndk-r27d)" >&2
exit 1
fi

Expand All @@ -30,24 +33,42 @@ fi

SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
REPO_ROOT="$(cd -- "${SCRIPT_DIR}/../.." &>/dev/null && pwd)"
BUILD_DIR="${REPO_ROOT}/build-android"
BUILD_DIR="${BUILD_DIR:-${REPO_ROOT}/build-android-${ABI}}"
DIST_DIR="${DIST_DIR:-${BUILD_DIR}/dist}"

mkdir -p "${BUILD_DIR}"
mkdir -p "${BUILD_DIR}" "${DIST_DIR}"

cmake -S "${REPO_ROOT}" -B "${BUILD_DIR}" \
-G "${GENERATOR}" \
-DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN}" \
-DANDROID_ABI="${ABI}" \
-DANDROID_PLATFORM="${API}" \
-DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
-DLSFGVK_ANDROID_WINE=ON
-DLSFGVK_ANDROID_WINE=ON \
-DVOLK_STATIC_DEFINES=VK_USE_PLATFORM_ANDROID_KHR \
-DCMAKE_CXX_FLAGS="-DVK_USE_PLATFORM_ANDROID_KHR" \
-DCMAKE_C_FLAGS="-DVK_USE_PLATFORM_ANDROID_KHR"

cmake --build "${BUILD_DIR}" --parallel

HOST_OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
STRIP_BIN="${ANDROID_NDK}/toolchains/llvm/prebuilt/${HOST_TAG:-${HOST_OS}-x86_64}/bin/llvm-strip"
if [[ -x "${STRIP_BIN}" ]]; then
"${STRIP_BIN}" --strip-unneeded \
-o "${DIST_DIR}/liblsfg-vk-${ABI}.so" \
"${BUILD_DIR}/liblsfg-vk.so"
else
echo "warning: llvm-strip not found at ${STRIP_BIN}; copying unstripped library" >&2
cp "${BUILD_DIR}/liblsfg-vk.so" "${DIST_DIR}/liblsfg-vk-${ABI}.so"
fi

cp "${REPO_ROOT}/VkLayer_LS_frame_generation.json" "${BUILD_DIR}/"
cp "${REPO_ROOT}/VkLayer_LS_frame_generation.json" "${DIST_DIR}/"

echo ""
echo "Build complete. Artifacts:"
echo " ${BUILD_DIR}/liblsfg-vk.so"
echo " ${BUILD_DIR}/VkLayer_LS_frame_generation.json"
echo " ${DIST_DIR}/liblsfg-vk-${ABI}.so"
echo " ${DIST_DIR}/VkLayer_LS_frame_generation.json"
echo ""
echo "Copy both files into GameNative's assets/lsfg-vk/ directory."
echo "For GameNative Android app updates, copy the arm64-v8a shared library to:"
echo " app/src/main/assets/lsfg_vk/android_arm64_v8a/liblsfg-vk-layer.so"
Loading