Запуск Linux приложений на android. Часть 2

Итак, в первой части  мы говорили о том какие пакеты нам нужны и как их собрать в zip файл пакета обновлений андроид.

Библиотеки портированные на андроид

Несмотря на то что android не является в полной мере POSIX-совместимой ОС, под него все же были портированы некотороые из библиотек, доступных десктопной Linux. Посмотрим, что это за библиотеки.

  • SDL — удобная обертка вокруг низкоуровневых мультимедиафункций, используется в основном для разработки игр.
  • FFmpeg — конвертация большинства аудио и видеоформатов.
  • Qt — начиная с пятой версии, Qt доступна и под андроид.
  • Unity — игровой движек.
  • Ogre — обертка вокруг OpenGL для работы с 3D графикой

В общем, с точки зрения портирования приложений выбрать из чего есть.

Bash

Bash собирать с помощью тулчейна Linaro очень легко — скачиваем исходники с официального FTP и распаковываем:

$ wget http://ftp~ gnu.org/gnu/bash/bash-4.3.30.tar.gz
$ tar xzvf bash-4.2.53.tar.gz && cd bash-4.3.30

Выполняем скрипт configure и собираем:

$ ./configure --host=arm-linux --enaЬle-static-link - -without-bash -malloc --disble-rpath--disable-nls
$ make

После сборки появится файл bash, который мы оперативно копируем на устройство в системный каталог /system/xbin.
Стоит дать комментарии, почему bash нужно компилировать с помощью тулчейна Linaro. В Bionic, стандартной реализации библиотеки libc в Android, отсутствуют некоторые РОSIХ-совместимые функции, используемые bash (такие, например, как mkfifo() или wctomb()). Соответственно, собрать bash с использованием этой библиотеки без танцев с бубном не выйдет.

[ad name=»Umi 600×217″]

В Linaro же, с другой стороны , используется стандартная РОSIХ- совместимая библиотека
glibc. Поскольку мы собираем bash статически, нам все равно, что используется в Android, — главное, чтобы версия glibc, с которой мы собираем, подошла к ядру. Впрочем, сегодня обратное маловероятно.

Bash, запущенный пoд Android

Lshw

Lshw — удобная консольная утилита, позволяющая быстро собрать информацию о всем доступном железе. Компилировать ее (опять же используя Linaro) достаточно просто. Скачиваем последнюю версию, распаковываем и заменяем в фай л ах src/Makefile и src/core/Makefile компилятор С++ на компилятор от Linaro (перемен н ой СХХ нужно присвоить значение arm-unknownlinux-gnueabi-g++), добавив также опцию —static в CXXFLAGS. Затем собираем обычным образом.

Сеанс SSН-соединения с Android. Для разделения терминала используется tmux. В левой части можно увидеть вывод lshw

Htop

Это достаточно удобный консольный менеджер процессов для Linux. Для вывода информации он использует библиотеку ncurses, так что для его компиляции потребуется чуть больше времени . Создаем каталог htop, переходим в него и скачиваем ncurses:

$ mkdir htop && cd $_
$ wget http://ftp.gnu. org/pub/gn uL ncursesLncurses-5.9.tar ~gz_
$ tar xzvf ncurses-5.9.tar .gz
$ cd ncurses-5.9

Устанавливаем переменную $SYSROOT_ADDITIONS, запускаем configure с нужными параметрами и собираем:

$ export SYSROOT_ADDITIONS=${HOME}Lhtop/rootdir
$ ./configure --with-normal --without-shared--without-cxx-bindin--enaЫe-root-environ--disaЫe-widec --disaЫe-GPM --without-ada--without-tests --host=arm-linux --prefix=$SYSROOT ADDITIONS
$ make && make install

Поскольку нам нет смысла включать поддержку юникода и мыши и мы не собираемся делать эту библиотеку динамической, от ключаем эти опции (а также отключаем поддерж ку языка Ada).
Скачиваем и распаковываем сам htop, предварительно перейдя на уровень выше:

$ cd..
$ wget http://hisham.hm/htop/releases/1.0.3/htop-1.0.3 .tar.gz
$ tar xzvf htop-1.0.3.tar.gz
$ cd htop-l.0.3

Вновь переопределяем переменные окружения для сборки :

