OXYGENHUB
# 5ae4af48ddd2 oxygenhub-android / app / build.gradle.kts
4.7 KiB · last changed The hub's API and device sign-in, the token in the Keystore (refs #2) 11 days ago source blame history raw
1
import java.io.File
2
import java.util.Properties
3
4
plugins {
5
    alias(libs.plugins.android.application)
6
    alias(libs.plugins.kotlin.compose)
7
    alias(libs.plugins.kotlin.serialization)
8
}
9
10
// The Rust core (rust-core/, over oxy-core) is built for the app's ABIs by
11
// cargo-ndk and its Kotlin bindings generated by uniffi at build time
12
// (oxygenhub-android#1): nothing built is kept in the repository.
13
val rustCore: File = rootProject.file("rust-core")
14
val rustJniLibs = layout.buildDirectory.dir("rustJniLibs")
15
val rustBindings = layout.buildDirectory.dir("generated/uniffi/kotlin")
16
17
fun androidNdk(): String {
18
    System.getenv("ANDROID_NDK_HOME")?.let { return it }
19
    val props = Properties()
20
    val local = rootProject.file("local.properties")
21
    if (local.exists()) local.inputStream().use { input -> props.load(input) }
22
    val sdk = props.getProperty("sdk.dir") ?: System.getenv("ANDROID_HOME")
23
        ?: error("set sdk.dir in local.properties or ANDROID_HOME")
24
    val ndks = File(sdk, "ndk").listFiles()?.filter { f -> f.isDirectory }?.sortedBy { f -> f.name }.orEmpty()
25
    return ndks.lastOrNull()?.path ?: error("no NDK under $sdk/ndk: install one with the SDK manager")
26
}
27
28
val buildRustCore = tasks.register("buildRustCore", Exec::class) {
29
    description = "Builds rust-core for arm64-v8a and x86_64 with cargo-ndk."
30
    workingDir = rustCore
31
    inputs.dir(rustCore.resolve("src"))
32
    inputs.files(rustCore.resolve("Cargo.toml"), rustCore.resolve("Cargo.lock"))
33
    outputs.dir(rustJniLibs)
34
    environment("ANDROID_NDK_HOME", androidNdk())
35
    commandLine("cargo", "ndk", "-t", "arm64-v8a", "-t", "x86_64", "--platform", "31", "-o", rustJniLibs.get().asFile.path, "build", "--release")
36
}
37
38
val generateRustBindings = tasks.register("generateRustBindings", Exec::class) {
39
    description = "Generates rust-core's Kotlin bindings with uniffi."
40
    dependsOn(buildRustCore)
41
    workingDir = rustCore
42
    inputs.dir(rustJniLibs)
43
    outputs.dir(rustBindings)
44
    commandLine(
45
        "cargo", "run", "--release", "--bin", "uniffi-bindgen", "generate",
46
        "--library", rustJniLibs.get().file("arm64-v8a/librust_core.so").asFile.path,
47
        "--language", "kotlin", "--out-dir", rustBindings.get().asFile.path,
48
    )
49
}
50
51
tasks.named("preBuild") { dependsOn(generateRustBindings) }
52
53
android {
54
    namespace = "io.oxygenhub.android"
55
    compileSdk {
56
        version = release(37)
57
    }
58
59
    defaultConfig {
60
        applicationId = "io.oxygenhub.android"
61
        minSdk = 31
62
        targetSdk = 37
63
        versionCode = 1
64
        versionName = "1.0"
65
66
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
67
    }
68
69
    buildTypes {
70
        release {
71
            optimization {
72
                enable = false
73
            }
74
        }
75
    }
76
    compileOptions {
77
        sourceCompatibility = JavaVersion.VERSION_11
78
        targetCompatibility = JavaVersion.VERSION_11
79
    }
80
    packaging {
81
        jniLibs {
82
            useLegacyPackaging = true
83
        }
84
    }
85
    buildFeatures {
86
        compose = true
87
    }
88
    sourceSets["main"].jniLibs.directories.add(rustJniLibs.get().asFile.path)
89
    sourceSets["main"].kotlin.directories.add(rustBindings.get().asFile.path)
90
}
91
92
dependencies {
93
    implementation(libs.jna) { artifact { type = "aar" } }
94
    implementation(platform(libs.androidx.compose.bom))
95
    implementation(libs.androidx.activity.compose)
96
    implementation(libs.androidx.compose.material3)
97
    implementation(libs.androidx.compose.material3.navigation.suite)
98
    implementation(libs.androidx.compose.material3.adaptive)
99
    implementation(libs.androidx.compose.material3.adaptive.layout)
100
    implementation(libs.androidx.compose.material3.adaptive.navigation)
101
    implementation(libs.androidx.compose.material.icons.extended)
102
    implementation(libs.androidx.compose.ui)
103
    implementation(libs.androidx.compose.ui.graphics)
104
    implementation(libs.androidx.compose.ui.tooling.preview)
105
    implementation(libs.androidx.core.ktx)
106
    implementation(libs.androidx.lifecycle.runtime.ktx)
107
    implementation(libs.androidx.lifecycle.runtime.compose)
108
    implementation(libs.androidx.lifecycle.viewmodel.compose)
109
    implementation(libs.androidx.navigation.compose)
110
    implementation(libs.kotlinx.serialization.json)
111
    implementation(libs.kotlinx.coroutines.android)
112
    implementation(libs.okhttp)
113
    testImplementation(libs.junit)
114
    testImplementation(libs.kotlinx.coroutines.test)
115
    testImplementation(libs.okhttp.mockwebserver)
116
    androidTestImplementation(platform(libs.androidx.compose.bom))
117
    androidTestImplementation(libs.androidx.compose.ui.test.junit4)
118
    androidTestImplementation(libs.androidx.espresso.core)
119
    androidTestImplementation(libs.androidx.junit)
120
    debugImplementation(libs.androidx.compose.ui.test.manifest)
121
    debugImplementation(libs.androidx.compose.ui.tooling)
122
}