Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/Nebula-Modmakers/Nebula-Launcher/llms.txt

Use this file to discover all available pages before exploring further.

Nebula Launcher is an open-source Android application distributed under the GPL-3.0-only license. The full source is available at github.com/Nebula-Modmakers/Nebula-Launcher. You can build the project locally using Android Studio or the Gradle command-line interface. The repository includes all bundled native assets required to produce a functional APK.

Prerequisites

Make sure the following tools and SDK components are installed before building:
  • Android Studio (latest stable recommended) or Gradle 8+ CLI
  • Android SDK with API 36 (compileSdk = 36 and targetSdk = 36 in nebulaApp/build.gradle.kts); minSdk = 26 (Android 8.0 Oreo) is the minimum supported device API level
  • Android NDK version 28.2.13676358 — required to compile the C++ JNI sources under nebulaApp/src/main/jni/
  • CMake 3.22.1 — used to build the three native libraries (libfusion, libmain, libnebulahook)
  • Java 11 — both sourceCompatibility and targetCompatibility are set to VERSION_11 in the app module
  • The bundled BepInEx-arm64.zip and dotnet-arm64.zip runtime assets are already checked in to nebulaApp/src/main/assets/ — no separate download is needed

Cloning and Building

1

Clone the repository

git clone https://github.com/Nebula-Modmakers/Nebula-Launcher.git
cd Nebula-Launcher
2

Open in Android Studio or build from the command line

Android Studio: Open the cloned directory as a project. Android Studio will sync Gradle automatically. Use Build → Make Project or run the assembleDebug task from the Gradle panel.Gradle CLI:
./gradlew :nebulaApp:assembleDebug
3

Locate the output APK

After a successful build, the debug APK is written to:
nebulaApp/build/outputs/apk/debug/
Install it on a connected device with adb install nebulaApp/build/outputs/apk/debug/nebulaApp-debug.apk.

Release Signing

Release builds are signed when all four environment variables below are present and non-empty. When any variable is missing the production signing config is simply not created, and the release variant falls back to the default unsigned behavior.
Environment variablePurpose
NEBULA_RELEASE_STORE_FILEAbsolute path to the keystore file (.jks or .p12)
NEBULA_RELEASE_STORE_PASSWORDPassword for the keystore
NEBULA_RELEASE_KEY_ALIASAlias of the signing key within the keystore
NEBULA_RELEASE_KEY_PASSWORDPassword for the signing key
Set the variables and run the release task:
export NEBULA_RELEASE_STORE_FILE=/path/to/keystore.jks
export NEBULA_RELEASE_STORE_PASSWORD=secret
export NEBULA_RELEASE_KEY_ALIAS=release
export NEBULA_RELEASE_KEY_PASSWORD=secret
./gradlew :nebulaApp:assembleRelease
Release builds enable all four APK signing schemes — v1 (JAR), v2 (APK Signature Scheme v2), v3 (APK Signature Scheme v3), and v4 (APK Signature Scheme v4) — for maximum device compatibility. Code shrinking (isMinifyEnabled) is disabled for release builds.

Key Modules

The Gradle project contains two modules and three native libraries:
Module / libraryDescription
:nebulaAppThe main application module. Contains all Java sources, assets, and the JNI CMake project.
:lsplantBundled third-party ART hook library vendored under third_party/lsplant (LGPL-3.0-only, commit 84256d4cb51abd79280da5c29437fb7004391667).
libfusionNative FusionCore bridge library (src/main/jni/fusion/).
libmainNative entry-point library (src/main/jni/main/).
libnebulahookNative Nebula hook library (src/main/jni/nebulahook/).
All three native libraries are built together by the CMake project at nebulaApp/src/main/jni/CMakeLists.txt.

ABI Filtering

The build is configured for arm64-v8a only:
// nebulaApp/build.gradle.kts
defaultConfig {
    ndk {
        abiFilters.add("arm64-v8a")
    }
}
Builds for other ABIs (e.g. x86_64, armeabi-v7a) are not supported. The arm64-v8a debug symbols are retained in the packaged APK via keepDebugSymbols.

Running Tests

Unit tests live in nebulaApp/src/test/ and can be run without a connected device:
./gradlew :nebulaApp:test
The test suite includes:
  • ModCatalogClientTest.java — tests catalog parsing, URL validation, hash format checks, and license validation logic in ModCatalogClient.
  • LibUnityDownloaderTest.java — tests Unity library resolution and download logic in the dev.allofus.fusioncore package.
Test results are written to nebulaApp/build/reports/tests/testDebugUnitTest/.
The Google Services file (google-services.json) is required for Firebase Authentication. The file checked in to the repository is configured for the production Nebula Firebase project. If you are developing your own fork or need a separate authentication backend, you must create your own Firebase project, register the dev.tates.nebula application ID (or your own), download its google-services.json, and replace the file at nebulaApp/google-services.json before building.

Build docs developers (and LLMs) love