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

Всем хороши Android устройства, но порой им крайне не хватает возможностеи и утилит, имеющихся в настольной Linux. Отдельные инструменты, такие как Terminal IDE, частично выручают, но некоторого нужного функционала в них нет. Как же исправить ситуацию?

Как всем известно, Android имеет под собой фундамент в виде ядра Linux. Из этого следует, что в теории на смартфоне можно запустить все те приложения, что доступны на десктопном Линуксе. На практике же все сложнее. Поскольку набор Nаtivе  библиотек в Android отличается от такового на десктопе (не говоря уже об архитектуре платформы), приложения требуется компилировать статически. А иногда еще и патчить. Но и в этом случае работоспособность приложения не всегда гарантирована.
Что касается модулей ядра, которые могут быть весьма полезны на смартфоне (поддержка NTFS, например), то здесь все еще интереснее. Во многих ядрах от вендора отключена функция загрузки модулей (начиная с Android 4.3, это фактически требование Google. )

Поэтому нам придется не только подобрать правильную версию ядра для сборки модулей , но и возможно, пересобрать само ядро, включив такую поддержку, или просто добавить модуль в сам образ ядра. Далее в статье мы рассмотрим , как побороть эти проблемы, и попробуем собрать модули Linux-ядpa и несколько приложений.

Сборка модулей:

Для сборки исключительно модулей без самого ядра можно использовать либо команду make modules, либо если ты включил всего один модуль, следующие команды (вместо net/netfilter подставь каталог собираемого модуля)

make modules_prepare
make M=net/netfilter CFLAGS_MODULE=-fno-pic

ПОДГОТОВКА

Для сборки модулей (ядра) и приложений нам потребуется тулчейн, то есть связка из кросс-компилятора и линковщика, плюс набор стандартных инструментов сборки, которые можно установить из репозитория (пример для Ubuntu):

$ sudo apt-get install git-core gnupg flex bison gperf build-esseлtial zip curl libc6-devlib32ncurses 5-dev xllproto-core-dev libx11 dev:i386 libreadline6dev:i36 libgl1-mesa-glx :i386 lib _ ll-mesa dev g++-multilib mingw32openjdk 6-jdk tofrodos python-markdown
libxml2-utilsxsltproc zlib1g dev:i386 git libtool

Теперь можно установить тулчейн. Их существует как минимум два — стандартный
гугловский NDK и тулчейн от Linaro, куда сильнее оптимизирующий код . Различаются они еще и набором tаrgеt-библиотек — если NDK содержит те библиотеки, которые имеются в Android и, соответственно, могут не подходить для сборки обычных РОSIХ-совместимых приложений, то Linaro включает ми н имальный набор стандартных РОSIХ-библиотек подАRМ, для использования которых в гуглооси понадобится статическая линковка.

Для сборки ядра мы, в целях совместимости, будем использовать первый. Заходим на страничку developer.android.com/tools/sdk/ndk/index.html и, выбрав нужную версию NDK, скачиваем его. Затем устанавливаем на скачанный файл право исполнения и распаковываем:

$ chmod u+x android-ndk-r10c-linux-x86 64.bin
$ ./android-ndk-r10c-linux-x86_64.bin
После сборки и установки ядра должна получиться примерно такая картинка

А вот для сборки программ понадобится и тулчейн от Linaro. Для его получения
проще всего зайти на forum.xda-developers.com/showthread.php?t=2098133
и выбрать билд. Лично я выбрал Linaro GCC 4.6.4-2013.05 (поскольку процессор
у меня не Cortex, то и качал я arm-unknown-linux-gnueabi-linaro_ 4.6.4-2013.05-build_2013_05_18.tar.bz2). Распаковываем и для пущего удобства переименовываем:

$ tar xjvf arm-unknown-linux-gnueabi-linaro_4.6.4-2013.05-build_2013_05_18.tar.bz2
$ mv arm-unknown-linux-gnueabi-linaro_4.6.4-2013.05linaro-toolchain-4.6

Добавим пут ь к тулчейну в ‘-/bashrc (и заод н о определим отдельные переменные,
которые на время компиляции ядра, возможно, и не пригодятся , но в дальнейшем
могут ой как понадобиться):

КОМПИЛЯЦИЯ МОДУЛЕЙ И ЯДРА

