We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Написание расширений для Termux с использованием Kotlin и Android NDK

Termux – мощный терминал Linux для Android, который позволяет запускать привычные утилиты и скрипты прямо на мобильном устройстве. Однако иногда требуется расширить его функциональность, добавив собственные нативные модули. В этой статье мы рассмотрим, как создать такие расширения, используя язык Kotlin и набор инструментов Android NDK. Пошагово разберём подготовку среды, компиляцию кода, упаковку в пакет .apk и интеграцию с Termux.

1. Требования и подготовка среды

  • Устройство Android с установленным Termux (версии 0.118+).
  • Android Studio (рекомендованная версия 2023.2.x) с включённым SDK и NDK.
  • JDK 11 или новее.
  • Базовые знания Kotlin и C/C++.

Убедитесь, что в Android Studio установлен компонент NDK (Side by side) и CMake. Их можно добавить через SDK Manager → SDK Tools.

2. Создание проекта

Откройте Android Studio и выберите New → New Project → No Activity. В диалоговом окне укажите:

Project name: termux-extension
Package name: com.example.termuxextension
Language: Kotlin
Minimum SDK: API 21 (Android 5.0)

После создания проекта откройте файл build.gradle (Module: app) и добавьте зависимости для NDK:

android {
    compileSdk = 34
    defaultConfig {
        applicationId = "com.example.termuxextension"
        minSdk = 21
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++17"
            }
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }
    ndkVersion "26.1.10909125"
}
dependencies {
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}

Создайте директорию src/main/cpp и в ней файл CMakeLists.txt со следующим содержимым:

cmake_minimum_required(VERSION 3.22.1)
project(termux_extension LANGUAGES C CXX)
add_library(termux_native SHARED native.cpp)
find_library(log-lib log)
target_link_libraries(termux_native ${log-lib})

Файл native.cpp будет содержать нативный код, вызываемый из Kotlin.

3. Реализация нативного модуля

Пример простого C++‑функционала, который выводит строку в лог Android:

#include 
#include 
#define LOG_TAG "TermuxExt"
#define LOGI(...) android_log_print(ANDROID_LOG_INFO, LOG_TAG, VA_ARGS__)
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_termuxextension_NativeLib_helloFromNative(JNIEnv env, jobject / this /) {
    LOGI("Native code executed");
    return env->NewStringUTF("Привет из нативного кода!");
}

Создайте Kotlin‑класс-обёртку:

package com.example.termuxextension
class NativeLib {
    companion object {
        init {
            System.loadLibrary("termux_native")
        }
    }
    external fun helloFromNative(): String
}

Теперь можно протестировать вызов из MainActivity (или любого другого места):

val native = NativeLib()
val message = native.helloFromNative()
Log.i("TermuxExt", message)

4. Интеграция с Termux

Для того чтобы расширение было доступно в Termux, его необходимо упаковать в .apk, а затем установить в Termux‑окружение через pkg install termux-api и termux-setup-storage. Наиболее удобный способ – собрать standalone‑пакет, содержащий только нативные библиотеки и скрипты.

Создайте скрипт‑обёртку, который будет вызываться из Termux. Например, файл mytool в src/main/assets:

#!/data/data/com.termux/files/usr/bin/bash
# Путь к нативной библиотеке, установленной в приложении
LIB_PATH=$(pm path com.example.termuxextension | grep -o "/data.\.so")
# Запуск нативного кода через app_process
app_process -Djava.class.path=$LIB_PATH com.example.termuxextension.NativeLib

Не забудьте сделать скрипт исполняемым:

chmod +x mytool

После сборки .apk установите его на устройство:

adb install -r app/build/outputs/apk/debug/app-debug.apk

Затем скопируйте скрипт в директорию $HOME/bin внутри Termux и убедитесь, что он находится в $PATH:

cp app/src/main/assets/mytool $HOME/bin/
chmod +x $HOME/bin/mytool

Теперь в Termux можно вызвать ваш новый инструмент:

mytool

5. Сборка Release‑версии

  • В Android Studio переключитесь в режим Release.
  • В build.gradle укажите подпись ключом (keystore).
  • Запустите задачу assembleRelease – полученный .apk будет подписан и готов к распространению.

Для автоматизации CI/CD можно использовать GitHub Actions с предустановленным Android SDK и NDK.

6. Лучшие практики и типичные подводные камни

  • Совместимость ABI: Termux поддерживает несколько архитектур (armeabi‑v7a, arm64‑v8a, x86, x86_64). В CMakeLists.txt укажите APP_ABI или собирайте «fat‑apk» с помощью ndk-build и abiFilters в Gradle.
  • Минимизация зависимостей: Не подключайте тяжелые Android‑библиотеки, если они не нужны в терминальном режиме – это уменьшит размер пакета.
  • Работа с файловой системой Termux: Путь к домашней директории $HOME в Termux отличается от обычного /data/data/…. Используйте переменные среды HOME и EXTERNAL_STORAGE.
  • Отладка нативного кода: Подключите gdb через ndk-gdb или используйте adb logcat для вывода сообщений из android/log.h.

7. Публикация и распространение

Если вы планируете делиться расширением с сообществом, можете разместить .apk в репозитории GitHub Releases или опубликовать в F‑Droid. В описании укажите инструкцию по установке скрипта в Termux и перечень поддерживаемых ABI.

Заключение

Создание расширений для Termux с использованием Kotlin и Android NDK открывает широкие возможности для разработки высокопроизводительных инструментов прямо на Android‑устройстве. Правильная настройка среды, тщательное управление ABI и аккуратная упаковка скриптов позволяют интегрировать нативный код в привычный терминальный workflow.

Профессиональные IT‑услуги в Рыбинске оказывает RybinskLab. Если вам нужен аудит безопасности, разработка кастомных модулей или поддержка инфраструктуры, наша команда готова помочь.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен экспертом RybinskLab.

Поделиться знанием:

Нужна профессиональная помощь?

Меня зовут Усачёв Денис Евгеньевич. Я оказываю IT-услуги в Рыбинске и Ярославской области: настройка серверов, безопасность, автоматизация бизнеса.

Связаться со мной
Поддержать проект