Публикации FreePascal

Разработка серверных приложений для Android без Java

07.05.2014
Александр Савиных

Речь в данной статье пойдёт не о том, как делать "обычные" приложения для Android, а именно серверные приложения, которые будут работать на андроиде как в линуксе, и это я думаю понравится всем любителям линукса, а так же не любителям Java и Eclipse, так как ни Java, ни Eclipse нам в этой статье не понадобятся.

Что понадобится:

  • Компьютер
  • Free Pascal
  • Lazarus
  • Телефон с Android
  • root-доступ на Android
  • busybox на Android
  • Wi-Fi на телефоне и на роутере
  • Android NDK

Подробнее о каждом пункте:

  • Компьютер под управлением Windows, однако и компьютер с Linux тоже сгодится, нужно будет просто немного адаптировать все действия, я думаю, что это будет не сложно
  • Компилятор Free Pascal, однако если он у вас не установлен или не настроен, то ничего страшного, здесь я как раз собираюсь описать, как это сделать
  • Lazarus IDE (опционально), тоже будет объяснено, что делать
  • Телефон или планшет под управлением Android. Большинство современных телефонов и планшетов под управлением Android используют процессоры семейства ARM. Это важно, так как компилятор компилирует код для конкретного процессора, и код, скомпилированный для ARM не пойдёт на процессорах семейства x86. Точно так же код, скомпилированный для процессоров x86 не пойдёт на процессорах ARM, если только не установить какую-нибудь виртуальную машину. Кроме процессоров ARM в устройствах под управлением Android используются процессоры x86, но таких устройств мало, и если у вас есть телефон с Android, то скорее всего там процессор ARM. Если же у вас всё же Android x86, то скорее всего у вас ничего работать не будет, пока в Free Pascal не будет поддержки Android x86, а сейчас, насколько я понимаю, её нет.
  • root-доступ на Android. Если у вас нет root-доступа на вашем Android-устройстве, то ничего хорошего, скорее всего, не получится. root-доступ нужен для того, чтобы запускать наше серверное приложение. Кроме того, на телефон с root-доступом можно установить блокировщик рекламы, а так же можно почувствовать себя хакером и делать с системой что захочется, при этом легко испортить её, так что нужно делать всё осторожно. Получить root-доступ на свой телефон или планшет можно очень просто следующим образом: ввести в Google: "root модель-вашего-телефона". Например, "root DNS S4001". Появятся результаты поиска. Откройте среди них какую-нибудь статью, и делайте всё по ней. Скорее всего, придётся подключать телефон к компьютеру USB-кабелем. Те же, у кого рут на Android уже есть, могут радоваться и продолжать изучать статью
  • busybox на Android - необходимая вещь для настоящего Android-хакера. Установить приложение можно из Play Маркета. После того, как установите приложение, следует запустить его и нажать Install. Только после этого оно по-настоящему установится. При этом будут предложены два варианта установки: в /system/xbin и в /system/bin. Я выбирал /system/xbin
  • Wi-Fi. Я надеюсь что у вас как у профессионального разработчика есть дома сеть Wi-Fi. Скорее всего, подключать ваш телефон по проводам к компьютеру для этого туториала не придётся вообще, будем делать всё по Wi-Fi
  • Android NDK возможно загрузить со страницы по этому адресу: https://developer.android.com/tools/sdk/ndk/index.html

Далее понадобится ещё много всяких вещей. О них я буду рассказывать по ходу.

fpcup

Вначале будем настраивать 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

Возможно, что fpcup не будет работать, если не имеется установленного клиента Subversion. В этом случае следует установить клиент Subversion. Я предлагаю установить вот этот клиент: TortoiseSVN

Во время установки следует назначить параметр, отвечающий за то, чтобы путь к исполняемым файлам Subversion был прописан в глобальной переменной окружения PATH. Пользователям Linux тоже может понадобиться установить Subversion. Для Linux ничего прописывать не надо, так как там и так по умолчанию исполняемые файлы Subversion будут видны после установки.

fpcup & Android

Итак, я надеюсь, что вам удалось установить 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"
  • --cputarget: я думаю, всё ясно: кросскомпилятор нужен для процессоров ARM, так как именно они работают в большинстве Android-устройств.
  • --ostarget=android: нужен кросскомпилятор для Android
  • -CpARMv5: тут всё не так просто. Существуют разные версии процессоров ARM. В большинстве современных устройств используется ARMv7, но я поставил настройку ARMv5 потому, что мой старый дешёвый планшет имеет процессор ARMv5. Код скомпилированный для более старого процессора будет работать и на более новом процессоре, а вот код, скомпилированный для более нового процессора, не будет работать на более старом процессоре.
  • -CfSOFT: это настройка чтобы указывать набор инструкций для вычислений с плавающей запятой. SOFT означает, что никакие специальные инструкции для вычислений с плавающей запятой использоваться не будут. При этом код, скомпилированный с такой настройкой, будет работать медленнее, чем код, скомпилированный с поддержкой какого либо набора инструкций для вычислений с плавающей запятой: VFPv2 или VFPv3. Снижение производительности произойдёт для вычислений с плавающей запятой. Код скомпилированный с поддержкой инструкций для вычислений с плавающей запятой, которых нет на некотором ARM-процессоре, не будет работать на устройстве с таким ARM-процессором. Все новые телефоны должны по идее поддерживать VFPv3

Ну что ж, теперь давайте создадим серверную программу. В первую очередь следует настроить 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

Теперь пришло время создать первую программу на Android. Возможно для кого-то она будет не первая.

program TestMinimalOP;

begin
  WriteLN('Hello bucket');
end.

Теперь нужно зайти в настройки проекта и указать там такие настройки:

  • Целевая операционная система: android
  • Целевое семейство процессоров: arm
  • Целевой процессор: ARMv5

Для тех, кто хочет компилировать программу без Лазаруса: можно указать те же самые настройки в параметрах командной строки компилятора вот так:

-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

Теперь пришло время доставать ваш телефон или планшет на 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 и скопируйте туда ваш исполняемый файл.

SSH-доступ на Android

Для того, чтобы было удобнее разрабатывать программы на 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".

Команда daemonize

Теперь я расскажу о том, как сделать, чтобы приложение работало как серверное приложение, то есть выполнялось всё время, даже когда вы отсоединитесь от телефона по 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-процессы!

Актуальные версии
FPC3.0.2release
Lazarus1.6.4release
MSE4.4.2release
fpGUI1.4.1release
наши спонсоры ;)
совместимость знаков - подробно. Узнайте!