Для начала определим, поддерживает ли стоковое ядро модули . Для этого смотрим, есть ли на устройстве файл /proc/modules. В зависимости от этого мы поймем , что делать дальше. В случае если модули поддерживаются , мы берем ванильное ядро той же версии (но лучше, конечно , взять от вендора), конфигурируем его, компилируем только модули, закидываем их в /system/lib/modules и загружаем с помощью команды insmod на устройстве. Если же ядро модулей не поддерживает, можно либо взять готовое кастомное ядро с поддержкой модулей (об этом чи тай в статье «Выбираем кастомное ядро для своего Android-aппapaтa» — goo.gl/glzvZe), либо собрать свое,  включив нужные модули в образ ядра.

Конфигурирование ядра для устройства

В случае самсунговских устройств (у меня как раз такое) исходники ядер лежат на opensource.samsung.com. Для сборки ядра нам понадобится его конфиг.
В некоторых устройствах он находится в файле /proc/config.gz, но, к сожалению, не во всех, поэтому разберем другой метод его получения . После скачивания и распаковки переходим в соответствующий каталог, смотрим файлы, находящиеся в arch/arm/configs/, и выбираем подходящий по архитектуре.

В моем случае там был только один файл — n1a_00_defconfig, но это скорее исключение. Переходим обратно в каталог, куда мы первоначально распаковали
ядро, и набираем следующую команду:

make n1a_00_defconfig

Далее настраиваем ядро с помощью стандартной команды make menuconfig, чтобы включить нужные нам модули.

make -j9 CFLAGS_MODULE=-fno-pic

После сборки нам нужно все получившиеся файлы скопировать в единый каталог:

$ mkdir final
$~cp arch/arm/boot/zimage final
$ find . -name ' *ko' -ехес ер '{}' final ;

Затем в случае полной компиляции нужно собрать файлы в ZIP архив. И не простой а сформированный определенным образом (речь идет о файле обновления для кастомной консоли восстановления). Для этого клонируем с гитхаба шаблон для данного файла:

$ cd final
$ git clone https://github.com/koushLAnyKernel.git
$ ср ./ * .k0  ./AnyKernеl/system/lib/modules/
$ cр ./zlmage . /AnyKernel/kernel/

Поскольку те утилиты, что имеются в этом автоматическом апдейтере, немного
устарели (во всяком случае , на моем пла ншете они завершались с сегфолтом),
нужно их заменить рабочими, которые берем на d-h.st/Rgl, и распаковав, заменяем ими файлы с теми же названиями в каталоге AnyKernel/kernel/ Кроме того, нужно изменить скрипт для автоапдейтера , находящийся в AnyKernel/META-INF/com/google/android/updater-script. В конечном итоге должно получиться примерно следующее :

Путь /dev/block/mmcblk0p9 здесь — та часть, которую необходимо изменить. Это раздел boot, и почти на всех устройствах он будет представлен разными файлами. Чтобы узнать имя файла на своем устройстве, выполни следующую команду:

$ for i in /dev/block/platform/ * /by-name/boot;  do ls -L $i; done

После правки запаковываем каталог:

$ сd AnyKernel && zip  -r AnyKernel.zip *

Затем кидаем файл на устройство и устанавливаем его с помощью кастомного
рекавери (TWRP или CWM).

СБОРКА ПРИЛОЖЕНИЙ

Модули ядра позволяют добавлять функциональность исключительно низкого уровня, которую в общем случае нельзя использовать на п рямую. Для добавления же функциональности, которую можно использовать напрямую, нужно собирать программы, чем мы сейчас и займемся , — попробуем собрать не сколько приложений. Перед сборкой поч т и всех приложений нужно экспортировать ряд целый переменных:

$ export CROSS_COMPILE=$CROSS_COMPILE_LINARO
$ export CC=arm-unknown-linux-gnueabi-gcc
$ ехроrt СРР=аrm-unknown-linux-gnueabi -cpp
$ export CXX=arm-unknown-linux-gnueabi-g++
$ export LD=arm-unknown-linux- nueabi-ld
$ export AS=arm-unknown-linux -gnueabi-as
$ export AS=arm-unknown-linux -gnueabi-ar
$ export RANLIB=arm-unknown-linux-gnueabi-ranlib
$ export CPPFLAGS="--sysroot=$LINARO_SYSROOT"
$ export CFLAGS=-" - -static  - - sys root =$LINARO_SYSROOT"
$ export CXXFLAGS= ''--sysroot=$LINARO_SYSROOT"
$ export LDFLAGS="--sysroot=$LINARO_SYSROOT"

И лишь затем можно приступать.

Читайте продолжение в следующей статье!

Click to rate this post!
[Total: 12 Average: 3.8]

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

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

Leave a reply:

Your email address will not be published.