$ export CPPFLAGS=" --sysroot=$LINARO_SYSROOT"
$ export CFLAGS="--static -I${SYSROOT_ADDITIONS}/include --sysroot=$LINARO_SYSROOT"
$ export CXXFLAGS="--sysroot=$LINARO SYSROOT"
$ export LDFLAGS="-L${SYSROOT_ADDITIONS}/  ncurses-5.9Llib --sysroot=$LINARO_SYSROOT"
$ export LIBS="${SYSROOT_ADDITIONS}/lib/libncurses.a"

Конфигурируем и собираем:

$ ./configure --host=arm --enble-static --disable-unicode
$ make

Все бы хорошо, но после попытки запуска на устройстве вываливается ошибка «Error opening terminal: screen». Лечится это просто — достаем откуда-нибудь каталог terminfo (я его выдернул из Terminal IDE, просто потому, что он оказался под рукой) , копируем в /system/etc и выполняем в терминале на гаджете следующую команду:

# export TERМINFO=/system/etc/terminfo

После этого htop запустится без заморочек.

Htop, запущенный под Android

Tmux

Tmux — это менеджер терминалов и более продвинутая альтернатива известного всем админам screen, созданная руками разработчиков OpenBSD. В случае с операционной системой Android его удобно использовать для работы с устройством через adb shell или SSH (например, ходить на TV Вох или НDМI стик под управлением Android).

Для компиляции tmux нам понадобится все та же ncurses,  ее можно взять из предыдущей сборки, скопировав каталог rootdir. Помимо ncurses, потребуется библиотека libevent. Создаем каталог tmux, устанавливаем переменную $SYSROOT_ADDITIONS и скачиваем libevent и сам tmux:

$ export SYSROOT_ADDITIONS-${HOME}/tmux/rootdir
$ git clone https://github.com/libevent/libevent.git
$ git clone git://git.code.sf.net/p/tmux/tmux-code

Собираем libevent:

$ cd ../libevent
$ ./autogen.sh
$ ./configure --host=arm-linux --disable-shared --disable-openssl --disable-samples-prefix=$SYSROOT_ADDITIONS
$ make && make install

Подготавливаемся к сборке tmux:

И наконец, собираем сам tmux:

$ ./configure --еnable-static --host=arm-linux && make

После сборки и заливки исполняемого файла перед запуском tmux, помимо п еременной TERMINFO, нужно определить переменную TMPDIR — лично я использовал /data/local/tmp.

# export TEBMINFO=/system/etc/terminfo
# export TMPDIR=/data/local/tmp

Стоит заметить , что tmux может работать только от рута, потому что права доступа не позволяют писать в вышеуказа нную папку кому попало.

[ad name=»UMI 600×313″]

Ngrep

А это крайне полезная утилита , позволяющая отлавливать пакеты с заданным паттерном (может быть нужно, например, для отладки RЕSТful-приложений). Для ее сборки п отребуется собрать еще и libpcap. Как обычно, создаем каталог, куда и скачиваем libpcap, распаковываем его и собираем:

$ mkdir ngrep && cd $_
$ wget http://www.tcpdump.org/release/libpcap-1.6.2.tar.gz
$ tar xzvf libpcap-1.6.2.tar.gz
$ cd libpcap-1 .6.2
$ export SYSROOT_ADDITIONS=${HOME }/ngrep/rootdir
$ ./configure --host-arm-linux --disable-shared --witch-pcap=linux --disable-dbus --prefix=$SYSROOT_ADDITIONS
$ make && make install

С качиваем сам ngrep, распаковываем, собираем :

Разберем опции обоих configure. В случае с libpcap мы отключили поддержку 0-Bus по понятной причине отсутствия его в Android и указали тип захвата пакетов (поскольку компилируем мы в конечном итоге под Linux, то и тип захвата ставим соответствующий). Для ngrep же мы указали путь к заголовочным файлам libpcap и отключили понижение привилегий по причине отсутствия файла /etc/passwd в Android, куда эта функциональность смотрит.

Перехватываем пакеты, содержащие слово google, используя ngrep

LINUX DEPLOY

Компиля ция программ может занять немало времени, да и не всякое приложение можно с легкостью собрать (например, текстовый tоrrеnt-клиент rtorrent потребует сборку liЬtorrent , а эта библиотека, в свою очередь, потянет за собой Boost). И если для пары -тройки приложений это не столь критично, то в случае сборки большего количества трудозатраты становятся слишком велики.

