ac640762d7
build / build (push) Successful in 2m13s
- patchelf gl4es's embedded SONAME to libGL.so so AGP's jniLibs packaging (which drops any file not literally named "*.so") and the dynamic linker's NEEDED-entry resolution (by embedded SONAME, not filename) finally agree - fixes the "library \"libGL.so.1\" not found" crash seen on real Quest hardware. - QuestShockActivity now checks that res/data and res/sound exist before starting the native engine, showing an explanatory dialog instead of crashing on init_popups' unchecked NULL resource load when a fresh install has no game data copied in yet. - dist/questshock-<version>-android-arm64.apk is now versioned from the same git-tag-or-dev-placeholder scheme as the desktop tarball (build-image/version.sh, shared by both via the Makefile and build-apk.sh). - build-image/prepare-android-project.sh (prep logic extracted out of build-apk.sh) can now stage android/ for a native build directly in Android Studio (--host-paths), exporting the prebuilt SDL2/SDL2_mixer/ fluidsynth-lite/gl4es libraries and writing host-resolvable paths, instead of only ever building inside the Docker image. - Corrected GET_ASSETS.txt/GET_ASSETS_QUEST.txt, which wrongly described merging res/pc/hd and res/pc/cdrom trees out of the raw installer's sshock.kpf - an already-installed copy's res/data res/sound can just be copied directly, with extract_assets.sh only needed from the raw installer.
107 lines
5.1 KiB
Groovy
107 lines
5.1 KiB
Groovy
apply plugin: 'com.android.application'
|
|
|
|
// Paths written by build-image/prepare-android-project.sh (called by
|
|
// build-apk.sh, or standalone with --host-paths to prep for a native
|
|
// build in Android Studio - see README) since they're only known at
|
|
// prep/build time, not something a checked-in build.gradle can hardcode.
|
|
// engineDir is the scratch, patched copy of engine/; prebuiltDir is the
|
|
// Android SDL2/SDL2_mixer/fluidsynth-lite/gl4es prebuilts - both point
|
|
// into this container's own paths for build-apk.sh's own gradlew call,
|
|
// or host-resolvable paths (plus a host-side export of prebuiltDir, since
|
|
// /opt/prebuilt/android only exists in the image) when prepared with
|
|
// --host-paths for Android Studio.
|
|
def engineProps = new Properties()
|
|
file("${projectDir}/../engine.properties").withInputStream { engineProps.load(it) }
|
|
def engineDir = engineProps.getProperty('engineDir')
|
|
if (engineDir == null) {
|
|
throw new GradleException("android/engine.properties is missing 'engineDir' - run via build-apk.sh or prepare-android-project.sh, not gradlew directly")
|
|
}
|
|
def prebuiltDir = engineProps.getProperty('prebuiltDir')
|
|
if (prebuiltDir == null) {
|
|
throw new GradleException("android/engine.properties is missing 'prebuiltDir' - run via build-apk.sh or prepare-android-project.sh, not gradlew directly")
|
|
}
|
|
|
|
// Set by build-apk.sh (see build-image/version.sh, shared with the
|
|
// desktop tarball's versioning) via -PquestshockVersionName/Code. Default
|
|
// here only covers a direct, unsupported `gradlew` invocation.
|
|
def questshockVersionName = project.hasProperty('questshockVersionName') ? project.property('questshockVersionName') : '0.0.0-dev'
|
|
def questshockVersionCode = project.hasProperty('questshockVersionCode') ? project.property('questshockVersionCode').toInteger() : 1
|
|
|
|
android {
|
|
namespace "de.ladkau.questshock"
|
|
// compileSdk/buildToolsVersion/ndkVersion must all match what
|
|
// build-image/Dockerfile actually installs - otherwise AGP defaults to
|
|
// whatever version it itself prefers and tries to download it into the
|
|
// SDK dir at build time, which isn't writable.
|
|
compileSdk 34
|
|
buildToolsVersion "34.0.0"
|
|
ndkVersion "26.1.10909125"
|
|
|
|
defaultConfig {
|
|
applicationId "de.ladkau.questshock"
|
|
// 29, not compileSdk's 34, is deliberate - see build-image/Dockerfile's
|
|
// comment on ANDROID_PLATFORM_VERSION: paired with
|
|
// requestLegacyExternalStorage in the manifest, this keeps
|
|
// /sdcard/questshock/ a plain, unrestricted shared folder instead of
|
|
// Android 11+ scoped storage, on the Quest 2/3/3S/Pro headsets this
|
|
// targets - not just whatever's the current API level today.
|
|
minSdkVersion 24
|
|
targetSdkVersion 29
|
|
versionCode questshockVersionCode
|
|
versionName questshockVersionName
|
|
|
|
externalNativeBuild {
|
|
cmake {
|
|
// engine/CMakeLists.txt's own dependency-selection options
|
|
// (see engine/CMakeLists.txt near the top): SDL2 via
|
|
// find_package (our Android SDL2 build installs a real CMake
|
|
// config, unlike the desktop build's older bundled copy);
|
|
// SDL2_mixer and FluidSynth via the same build_ext/ BUNDLED
|
|
// convention the desktop build already uses (populated in the
|
|
// scratch engine copy by prepare-android-project.sh from
|
|
// prebuiltDir). ANDROID_PREBUILT_DIR is also read directly by
|
|
// android/engine-patches/02-android-opengl-es.patch, for gl4es.
|
|
// The CMAKE_FIND_ROOT_PATH* overrides below are needed
|
|
// because the NDK toolchain file restricts find_package/
|
|
// find_path/find_library to its own sysroot by default,
|
|
// which would otherwise miss our custom-installed SDL2 (see
|
|
// build-image/Dockerfile's SDL2_mixer build, which hit the
|
|
// exact same thing).
|
|
arguments "-DENABLE_SDL2=ON", "-DENABLE_SOUND=BUNDLED", "-DENABLE_FLUIDSYNTH=BUNDLED", \
|
|
"-DANDROID_PREBUILT_DIR=${prebuiltDir}", \
|
|
"-DCMAKE_PREFIX_PATH=${prebuiltDir}/sdl2", \
|
|
"-DCMAKE_FIND_ROOT_PATH=${prebuiltDir}/sdl2", \
|
|
"-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH", \
|
|
"-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH", \
|
|
"-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH", \
|
|
"-DANDROID_EXTRA_SOURCES=${projectDir}/src/main/cpp/questshock_native.c"
|
|
abiFilters 'arm64-v8a'
|
|
}
|
|
}
|
|
}
|
|
|
|
externalNativeBuild {
|
|
cmake {
|
|
path file("${engineDir}/CMakeLists.txt")
|
|
}
|
|
}
|
|
|
|
buildTypes {
|
|
release {
|
|
minifyEnabled false
|
|
}
|
|
}
|
|
|
|
lint {
|
|
abortOnError false
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
// ActivityCompat.checkSelfPermission/requestPermissions in
|
|
// QuestShockActivity - the plain android.app.Activity APIs work the
|
|
// same way without androidx, but ActivityCompat is the standard,
|
|
// documented way to request runtime permissions safely.
|
|
implementation 'androidx.core:core:1.12.0'
|
|
}
|