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. Если вам нужен аудит безопасности, разработка кастомных модулей или поддержка инфраструктуры, наша команда готова помочь.