From ee011fed73eab0a270d72df9f7d861f522d3372b Mon Sep 17 00:00:00 2001 From: Raymond Lai Date: Thu, 15 Jan 2026 00:06:46 +0800 Subject: [PATCH 1/3] Build improvements - Remove JCenter repo since it's no longer available - Created new version catalog for tool versions - Added setupRustAndroidLocal task for easier setup environment for compiling Rust module in file_operations - Update NDK to current stable version 29 --- .github/workflows/android-build.yml | 2 +- .../android-debug-artifact-ondemand.yml | 2 +- .../android-debug-artifact-release.yml | 2 +- .github/workflows/android-feature.yml | 2 +- .github/workflows/android-main.yml | 2 +- app/build.gradle | 5 ++- build.gradle | 1 - commons_compress_7z/build.gradle | 2 +- file_operations/build.gradle | 17 +++++++--- file_operations/setup_rust_android.sh | 2 +- gradle/libs.versions.toml | 2 -- gradle/setupRustAndroidLocal.gradle | 31 +++++++++++++++++++ gradle/tools.versions.toml | 4 +++ portscanner/build.gradle | 4 +-- settings.gradle | 8 +++++ 15 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 gradle/setupRustAndroidLocal.gradle create mode 100644 gradle/tools.versions.toml diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index d953fe0fdc..ff2cba2aa2 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -24,7 +24,7 @@ jobs: - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: - ndk-version: r28c + ndk-version: r29 link-to-sdk: true local-cache: true - name: Install Rust diff --git a/.github/workflows/android-debug-artifact-ondemand.yml b/.github/workflows/android-debug-artifact-ondemand.yml index 4dd72ba16b..b9af2d8269 100644 --- a/.github/workflows/android-debug-artifact-ondemand.yml +++ b/.github/workflows/android-debug-artifact-ondemand.yml @@ -43,7 +43,7 @@ jobs: - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: - ndk-version: r28c + ndk-version: r29 link-to-sdk: true local-cache: true - name: Install Rust diff --git a/.github/workflows/android-debug-artifact-release.yml b/.github/workflows/android-debug-artifact-release.yml index e837df793f..86625be6b6 100644 --- a/.github/workflows/android-debug-artifact-release.yml +++ b/.github/workflows/android-debug-artifact-release.yml @@ -17,7 +17,7 @@ jobs: - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: - ndk-version: r28c + ndk-version: r29 link-to-sdk: true local-cache: true - name: Install Rust diff --git a/.github/workflows/android-feature.yml b/.github/workflows/android-feature.yml index 1d09082ab2..7187f476bd 100755 --- a/.github/workflows/android-feature.yml +++ b/.github/workflows/android-feature.yml @@ -26,7 +26,7 @@ jobs: id: setup-ndk uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: - ndk-version: r28c + ndk-version: r29 link-to-sdk: true local-cache: true - name: Setup Gradle diff --git a/.github/workflows/android-main.yml b/.github/workflows/android-main.yml index fe469c727c..d7338cd3a7 100644 --- a/.github/workflows/android-main.yml +++ b/.github/workflows/android-main.yml @@ -25,7 +25,7 @@ jobs: - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: - ndk-version: r28c + ndk-version: r29 link-to-sdk: true local-cache: true - name: Setup Gradle diff --git a/app/build.gradle b/app/build.gradle index 3c380ce487..ea1245b7c7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ apply plugin: 'com.google.devtools.ksp' android { namespace "com.amaze.filemanager" - compileSdk libs.versions.compileSdk.get().toInteger() + compileSdk tools.versions.compileSdk.get().toInteger() packagingOptions { resources { excludes += ['proguard-project.txt', 'project.properties', 'META-INF/LICENSE.txt', 'META-INF/LICENSE', 'META-INF/NOTICE.txt', 'META-INF/NOTICE', 'META-INF/DEPENDENCIES.txt', 'META-INF/DEPENDENCIES', 'META-INF/versions/9/OSGI-INF/MANIFEST.MF'] @@ -99,7 +99,7 @@ android { } kotlinOptions { - jvmTarget = '17' + jvmTarget = tools.versions.jvmTarget.get() } testOptions { @@ -336,5 +336,4 @@ repositories { google() mavenCentral() maven { url "https://jitpack.io" } - maven { url "https://jcenter.bintray.com" } } diff --git a/build.gradle b/build.gradle index 379e3c33b2..6e5aad4eb1 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,6 @@ allprojects { google() mavenCentral() maven { url "https://jitpack.io" } - maven { url "https://jcenter.bintray.com" } maven { url "https://repository.liferay.com/nexus/content/repositories/public/"} } tasks.withType(Test).tap { diff --git a/commons_compress_7z/build.gradle b/commons_compress_7z/build.gradle index 74d66012b3..642d5fe926 100644 --- a/commons_compress_7z/build.gradle +++ b/commons_compress_7z/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'kotlin-android' android { namespace "com.amaze.filemanager.filesystem.compressed.sevenz" - compileSdk libs.versions.compileSdk.get().toInteger() + compileSdk tools.versions.compileSdk.get().toInteger() defaultConfig { minSdkVersion libs.versions.minSdk.get().toInteger() diff --git a/file_operations/build.gradle b/file_operations/build.gradle index 5400d64458..0e4e069b05 100644 --- a/file_operations/build.gradle +++ b/file_operations/build.gradle @@ -2,15 +2,16 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'com.google.devtools.ksp' apply plugin: 'org.mozilla.rust-android-gradle.rust-android' +apply from: "../gradle/setupRustAndroidLocal.gradle" android { namespace "com.amaze.filemanager.fileoperations" - compileSdk libs.versions.compileSdk.get().toInteger() - ndkVersion libs.versions.ndk.get() + compileSdk tools.versions.compileSdk.get().toInteger() + ndkVersion tools.versions.ndk.get() defaultConfig { minSdkVersion libs.versions.minSdk.get().toInteger() - ndkVersion libs.versions.ndk.get() + ndkVersion tools.versions.ndk.get() testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" @@ -43,7 +44,7 @@ android { } kotlinOptions { - jvmTarget = '17' + jvmTarget = tools.versions.jvmTarget.get() } } @@ -61,7 +62,7 @@ cargo { } kotlin { - jvmToolchain(17) + jvmToolchain(tools.versions.jvmTarget.get().toInteger()) } // Ensure Rust libraries are built before Android tasks @@ -135,4 +136,10 @@ dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation libs.androidX.appcompat +} + +tasks.matching { + it.name.startsWith('cargoBuild') +}.configureEach { + it.dependsOn 'setupRustAndroidLocal' } \ No newline at end of file diff --git a/file_operations/setup_rust_android.sh b/file_operations/setup_rust_android.sh index 132c3b9551..f52e6b81d0 100755 --- a/file_operations/setup_rust_android.sh +++ b/file_operations/setup_rust_android.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Setup script for Rust Android development # This script: diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8e4f84059f..c3166c6960 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,7 @@ [versions] -compileSdk = "34" minSdk = "21" targetSdk = "35" kotlin = "1.9.25" -ndk = "28.2.13676358" #r28c jacocoAndroid = "0.2.1" gradle = "8.5.2" diff --git a/gradle/setupRustAndroidLocal.gradle b/gradle/setupRustAndroidLocal.gradle new file mode 100644 index 0000000000..8f9956a9a1 --- /dev/null +++ b/gradle/setupRustAndroidLocal.gradle @@ -0,0 +1,31 @@ +tasks.register("setupRustAndroidLocal") { + + onlyIf { System.getenv("GITHUB_ACTIONS") == null } + + doFirst { + println("Setting up Rust for Android build...") + } + + // Detect existence of rustup. + def rustupExists = exec { + commandLine("which", "rustup") + ignoreExitValue true + }.exitValue == 0 + + if (!rustupExists) { + println("rustup not found. Installing rustup...") + exec { + commandLine("sh", "-c", + "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y -v --default-toolchain none --no-modify-path" + ) + } + } + + doLast { + exec { + workingDir file(rootProject.project("file_operations").projectDir) + commandLine("env", "bash", "setup_rust_android.sh") + } + println("Rust targets for Android have been set up successfully.") + } +} \ No newline at end of file diff --git a/gradle/tools.versions.toml b/gradle/tools.versions.toml new file mode 100644 index 0000000000..f15cdd77a5 --- /dev/null +++ b/gradle/tools.versions.toml @@ -0,0 +1,4 @@ +[versions] +compileSdk = "34" +jvmTarget = "17" +ndk = "29.0.14206865" #r29 \ No newline at end of file diff --git a/portscanner/build.gradle b/portscanner/build.gradle index ee039f9b63..6a90d132fb 100644 --- a/portscanner/build.gradle +++ b/portscanner/build.gradle @@ -5,7 +5,7 @@ apply plugin: 'kotlin-parcelize' android { namespace 'com.stealthcopter.networktools' - compileSdk libs.versions.compileSdk.get().toInteger() + compileSdk tools.versions.compileSdk.get().toInteger() defaultConfig { minSdk libs.versions.minSdk.get().toInteger() @@ -28,7 +28,7 @@ android { } kotlin { - jvmToolchain(17) + jvmToolchain(tools.versions.jvmTarget.get().toInteger()) } dependencies { diff --git a/settings.gradle b/settings.gradle index 70edc43f9d..4fada0d720 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,11 @@ include ':file_operations' include ':portscanner' include ':app', ':commons_compress_7z' + +dependencyResolutionManagement { + versionCatalogs { + create("tools") { + from(files("gradle/tools.versions.toml")) + } + } +} From 14b9d95364fd00f58077b251df7af42d995963f9 Mon Sep 17 00:00:00 2001 From: Raymond Lai Date: Thu, 15 Jan 2026 22:08:27 +0800 Subject: [PATCH 2/3] Changes on PR feedback - Check rustup on common installation paths and user's $PATH or %PATH% - fail the build if rustup is not found - Use NDK LTS r27d --- .github/workflows/android-build.yml | 2 +- .../android-debug-artifact-ondemand.yml | 2 +- .../android-debug-artifact-release.yml | 2 +- .github/workflows/android-feature.yml | 2 +- .github/workflows/android-main.yml | 2 +- gradle/setupRustAndroidLocal.gradle | 35 +++++++++++++------ gradle/tools.versions.toml | 2 +- 7 files changed, 31 insertions(+), 16 deletions(-) diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index ff2cba2aa2..72776ecdf1 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -24,7 +24,7 @@ jobs: - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: - ndk-version: r29 + ndk-version: r27d link-to-sdk: true local-cache: true - name: Install Rust diff --git a/.github/workflows/android-debug-artifact-ondemand.yml b/.github/workflows/android-debug-artifact-ondemand.yml index b9af2d8269..9fc823c843 100644 --- a/.github/workflows/android-debug-artifact-ondemand.yml +++ b/.github/workflows/android-debug-artifact-ondemand.yml @@ -43,7 +43,7 @@ jobs: - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: - ndk-version: r29 + ndk-version: r27d link-to-sdk: true local-cache: true - name: Install Rust diff --git a/.github/workflows/android-debug-artifact-release.yml b/.github/workflows/android-debug-artifact-release.yml index 86625be6b6..69da331e17 100644 --- a/.github/workflows/android-debug-artifact-release.yml +++ b/.github/workflows/android-debug-artifact-release.yml @@ -17,7 +17,7 @@ jobs: - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: - ndk-version: r29 + ndk-version: r27d link-to-sdk: true local-cache: true - name: Install Rust diff --git a/.github/workflows/android-feature.yml b/.github/workflows/android-feature.yml index 7187f476bd..d35264bb6f 100755 --- a/.github/workflows/android-feature.yml +++ b/.github/workflows/android-feature.yml @@ -26,7 +26,7 @@ jobs: id: setup-ndk uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: - ndk-version: r29 + ndk-version: r27d link-to-sdk: true local-cache: true - name: Setup Gradle diff --git a/.github/workflows/android-main.yml b/.github/workflows/android-main.yml index d7338cd3a7..a2acd7c3b2 100644 --- a/.github/workflows/android-main.yml +++ b/.github/workflows/android-main.yml @@ -25,7 +25,7 @@ jobs: - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: - ndk-version: r29 + ndk-version: r27d link-to-sdk: true local-cache: true - name: Setup Gradle diff --git a/gradle/setupRustAndroidLocal.gradle b/gradle/setupRustAndroidLocal.gradle index 8f9956a9a1..12304d026c 100644 --- a/gradle/setupRustAndroidLocal.gradle +++ b/gradle/setupRustAndroidLocal.gradle @@ -7,18 +7,33 @@ tasks.register("setupRustAndroidLocal") { } // Detect existence of rustup. - def rustupExists = exec { - commandLine("which", "rustup") - ignoreExitValue true - }.exitValue == 0 + def rustupExists = { - if (!rustupExists) { - println("rustup not found. Installing rustup...") - exec { - commandLine("sh", "-c", - "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y -v --default-toolchain none --no-modify-path" - ) + // First check common installation path + def isWindows = System.getProperty("os.name").toLowerCase().contains("windows") + def home = System.getProperty("user.home") + def rustupPath = isWindows + ? new File(home, ".cargo/bin/rustup.exe") + : new File(home, ".cargo/bin/rustup") + + if (rustupPath.exists() && rustupPath.canExecute()) { + return true } + + // If not, check on user $PATH/%PATH% + try { + def process = new ProcessBuilder("rustup") + .redirectErrorStream(true) + .start() + process.waitFor() + return process.exitValue() == 0 + } catch (IOException ignored) { + return false + } + }() + + if (!rustupExists) { + throw new GradleException("rustup is not installed or not found in PATH. Please install rustup from https://rustup.rs/ and ensure it is accessible.") } doLast { diff --git a/gradle/tools.versions.toml b/gradle/tools.versions.toml index f15cdd77a5..58bc22ce88 100644 --- a/gradle/tools.versions.toml +++ b/gradle/tools.versions.toml @@ -1,4 +1,4 @@ [versions] compileSdk = "34" jvmTarget = "17" -ndk = "29.0.14206865" #r29 \ No newline at end of file +ndk = "27.3.13750724" #r27d LTS \ No newline at end of file From cc99f23fb3f123f7b77ab5e9fb3494f3e4fb834e Mon Sep 17 00:00:00 2001 From: Raymond Lai Date: Tue, 24 Mar 2026 23:15:20 +0800 Subject: [PATCH 3/3] Changes per PR feedback Fix script to use NDK version found in tools.versions.toml --- file_operations/setup_rust_android.sh | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/file_operations/setup_rust_android.sh b/file_operations/setup_rust_android.sh index f52e6b81d0..c28abf9087 100755 --- a/file_operations/setup_rust_android.sh +++ b/file_operations/setup_rust_android.sh @@ -35,11 +35,25 @@ find_android_sdk() { fi } -# Function to find the latest NDK version +# Function to find the NDK version (from tools.versions.toml or latest) find_ndk_version() { local sdk_path="$1" local ndk_dir="$sdk_path/ndk" - + local version_catalog="../gradle/tools.versions.toml" + + # First, try to read NDK version from tools.versions.toml + if [ -f "$version_catalog" ]; then + local ndk_version=$(grep "^ndk" "$version_catalog" | cut -d '"' -f 2) + if [ -n "$ndk_version" ] && [ -d "$ndk_dir/$ndk_version" ]; then + echo "$ndk_version" + return + elif [ -n "$ndk_version" ]; then + echo "⚠️ Warning: NDK version $ndk_version specified in tools.versions.toml not found in $ndk_dir" >&2 + echo " Falling back to latest available version..." >&2 + fi + fi + + # Fall back to finding the latest version if [ -d "$ndk_dir" ]; then # Find the latest version (highest version number) ls -1 "$ndk_dir" | sort -V | tail -n 1