diff --git a/app/build.gradle b/app/build.gradle
index 1c6045b4..64e96bfc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,6 +10,13 @@ ext {
// by replacing $PREFIX since app code is dependant on the variant used to build the APK.
// Currently supported values are: [ "apt-android-7" "apt-android-5" ]
packageVariant = System.getenv("TERMUX_PACKAGE_VARIANT") ?: "apt-android-7" // Default: "apt-android-7"
+ bootstrapMinSdk = packageVariant == "apt-android-5" ? 21 : 24
+ bootstrapMinRelease = packageVariant == "apt-android-5" ? "5.0" : "7.0"
+ bootstrapMaxSdk = packageVariant == "apt-android-5" ? 23 : null
+ bootstrapMaxRelease = packageVariant == "apt-android-5" ? "6.0" : null
+
+ buildMinSdk = bootstrapMinSdk
+ buildTargetSdk = project.properties.targetSdkVersion.toInteger()
}
android {
@@ -39,14 +46,20 @@ android {
defaultConfig {
applicationId "com.termux"
- minSdkVersion project.properties.minSdkVersion.toInteger()
- targetSdkVersion project.properties.targetSdkVersion.toInteger()
+ minSdk buildMinSdk
+ targetSdk buildTargetSdk
versionCode 1020
versionName "0.119.0-beta.1"
if (appVersionName) versionName = appVersionName
validateVersionName(versionName)
+ buildConfigField "Integer", "TERMUX_APP__BOOTSTRAP_MIN_SDK", project.ext.bootstrapMinSdk.toString()
+ buildConfigField "String", "TERMUX_APP__BOOTSTRAP_MIN_RELEASE",
+ project.ext.bootstrapMinRelease ? "\"" + project.ext.bootstrapMinRelease + "\"" : "null"
+ buildConfigField "Integer", "TERMUX_APP__BOOTSTRAP_MAX_SDK", project.ext.bootstrapMaxSdk.toString()
+ buildConfigField "String", "TERMUX_APP__BOOTSTRAP_MAX_RELEASE",
+ project.ext.bootstrapMaxRelease ? "\"" + project.ext.bootstrapMaxRelease + "\"" : "null"
buildConfigField "String", "TERMUX_PACKAGE_VARIANT", "\"" + project.ext.packageVariant + "\"" // Used by TermuxApplication class
manifestPlaceholders.TERMUX_PACKAGE_NAME = "com.termux"
diff --git a/app/src/main/java/com/termux/app/TermuxInstaller.java b/app/src/main/java/com/termux/app/TermuxInstaller.java
index 403ab208..690fc482 100644
--- a/app/src/main/java/com/termux/app/TermuxInstaller.java
+++ b/app/src/main/java/com/termux/app/TermuxInstaller.java
@@ -10,10 +10,12 @@ import android.system.Os;
import android.util.Pair;
import android.view.WindowManager;
+import com.termux.BuildConfig;
import com.termux.R;
import com.termux.shared.file.FileUtils;
import com.termux.shared.shell.command.ExecutionCommand;
import com.termux.shared.shell.command.runner.app.AppShell;
+import com.termux.shared.termux.TermuxBootstrap;
import com.termux.shared.termux.crash.TermuxCrashUtils;
import com.termux.shared.termux.file.TermuxFileUtils;
import com.termux.shared.interact.MessageDialogUtils;
@@ -104,6 +106,12 @@ final class TermuxInstaller {
return;
}
+ if (!checkIfMinOrMaxSdkVersionIsIncompatible(activity,
+ BuildConfig.TERMUX_APP__BOOTSTRAP_MIN_SDK, BuildConfig.TERMUX_APP__BOOTSTRAP_MIN_RELEASE,
+ BuildConfig.TERMUX_APP__BOOTSTRAP_MAX_SDK, BuildConfig.TERMUX_APP__BOOTSTRAP_MAX_RELEASE)) {
+ return;
+ }
+
// If prefix directory exists, even if its a symlink to a valid directory and symlink is not broken/dangling
if (FileUtils.directoryFileExists(TERMUX_PREFIX_DIR_PATH, true)) {
if (TermuxFileUtils.isTermuxPrefixDirectoryEmpty()) {
@@ -271,6 +279,42 @@ final class TermuxInstaller {
}.start();
}
+ public static boolean checkIfMinOrMaxSdkVersionIsIncompatible(Activity activity,
+ Integer minSdk, String minRelease,
+ Integer maxSdk, String maxRelease) {
+ if (minSdk != null && Build.VERSION.SDK_INT < minSdk) {
+ String bootstrapErrorMessage = activity.getString(R.string.bootstrap_error_apk_bootstrap_variant_min_sdk_incompatible,
+ MarkdownUtils.getMarkdownCodeForString(TermuxBootstrap.TERMUX_APP_PACKAGE_VARIANT.getName(), false),
+ MarkdownUtils.getMarkdownCodeForString(Build.VERSION.RELEASE, false),
+ Build.VERSION.SDK_INT,
+ MarkdownUtils.getMarkdownCodeForString(minRelease, false),
+ minSdk);
+ Logger.logError(LOG_TAG, bootstrapErrorMessage);
+ sendBootstrapCrashReportNotification(activity, bootstrapErrorMessage);
+ MessageDialogUtils.exitAppWithErrorMessage(activity,
+ activity.getString(R.string.bootstrap_error_title),
+ bootstrapErrorMessage);
+ return false;
+ }
+
+ if (maxSdk != null && Build.VERSION.SDK_INT > maxSdk) {
+ String bootstrapErrorMessage = activity.getString(R.string.bootstrap_error_apk_bootstrap_variant_max_sdk_incompatible,
+ MarkdownUtils.getMarkdownCodeForString(TermuxBootstrap.TERMUX_APP_PACKAGE_VARIANT.getName(), false),
+ MarkdownUtils.getMarkdownCodeForString(Build.VERSION.RELEASE, false),
+ Build.VERSION.SDK_INT,
+ MarkdownUtils.getMarkdownCodeForString(maxRelease, false),
+ maxSdk);
+ Logger.logError(LOG_TAG, bootstrapErrorMessage);
+ sendBootstrapCrashReportNotification(activity, bootstrapErrorMessage);
+ MessageDialogUtils.exitAppWithErrorMessage(activity,
+ activity.getString(R.string.bootstrap_error_title),
+ bootstrapErrorMessage);
+ return false;
+ }
+
+ return true;
+ }
+
public static void showBootstrapErrorDialog(Activity activity, Runnable whenDone, String message) {
Logger.logErrorExtended(LOG_TAG, "Bootstrap Error:\n" + message);
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index cbd2992b..8c9cd7ae 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -27,10 +27,18 @@
Installing bootstrap packages…
- Unable to install bootstrap
+ &TERMUX_APP_NAME; Bootstrap Error
&TERMUX_APP_NAME; was unable to install the bootstrap packages.
Abort
Try again
+ The APK bootstrap variant %1$s
+ of currently installed &TERMUX_APP_NAME; app is not compatible with the Android version %2$s
+ (sdk `%3$d`) of the device and it requires minimum Android version %4$s (sdk `%5$d`).
+ \n\nUninstall the &TERMUX_APP_NAME; app and reinstall the correct APK build variant.
+ The APK bootstrap variant %1$s
+ of currently installed &TERMUX_APP_NAME; app is not compatible with the Android version %2$s
+ (sdk `%3$d`) of the device and it requires maximum Android version %4$s (sdk `%5$d`).
+ \n\nUninstall the &TERMUX_APP_NAME; app and reinstall the correct APK build variant.
&TERMUX_APP_NAME; can only be run as the primary user.
\nBootstrap binaries compiled for &TERMUX_APP_NAME; have hardcoded $PREFIX path and cannot be installed
under any path other than:\n%1$s.