Files
MeshChatX/android/app/build.gradle

195 lines
6.6 KiB
Groovy

plugins {
id 'com.android.application'
id 'com.chaquo.python'
}
def repoRoot = rootProject.projectDir.parentFile
def meshchatSourceDir = new File(repoRoot, "meshchatx")
def repositoryBundledWheelsDir = new File(meshchatSourceDir, "public/repository-server-bundled/bundled")
def chaquopyBuildPython = System.getenv("CHAQUOPY_BUILD_PYTHON")
def pythonTempDir = new File(buildDir, "python-tmp")
def vendorWheelDir = new File(rootProject.projectDir, "vendor")
def lxstPatchedWheel = new File(rootProject.projectDir, "vendor/lxst-0.4.6-py3-none-any.whl")
def allAndroidAbis = ["arm64-v8a", "x86_64", "armeabi-v7a"]
def selectedAndroidAbis = (
project.findProperty("meshchatxAbis")
?: System.getenv("MESHCHATX_ABIS")
?: allAndroidAbis.join(",")
).split(",").collect { it.trim() }.findAll { it }
if (selectedAndroidAbis.isEmpty()) {
throw new org.gradle.api.GradleException("No Android ABIs selected. Use -PmeshchatxAbis or MESHCHATX_ABIS.")
}
def invalidAndroidAbis = selectedAndroidAbis.findAll { !allAndroidAbis.contains(it) }
if (!invalidAndroidAbis.isEmpty()) {
throw new org.gradle.api.GradleException("Unsupported ABIs: ${invalidAndroidAbis}. Supported: ${allAndroidAbis}")
}
def meshchatxAbiPackaging = (
project.findProperty("meshchatxAbiPackaging")
?: System.getenv("MESHCHATX_ABI_PACKAGING")
?: "universal"
).toString().trim().toLowerCase()
if (meshchatxAbiPackaging != "universal" && meshchatxAbiPackaging != "split") {
throw new org.gradle.api.GradleException(
"meshchatxAbiPackaging must be 'universal' or 'split' (got '${meshchatxAbiPackaging}'). " +
"Use -PmeshchatxAbiPackaging=... or MESHCHATX_ABI_PACKAGING."
)
}
def enableAbiSplits = meshchatxAbiPackaging == "split" && selectedAndroidAbis.size() > 1
android {
namespace 'com.meshchatx'
compileSdk 34
defaultConfig {
applicationId "com.meshchatx"
minSdk 24
targetSdk 34
versionCode 1
versionName "3.1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
abiFilters(*selectedAndroidAbis as String[])
}
}
splits {
abi {
enable enableAbiSplits
reset()
if (enableAbiSplits) {
include(*selectedAndroidAbis as String[])
}
universalApk enableAbiSplits
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
tasks.register("fetchRepositoryBundledWheels", Exec) {
workingDir = repoRoot
def pyExe = (System.getenv("MESHCHATX_FETCH_PYTHON") ?: "python3")
commandLine(pyExe, "scripts/build/fetch_repository_wheels.py")
ignoreExitValue = false
onlyIf {
if (System.getenv("MESHCHATX_SKIP_REPOSITORY_WHEELS_FETCH") == "1") {
return false
}
if (!repositoryBundledWheelsDir.isDirectory()) {
return true
}
def names = repositoryBundledWheelsDir.list()
return names == null || !names.any { it.endsWith(".whl") }
}
}
tasks.register("syncMeshchatPython", Sync) {
dependsOn("fetchRepositoryBundledWheels")
if (!meshchatSourceDir.exists()) {
throw new org.gradle.api.GradleException("Missing meshchatx source directory at ${meshchatSourceDir}")
}
doFirst {
delete(
file("$projectDir/src/main/python/meshchatx"),
file("$projectDir/src/main/python/LXST"),
file("$projectDir/src/main/python/LXMF"),
file("$projectDir/src/main/python/RNS")
)
}
from(meshchatSourceDir)
includeEmptyDirs = false
from(new File(repoRoot, "CHANGELOG.md"))
into(file("$projectDir/src/main/python/meshchatx"))
}
tasks.configureEach { task ->
if (task.name.toLowerCase().contains("merge") && task.name.toLowerCase().contains("pythonsources")) {
task.dependsOn(tasks.named("syncMeshchatPython"))
}
}
tasks.configureEach { task ->
if (task.name.toLowerCase().contains("python")) {
task.doFirst {
if (!pythonTempDir.exists()) {
pythonTempDir.mkdirs()
}
if (task.metaClass.respondsTo(task, "environment", String, Object)) {
task.environment("TMPDIR", pythonTempDir.absolutePath)
task.environment("TEMP", pythonTempDir.absolutePath)
task.environment("TMP", pythonTempDir.absolutePath)
}
}
}
}
chaquopy {
defaultConfig {
version "3.11"
if (chaquopyBuildPython != null && !chaquopyBuildPython.trim().isEmpty()) {
buildPython chaquopyBuildPython
}
pip {
if (!vendorWheelDir.exists()) {
throw new org.gradle.api.GradleException("Missing vendor wheel directory at ${vendorWheelDir}")
}
options "--find-links", vendorWheelDir.absolutePath
install "packaging>=23"
install "aiohttp==3.13.3"
install "rns>=1.1.5"
install "lxmf>=0.9.4"
install "numpy==1.26.2"
install "chaquopy-libcodec2==1.2.0"
install "pycodec2==4.1.1"
install "miniaudio==1.70"
if (!lxstPatchedWheel.exists()) {
throw new org.gradle.api.GradleException("Missing patched LXST wheel at ${lxstPatchedWheel}")
}
install lxstPatchedWheel.absolutePath
install "psutil>=7.2.2"
install "websockets>=16.0"
install "bcrypt==3.1.7"
install "aiohttp-session>=2.12.1,<3.0.0"
install "cryptography==46.0.7"
install "pycparser>=3.0"
install "pyserial>=3.5"
install "jaraco.context>=6.1.1"
install "ply>=3.11,<4.0"
}
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.10.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.webkit:webkit:1.8.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}