Полноценная консоль в маленьком плавающем окне над любыми приложениями Android (проверено на 4.2.2, API 17, armeabi-v7a; minSdk 14):
- PTY-шелл — настоящий
/bin/sh, а не эмуляция построчного ввода; - root через
su(на прошитом планшете — сразу); - ssh-клиент (dropbear), пароли вводятся в терминал, а не в диалог;
- спецклавиши с экранной клавиатуры: стрелки, Ctrl+буква, Tab;
- ANSI-фильтр: вырезает CSI/OSC/цвета, но понимает очистку экрана.
Ставится на любое устройство и работает поверх любого приложения.
Зависимости (Debian/Ubuntu):
apt install openjdk-17-jdk-headless gcc-arm-linux-gnueabi zipТулчейн (build-tools + android.jar 4.2.2) кладётся в ./android — вне git:
mkdir -p android && cd android
curl -O https://dl.google.com/android/repository/build-tools_r34-linux.zip
curl -O https://dl.google.com/android/repository/android-17_r03.zip
unzip build-tools_r34-linux.zip # -> android-14: aapt2, d8, zipalign, apksigner
unzip android-17_r03.zip # -> android-4.2.2: android.jar
cd ..
./build.sh # -> RezkaConsole.apkЕсли тулчейн уже есть в другом месте — ANDROID_TOOLCHAIN=/путь ./build.sh
(по умолчанию ищется ./android, затем ~/android-toolchain).
Ключ подписи берётся из $ANDROID_TOOLCHAIN/debug.keystore (создаётся сам,
пароль android), переопределяется через KEYSTORE=/путь/к.jks.
Конвейер без gradle и IDE: aapt2 → javac → d8 → zip → zipalign → apksigner.
adb install -r RezkaConsole.apkPackage намеренно оставлен org.rezka.console, чтобы обновление вставало
поверх уже установленной консоли (смена package = только удалять и ставить
заново, вместе с настройками).
- Запустить приложение — появится маленькое окно терминала поверх экрана.
- Окно таскается за заголовок, размер — углами; шелл при этом переживает пересоздание поверхности (PTY живёт в сервисе).
- Строка ввода — снизу; спецклавиши на экранной клавиатуре транслируются
в сырые байты: стрелки
ESC[A-D, Ctrl+буква0x01–0x1A, Tab — дополнение набранного. Backspace не перехватывается (правится локально).
src/org/rezka/console/ConsoleService.java — сервис с PTY, MainActivity —
окно. Ключевые решения:
- PTY через jni/pty.c — голые syscalls (
-nostdlib), потому что libc планшета 4.2 несовместима с хост-тулчейном. suс чистым env безUSER— mkshrc прошивки берёт имя пользователя из переменной окружения, а не изid: сUSER=u0_aXXпромпт врал даже под root.- Спецклавиши перехватываются на строке ввода и уходят в PTY байтами,
а не через
KeyEventв шелл. - ANSI-фильтр вырезает escape-последовательности, но
ESC[J,ESC[2J,ESC[3Jстирают экран — иначеclearи полноэкранные программы ломают вывод.
-Wl,--hash-style=sysv -Wl,--build-id=noneобязательны: linker Android 4.2 не знает.gnu.hash, приdlopen— SIGSEGV без внятной ошибки.- Без
android.permission.INTERNETсокеты не создаются вообще — ssh падает сEPERMещё до connect. - Без
<supports-screens android:anyDensity="true">планшет включает compatibility mode, метрики врут (455×320), окно 300×380dp раздувается в 1350×1710px и уезжает за экран. SYSTEM_ALERT_WINDOWна 4.x выдаётся при установке, отдельного диалога нет.
Личное поделие под собственные древние устройства. Код как есть, гарантий нет.