Разработка серверных приложений для Android без Java |
07.05.2014 Александр Савиных |
Речь в данной статье пойдёт не о том, как делать "обычные" приложения для Android, а именно серверные приложения, которые будут работать на андроиде как в линуксе, и это я думаю понравится всем любителям линукса, а так же не любителям Java и Eclipse, так как ни Java, ни Eclipse нам в этой статье не понадобятся.
Что понадобится:
Подробнее о каждом пункте:
Далее понадобится ещё много всяких вещей. О них я буду рассказывать по ходу.
Вначале будем настраивать Free Pascal. Для этого мы будем использовать утилиту для автоматической настройки Free Pascal, которая называется fpcup. Видимо, от слов fpc update, Free Pascal Update.
Если у вас уже есть fpcup, то можно пропустить немного вперёд, а если нет, то нужно отправиться на страницу загрузок и загрузить исполняемый файл fpcup. Для Windows можно загрузить fpcup.exe, не обязательно загружать 64-разрядный fpucp64.exe. Я лично пользовался 32-разрядным. Для Linux обязательно загрузить исполняемый файл, соответствующий разрядности: fpcup_linux_x86 или fpcup_linux_x64. Пользователи линукса, не забудьте выдать себе права на выполнение файла:
chmod a+rwx fpcup_linux_x64
Запустите консоль и зайдите в папку, в которую вы положили fpcup. Пользователи Windows: консоль предпочтительно запускать от имени администратора
Общее правило: если что-то не работает как нужно, попробуйте то же самое, но от имени администратора. Это относится и к Windows, и к Linux, и к Android когда мы зайдём через консоль на Android
Запустите fpcup. Спросят: продолжить или нет? Нажимает нет: n
Теперь перейдём к компиляции компилятора. Для разработки на Android нам понадобится trunk - компилятор, он же транковый, он же нестабильный, он же 2.7.1 в отличие от стабильного 2.6.4 или 2.6.5. Речь о Free Pascal. Давайте создадим скрипт для получения и компиляции компилятора с помощью fpcup. Создавать текстовый файл нужно в той же папке, в в которой лежит fpcup.
Вот текст BAT-скрипта для Windows:
set C=D:\LA rem fpcup --fpcURL=trunk --fpcDIR=%C%\FPC --binutilsdir=%C%\BinUtils --fpcbootstrapdir=%C%\FPCB --only=FPC --cputarget=arm --ostarget=android --crossopt="-CpARMv5 -CfSOFT" fpcup --fpcURL=trunk --fpcDIR=%C%\FPC --binutilsdir=%C%\BinUtils --fpcbootstrapdir=%C%\FPCB --only=FPC
rem обозначает комментарий, то есть, вторая строка у нас сейчас выключена. В чём суть: первая строка назначает в переменную окружения C путь, в который мы хотим устанавливать Free Pascal. Если у вас уже есть установленный Free Pascal или Lazarus, то они никак не будут влиять друг на друга. Во всяком случае, не должны. Если только вы не установите новый Free Pascal в ту же папку, в которой уже что-то стоит. Вторые две строки предназначены соответственно чтобы установить FreePascal trunk для Windows и FreePascal trunk для Android. Дело в том, что сначала нужно скомпилировать FreePascal для Windows, а затем скомпилировать тот же самый FreePascal для Android. Почему? Не важно, главное, что если делать так, то оно работает. Хотя я лично не вижу причин, по которым fpcup не может скомпилировать FreePascal для Android сразу с помощью FreePascal 2.6.2, который оно в любом случае скачивает.
set C=D:\LA
Сюда впишите папку, в которую вы хотите установить новую копию Free Pascal. Например, set C=D:\Development\FreePascalTrunkEdition
Я не рекомендую использовать длинные пути, так как в Windows есть ограничение на длину пути 260 символов, которое вроде как есть, но частично его уже нет, но всё равно оно есть и может проявиться если длина пути в определённый момент вылезет за 260 символов.
Я думаю, что значение параметров, которые передаём для fpcup поянтно. --only=FPC обозначает, что строиться будет только FPC, но не Lazarus. Я использую Lazarus, построенный стабильным компилятором, который у меня установлен в другую папку, а в данный момент нужно построить нестабильный Free Pascal.
После того как назначили путь, запускайте скрипт. Чтобы запустить BAT-скрипт в Windows, следует в консоли перейти в папку, в которой он находится и набрать его название:
D:\App\fpcup_>LA.bat
Перед тем, как набрать Y, проверьте, что установлены правильные параметры. --fpcURL должно быть trunk. Начнётся работа fpcup. Нужно сказать, что работать он будет долго, поэтому если некоторое время новый текст в консоли не выводится, не следует принудительно завершать работу. Скорее всего, скрипт работает, следует просто подождать.
Возможно, что fpcup не будет работать, если не имеется установленного клиента Subversion. В этом случае следует установить клиент Subversion. Я предлагаю установить вот этот клиент: TortoiseSVN
Во время установки следует назначить параметр, отвечающий за то, чтобы путь к исполняемым файлам Subversion был прописан в глобальной переменной окружения PATH. Пользователям Linux тоже может понадобиться установить Subversion. Для Linux ничего прописывать не надо, так как там и так по умолчанию исполняемые файлы Subversion будут видны после установки.
Итак, я надеюсь, что вам удалось установить FreePascal для Windows. Чтобы понять, удалось вам это или не удалось, обратите внимание на вывод fpcup, который вы получили, запустив скрипт.
В конце должно быть написано "fpcup finished". В конце не должно быть слов вроде "failed" или "error". Если же ничего не вышло, то попробуйте установить Subversion, как сказано выше. Если и тогда ничего не получилось, то запустите скрипт опять, но добавьте в скрипте для fpcup ещё один параметр: --verbose
fpcup --fpcURL=trunk --fpcDIR=%C%\FPC --binutilsdir=%C%\BinUtils --fpcbootstrapdir=%C%\FPCB --only=FPC --verbose
Это заставит fpcup выводить большое количество отладочной информации, по которой, возможно, вы сможете понять, из-за чего fpcup не работает как нужно и исправить это.
Чтобы проверить, работает ли скомпилированный Free Pascal, следует вызвать его исполняемый файл, который должен был сохраниться вот в этой папке относительно папки, которую выбрали в качестве установочной: FPC\bin\i386-win32. У меня это D:\LA\FPC\bin\i386-win32.
Если выводится номер версии Free Pascal 2.7.1, то значит, скорее всего, Free Pascal установился правильно. Но это была компиляция Free Pascal для Windows, а теперь нужно скомпилировать кросскомпилятор Free Pascal с Windows на ARM-Android, и для этого потребуется Android NDK. Я загружал 64-разрядную версию Android NDK. Я предполагаю, что разрядность версии Android NDK не имеет значения, и для 64-разрядных компьютеров подойдёт и 32-разрядная, и 64-разрядная версия Android NDK.
Теперь нам нужно сделать следующие манипуляции: путь %NDK% это каталог, в который распаковали Android NDK, у меня это D:\App\ADT\android-ndk-r9c а %FPC% это каталог, в который установили Free Pascal с помощью fpcup, у меня это C:\LA
%NDK%\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin
в %FPC%\cross\bin\arm-android
%NDK%\platforms\android-19\arch-arm\usr\lib
в C:\development\cross\lib\arm-android
Если потом что-то не сработает, то можно попробовать взять вместо этого более старые версии файлов.
%NDK%\toolchains\arm-linux-androideabi-4.6\prebuilt\windows-x86_64
в %FPC%\cross\bin\arm-android
%NDK%\platforms\android-9\arch-arm\usr\lib
в C:\development\cross\lib\arm-android
Теперь переходите к скрипту LA.bat, настало время внести в него изменения: закомментировать последнюю строку и раскомментировать предпоследнюю:
Вот что должно получиться:
set C=D:\LA fpcup --fpcURL=trunk --fpcDIR=%C%\FPC --binutilsdir=%C%\BinUtils --fpcbootstrapdir=%C%\FPCB --only=FPC --cputarget=arm --ostarget=android --crossopt="-CpARMv5 -CfSOFT" rem fpcup --fpcURL=trunk --fpcDIR=%C%\FPC --binutilsdir=%C%\BinUtils --fpcbootstrapdir=%C%\FPCB --only=FPC
Сохраните скрипт и приступайте к компиляции: запускайте LA.bat. Перед тем как ввести Y убедитесь, что используются правильные параметры.
Теперь надейтесь, что кросскомпилятор скомпилируется... Вывод в консоли должен образоваться примерно такой:
Если вместо finished в конце написано failed, то процесс прошёл неудачно.
Я думаю, что пришло время поговорить об опциях кросскомпилятора, которые мы передаём:
--cputarget=arm --ostarget=android --crossopt="-CpARMv5 -CfSOFT"
Ну что ж, теперь давайте создадим серверную программу. В первую очередь следует настроить Lazarus на новый компилятор. Как быстро переключать компиляторы в Lazarus'е я не знаю, поэтому придётся пока просто поменять настройки, а когда придётся вернуться к использованию стабильного компилятора, придётся опять менять настройки на те, которые были до этого. Дурацкое занятие.
Чтобы открыть в Lazarus'е диалог настроек, следует нажать в главном меню: Tools -> Options. Следует назначить следующие настройки:
Compiler path: | %\FPC\bin\i386-win32\fpc.exe |
FPC source directory: | %\FPC |
Make path: | %\FPC\BinUtils\make.exe |
Вместо % нужно подставить путь, в который вы установили Free Pascal trunk с помощью fpcup. У меня это D:\LA.
Теперь пришло время создать первую программу на Android. Возможно для кого-то она будет не первая.
program TestMinimalOP; begin WriteLN('Hello bucket'); end.
Теперь нужно зайти в настройки проекта и указать там такие настройки:
Для тех, кто хочет компилировать программу без Лазаруса: можно указать те же самые настройки в параметрах командной строки компилятора вот так:
-Parm -Tandroid -CpARMv5
Теперь нам потребуется ещё одна настройка, без которой наша программа работать не будет: надо среди прочих передавать компилятору вот такой параметр:
-k--dynamic-linker=/system/bin/linker
Это нужно для того, чтобы программа искала динамический линкер по заданному пути. Задать эту настройку в Лазарусе можно следующим образом: вписать её в поле Pass options to linker with "-k". И галочку поставить не забудьте!
Для тех, кто будет компилировать без Лазаруса: команда для построения должна в итоге получиться примерно такой:
D:\LA\FPC\bin\i386-win32\fpc.exe -Parm -Tandroid -CpARMv5 -k--dynamic-linker=/system/bin/linker TestMinimalOP.lpr
Вместо D:\LA вписывать путь в который установили Free Pascal trunk для ARM Android. В результате запуска такой команды вы должны увидеть что-то вроде этого:
Если вместо "compiled" выводятся сообщения об ошибках, значит придётся придумать, как это исправить. Я надеюсь, что у вас проект скомпилировался. После этого в папке с проектом должен появиться файл "TestMinimalOP" без расширения. В Linux принято, чтобы исполняемые файлы были без расширения.
В Лазарусе после того, как назначили все нужные настройки (компилятор, цель и --dynamik-linker) следует скомпилировать проект, нажав Run -> Compile. В окне сообщений компилятора должно появиться "Project "TestMinimalOP" successfully built"
Теперь пришло время доставать ваш телефон или планшет на Android. Учитывая, что мы скомпилировали программу для ARMv5 и с набором инструкций для вычислений с плавающей запятой SOFT, наша программа должна работать практически на любом телефоне, хотя возможно у кого-то остались устройства с ARMv4 или ARMv3.
В первую очередь следует скопировать исполняемый файл который мы получили на карту памяти телефона. Как это сделать, совершенно не важно. В итоге нужно будет скопировать исполняемый файл на внутреннюю память телефона, так что если вы можете сразу скопировать файл на внутреннюю память телефона, то лучше так и сделать. Я рекомендую класть файл в папку /data. На моём планшете папка /system подключена на какой-то другой раздел, на котором мало места, а в папку /data кладутся все приложения, которые устанавливаются из маркета или установочных файлов. Если на вашем телефоне, например, 4 гигабайта внутренней памяти, то скорее всего 3 из них доступны в папке /data, а в папке system только 1, большая из которого уже занято системными файлами.
Чтобы скопировать исполняемый файл на телефон, я пользуюсь приложением Samba Filesharing, которое можно установить из Play Маркета. Следует установить это приложение, установить в нём логин и пароль для доступа к сетевому диску, включить Wi-Fi на телефоне и нажать в приложении "Enable". Без root-доступа оно скорее всего работать не будет. После нажатия Enable в приложении появится ip-адрес устройства в локальной Wi-Fi сети. Я рекомендую назначить в домашнем роутере постоянный ip-адрес для Android-устройства, на котором вы хотите устанавливать своё приложение. Я у себя назначил для своего планшета адрес 192.168.1.6. Если домашний роутер настроен таким образом, чтобы выдавать Android-устройству постоянно один и тот же адрес, то именно этот адрес и будет появляться в программе Samba Filesharing каждый раз, когда вы будете её активировать. У меня появляется 192.168.1.6. Чтобы открыть в проводнике сетевой диск, следует ввести \\192.168.1.6
Вам следует ввести IP-адрес вашего устройства вместо 192.168.1.6. Когда будете открывать, вас спросят имя пользователя и пароль. Вводите те данные, которые настроили в приложении Samba Filesharing. Когда откроете в проводнике сетевой диск, там должна появиться папка sdcard. Зайдите в папку sdcard и скопируйте туда ваш исполняемый файл.
Для того, чтобы было удобнее разрабатывать программы на Android, я предлагаю настроить SSH-доступ на Android. Это нужно для того, чтобы не набирать консольные команды на экранной клавиатуре Android. Мне пришлось набирать консольные команды очень много раз, поэтому SSH-доступ был очень нужен, да и сейчас нужен. Для того, чтобы получить SSH-доступ, я установил приложение QuickSSHd, которое есть в Play Маркете. Приложение, видимо, не обновлялось с 2010 года, и у меня оно подглючивало. Сначала запускаем приложение, вводим пароль, нажимаем On в правом верхнем углу. Появляется "Generating RSA key". Если в течение пяти минут это не пропадает, то заходим в стандартный диспетчер задач и убиваем приложение с помощью кнопки "Остановить". При этом появится предупреждение вроде "Принудительное завершение работы приложения может привести к потере данных. Вы уверены, что хотите завершить приложение?". Нажимаем да. После этого опять запускаем QuickSSHd, нажимаем On, появляется "Generating DSA key". Если опять в течение пяти минут ничего больше не происходит, то опять убиваем приложение через диспетчер задач. После этого опять заходим в QuickSSHd опять появится какой-нибудь диалог загрузки, но на третий раз оно должно сработать. В QuickSSHd можно настроить вход по паролю либо по сертификату, я пользовался всё время только методом входа по паролю.
Если всё сработало, то настройка QuickSSHd завершена, и теперь вам остаётся только делать On когда вы хотите, чтобы имелся доступ к Android-устройству по SSH, и делать Off когда доступ не требуется, то есть, например, когда вы взяли телефон с собой и ушли от компьютера куда-нибудь.
Если по какой-то причине вам не нравится приложение QuickSSHd, например, потому, что оно платное, то вы можете поискать альтернативу. Искать следует по ключевым словам "SSH agent", "SSH server". "SSH client" в данном случае не подходит, так как нужен именно сервер SSH, а не клиент SSH, потому, что мы хотим с компьютера заходить на телефон и запускать на нём наше хакерское приложение, а не заходить с телефона на компьютер.
Когда доступ к телефону по SSH активен, вы можете зайти на свой телефон с любого компьютера, находящегося в той же сети. При этом на телефоне у вас должен быть включён Wi-Fi, а компьютер должен быть воткнут проводом в ваш роутер или же ещё каким-то образом принадлежать той же локальной сети. Так же как и приложение Samba Filesharing, приложение QuickSSHd показывает текущий адрес телефона в Wi-Fi сети. У меня роутер настроен так, чтобы он выдавал планшету адрес 192.168.1.6, поэтому я захожу на планшет по адресу 192.168.1.6, а вам нужно будет вводить свой адрес.
Для того, чтобы с компьютера заходить по SSH на Android, вам потребуется SSH-клиент. Я буду пользоваться SSH-клиентом из Cygwin, а вы можете, например, пользоваться SSH-клиентом Putty. Данные для входа от этого не меняются. Пользователя указываем root, так как QuickSSHd предоставляет доступ именно с этим пользователем, адрес указываем который нужно, пароль указываем тот, который установили. Пользователи Linux могут заходить стандартным клиентом SSH для Linux, который вызывается командой ssh.
ssh пользователь@адрес
Например:
ssh root@192.168.1.6
Теперь мы на андроиде. Самое время вспомнить об исполняемом файле, который мы скинули на карту памяти. Сейчас мы будем его запускать.
Ещё одна опциональная деталь: на андроиде, скорее всего, у вас запустится командная оболочка sh. Я рекомендую установить bash для Android. Для этого нужно просто скопировать исполняемый файл bash в папку /system/xbin, то есть, в ту папку, в которую установили busybox. То, какие команды доступны у вас в терминале, зависит от значения переменной PATH. Когда зашли на андроид по SSH, можете проверить значение переменной PATH такой командой:
# echo $PATH /data/data/com.teslacoilsw.quicksshd/dropbear:/usr/bin:/usr/sbin:/bin:/sbin:/system/sbin:/system/bin:/system/xbin:/system/xbin/bb:/data/local/bin
У меня в PATH выводится куча всего, в том числе какие-то не нужные на мой взгляд пути. Главное чтобы был /system/bin и /system/xbin. Проверить какие команды доступны в каждом каталоге можно командой ls:
# ls /system/bin
Выведет список файлов в папке /system/bin. Среди них должны быть ls, chmod, mount и прочие Linux-команды.
Теперь я захожу в bash и копирую мой исполняемый файл в папку /data/daemonirc. Я заранее создал в папке /data папку daemonirc, так как первоначально я планировал написать клиент IRC, который был бы одновременно сервером. В общем, это не важно. Что полезно, так это использовать bash вместо sh, так как при наборе путей и команд в bash можно пользоваться автодополнением, которое должно работать при нажатии кнопки TAB на клавиатуре. Можно начать набирать /data/dae и нажать TAB, и тогда bash допишет за вас: /data/daemonirc. Если вы ещё не создали папку, можете её создать командой mkdir
# bash bash-3.2# cd /data bash-3.2#
Заходим в папку data
bash-3.2# rm -R daemonirc
Удаляю папку будто её ещё нет.
bash-3.2# mkdir daemonirc
Вот так создаётся папка.
bash-3.2# cd daemonirc
Переходим в эту папку.
bash-3.2# pwd /data/daemonirc
Команда pwd показывает, в какой папке сейчас находимся.
bash-3.2# cp /sdcard/TestMinimalOP .
Командой cp копируем наш исполняемый файл в текущий каталог. Текущий каталог обозначается точкой: ".". В случае успешного завершения команда не выдаёт никакого текста. Если у вас что-то не работает, то вполне возможно, что нужно просто включить root-доступ. Для этого в консоли нужно набрать su. При этом у вас опять запустится sh, так что если до этого у вас был bash, то придётся опять набрать команду bash, чтобы перейти в bash. Это было отступление, а сейчас продолжаем:
bash-3.2# ls -l ----rwxr-x root root 26543 2014-05-05 23:13 TestMinimalOP
Набираем ls -l чтобы посмотреть список файлов в текущем каталоге. Удивительно, но всем почему-то уже выданы права на выполнение этого файла: последняя x в записи ----rwxr-x означает, что всем разрешено выполнять файл. Если на вашем устройстве так не произошло, то можете выдать себе права на выполнение такой командой:
bash-3.2# /system/xbin/chmod u+x TestMinimalOP
Здесь важно набирать /system/xbin, иначе запустится стандартная команда chmod вместо команды chmod из busybox. Отличие команд в том, что стандартная не поддерживает формат назначения прав вроде u+x, а поддерживает только назначение прав числами типа 0777, так что если вы не хотите разбираться в числовом формате прав, я рекомендую пользоваться chmod из /system/xbin. u+x означает дать (+) себе (u, user) права на выполнение (x, execute)
Теперь запускаем нашу серверную программу:
bash-3.2# ./TestMinimalOP Hello bucket
Не знаю как у вас, а у меня работает. Выводит "Hello bucket".
Теперь я расскажу о том, как сделать, чтобы приложение работало как серверное приложение, то есть выполнялось всё время, даже когда вы отсоединитесь от телефона по SSH. Для этого в busybox предусмотрена команда daemonize:
bash-3.2# /system/xbin/daemonize Usage: /system/xbin/daemonize [-f logfile] [-a] [-d delay] program
Если запустить программу с помощью daemonize, то она должна продолжать работать постоянно, если только Android её не убъёт. Я оставлял свою программу работающей на несколько часов, и она всё это время продолжала работать.
Это программа-зависалка:
program TestMinimalOP; uses sysutils; begin WriteLN('Hello bucket'); while True do begin Sleep(3000); WriteLN('Still here'); end; end.
Давайте скопируем её на телефон и запустим с помощью daemonize. Копирую программу я всё время одним и тем же способом: сначала копирую на карту памяти, затем в папку в /data
bash-3.2# cp /sdcard/TestMinimalOP . bash-3.2# daemonize -f log.txt -a /data/daemonirc/TestMinimalOP bash-3.2# ps USER PID PPID VSIZE RSS WCHAN PC NAME root 1 0 352 212 c01b4b60 0000cacc S /init root 2 0 0 0 c015c38c 00000000 S kthreadd root 3 2 0 0 c014ddb0 00000000 S ksoftirqd/0 ... ... ... root 5338 4370 3540 1948 c01b4b60 0018d4d4 S /data/data/com.funkyfresh.samba/files/smbd root 5821 2 0 0 c01c22cc 00000000 S flush-179:0 root 6048 1 712 308 c016043c 0000a63c S /data/daemonirc/TestMinimalOP root 6051 3975 980 332 00000000 afd0d8ac R ps bash-3.2#
Хотя команда daemonize находится в папке /system/xbin, писать полный путь к ней не надо. Писать полный путь к команде из busybox нужно только в том случае, если такая же команда есть среди стандартных команд в /system/bin, как это обстоит с chmod. В команде daemonize нужно указывать полный путь к исполняемому файлу. Параметр -f log.txt назначает файл, в который будет записываться всё что выводит наше приложение. Параметр -a показывает, что нужно записывать всё что выводит приложение, а не какие-то определённые строки. Команда ps выводит список работающих процессов. Среди них есть сейчас и наш процесс /data/daemonirc/TestMinimalOP
Теперь мы можем посмотреть как работает в фоне наше серверное приложение, а точнее, посмотреть что оно выводит в лог. Для того, чтобы вывести содержимое файла log.txt можно воспользоваться командой cat:
bash-3.2# cat log.txt Hello bucket Hello bucket Still here Still here Still here ... ... ... Still here Still here Still here
У меня Hello bucket присутствует два раза. Наверное из-за того, что первый раз я запустил исполняемый файл до замены. Если программа у вас уже работает некоторое время, то вы скорее всего набрав cat log.txt увидите целую кучу строк Still here, так как новая строка выводится каждые три секунды. ( Так как в программе стоит Sleep(3000); )
Через три часа я ещё раз запустил на планшете ps, но на этот раз не через ssh, а в консоли планшета:
И убедился, что процесс всё ещё на месте.
Можно ли было всё делать в консоли планшета, а не заходить на него через SSH? Да, можно. Но было бы очень не удобно набирать все команды на экранной клавиатуре. Особенно не удобно это было бы потому, что часто что-то не срабатывает с первого раза, и приходится набирать команды по несколько раз с разными изменениями.
Чтобы принудительно завершить процесс, можно воспользоваться командой kill. В качестве параметра следует указать идентификатор процесса или PID. Идентификатор процесса выводит команда ps
USER PID PPID VSIZE RSS WCHAN PC NAME root 6048 1 712 308 c016043c 0000a63c S /data/daemonirc/TestMinimalOP
PID нашей программы в данном случае = 6048. Вводить надо:
kill 6048
На этом всё. Можете писать свой веб-сервер для андроида или сервер для какой-нибудь сетевой игры или ещё что нибудь. Я уже попробовал организовать отправку отладочных лог-сообщений по локальной сети с андроида на комп через Synapse, и это даже сработало, что говорит, вероятно, о том, что разработчики библиотеки Synapse уже предприняли усилия для того, чтобы их библиотека для Free Pascal работала и на Android. Насколько я знаю, есть уже и клиентская библиотека Firebird на Android. Если возникнут какие либо вопросы по статье, можете писать мне, то есть, автору этой статьи.
Ранее я планировал так же описать в этой статье свою библиотеку для отправки лога по сети, так как она могла бы пригодиться для отладки программ на Android, запускаемых именно таким образом, как описано в этой статье, но в итоге я не стал этого делать, так как посчитал, что вряд ли это кого-то заинтересует. Вместо этого я ограничусь тем, что приведу ссылку на эту библиотеку: https://bitbucket.org/hinst/paslog. Зависимости для этой библиотеки можно скачать с моей страницы на Bitbucket: https://bitbucket.org/hinst.
Ссылка на bash, скомпилированный для ARM-Android: http://4pda.ru/forum/index.php?showtopic=233150
Итак, теперь вы знаете, как писать программы для Android на Free Pascal без Java и Eclipse и запускать их как Linux-процессы!