Да и сами приложения в случае статической компоновки могут раздуваться до невообразимых размеров. Однако есть решение и для этой ситуации — Linux Deploy, который с легкостью можно найти в Google Play.

Поскольку Android построен на базе ядра Linux, а изменения в нем не настолько сильны, чтобы мешать запуску обычных РОSIХ-приложений (что и было продемонстрировано выше), существует возможность развертывания сhrооt-окружения (с пробросом соответствующих псевдофайловых систем) и установки в не м userland-чacти дистрибутивов, подде рживающих архитектуру ARM. Приложение Linux Deploy делает именно это, создавая образ и монтируя его как lоор-устройство.

Поддерживаются следующие дистрибутивы:
· Ubuntu;
· OpenSUSE;
· Fedora;
· Arch Linux;
· Gentoo;
· и, наконец, Kali Linux (его наличие, несомненно, обрадует пентестеров) .

Для входа в систему существует два метода: по SSH и через VNC. При наличии SSH-cepвepa в самом Android в Linux Deploy нужно либо его отключить, либо переопределить порт. А если использовать VNC, необходимо доустановить в Android VNС-клиент (рекомендую bVNC).

В данном контейнере можно п роизводить практически те же действия, что и в обычном настольном дистрибутиве Linux, — со скидкой на поддержи ваемую ядром функциональность. Замечу, что контейнер не изолирован от основной системы, и запуск служб в некоторых дистрибутивах не поддерживается по причине использования в них современных систем инициализации. Также стоит помнить, что приложения в контейнере нативные, — это изрядно
кушает батарею.

Заключение

В статье были описаны два (а если считать компиляцию ядра с модулями, то три) метода расширения функциональности на Android. Подведем итоги. Компиляция ядра и модулей имеет смысл только в тех случаях, когда тебе нужна низкоуровневая функциональность — будь то поддержка ФС или, допустим, модуль iptables. В современных стоковых ядрах поддержка загрузки модулей чаще всего отключена, так что для добавления функциональности всяко потребуется компиляция всего ядра.

[ad name=»MiBand2″]

В случае с компиляцией небольших РОSIХ-приложений можно попытаться использовать гугловский NDK, идущий с Bionic и практически несовместимый с POSIX, а можно использовать сторонний тулчейн для архитектуры ARM, в котором, как правило, есть библиотека glibc, и компилировать приложения статически. Однако следует помнить, что статически слинкованное приложение весит достаточно много, таким образом, нелишним будет еще раз подчеркнуть, что этот метод годится лишь для небольших приложений.

Для запуска крупных приложений можно использовать Linux Deploy, позволяющий развернуть на Android полноценную userland-чacть популярных дистрибутивов. Однако и у него есть недостатки. Во-первых, он изрядно кушает батарею, а во-вторых, размер образа с данной userland-чacтью не может быть больше 4 Гб, так что, если раскатал губу на кучу приложений, закатай ее обратно.

В целом же запуск РОSIХ-приложений в Android вполне возможен — что и было показано в статье. А уж каким способом ты будешь что-то делать, ты волен выбирать сам. Stay freedom.

Click to rate this post!
[Total: 13 Average: 3.5]

Специалист в области кибер-безопасности. Работал в ведущих компаниях занимающихся защитой и аналитикой компьютерных угроз. Цель данного блога - простым языком рассказать о сложных моментах защиты IT инфраструктур и сетей.

2 comments On Запуск Linux приложений на android. Часть 2

  • инструкция не плохая но пробелы пойму расставлены абсолютно случайным образом. и зачем заменять англ bl на русскую Ы.
    собрал на андроид sed и ncurses (динамические библиотеки последней собрать правда не вышло, но они и не нужны, кто муже libncurses.so в моей прошивке встроенна. сейчас хочу собрать grep sed coreutils findutils и т.д.)
    попутно появляються странные идее по сборке grub и xorg но пока это для меня невозможно
    тулчейн я собрал сам, так как в linaro gcc 7 (использовать не последнюю версию ПО мне религия не позволяет 🙂 )
    а в ndk сейчас вообще clang вместо gcc

    • и еще конечно здорово было бы systemd собрать но боюсь что все сервисы от андроида сломаются
      да и она при статической линковке не влезет.
      интересно, а если собрать glibc на андроид то здохнет все и не все?

Leave a reply:

Your email address will not be published.