Как написать мертвую простую программу SERVER SERVER (не приложение) для Android-устройств?

Прежде всего, я считаю, это не дублирующий вопрос. Я не хочу писать родное приложение с NDK, я просто хочу использовать Android-устройство в качестве дешевого Linux-сервера. Сервер в этом контексте означает программу, которая не имеет интерфейса. Кроме того, сервер написан на голом С++, но вообще не использует библиотеки, поэтому почему этот вопрос должен отличаться от других.

История

Мы написали небольшой сервер для Linux, он имеет интерфейс веб-сервера, поэтому вы подключаетесь к нему с помощью браузера с поддержкой браузера, и вы можете играть с ним. Мы собрали его в Linux/x86, Linux/ARM (GuruPlug), Linux/PPC (какой-то NAS) и платформы Mac OS X Darwin.

Версия Linux/ARM также хорошо работает на моем смартфоне Palm Pré. Я только что скопировал исполняемый файл на свой телефон (на сцене webOS, нет такой вещи, как джейлбрейк, есть официальный "режим разработчика", который, если вы активируете, набрав секретную комбинацию клавиш, вы можете войти в свой телефон с помощью ssh или использовать локальное приложение ssh). Таким образом, наша небольшая серверная программа (может сказать, демон) работает даже на самых маленьких устройствах Linux. (Это смешно, когда вы подключаетесь к вашему браузеру на рабочем столе с помощью giga на сервер смартфонов.)

Серверная программа предназначена для работы даже с самой маленькой Linux (как я уже сказал, она работает на NAS, маршрутизаторе, смартфоне), для этого требуются только STDLIB и PTHREADS.

Вопрос

Какой прямой способ запустить эту простую серверную программу на устройстве Android?

  • У нас пока нет Android-устройства. Но я предполагаю, что любой ARM-based будет делать. Объем памяти сервера настолько мал, что это не проблема.
  • Я предполагаю, что устройство должно быть внедрено для копирования исполняемого файла и запуска.
  • Я не хочу устанавливать на устройство совершенно новую Linux. Он должен работать под управлением Android, а наш сервер работает в фоновом режиме. Linux-дистрибутив, достаточный для Dalvik, достаточно для нашего сервера, я уверен.
  • Сервер не должен использовать внешние вещи (USB, сенсорный экран, аудио, камера, микрофон - спасибо, а не) только порт для веб-сервера (например, 8080), который не выделяется Android.
  • У меня есть toolchain ARM GCC, установка его не является частью вопроса (кроме случаев, когда есть трюки).
  • Установка программы должна быть ручной (scp, что угодно). Кроме того, я не хочу создавать пакет или любое автоматическое развертывание.
  • Проблема запуска серверной программы - это еще один вопрос, который мы бы сейчас проигнорировали.

Итак, я хочу просто сделать то же самое с устройством Andrid (телефон, планшет), как и на моем устройстве webOS: скопируйте серверную программу и запустите ее. Компьютеры для этого, запущенные программы, не так ли?;)

Ответ 1

Вам определенно нужно укоренившееся устройство Android. Я рекомендую вам установить busybox, чтобы получить кучу хороших инструментов командной строки, таких как wget, tar, gzip и многие другие. Вы можете получить доступ к оболочке вашего устройства с помощью adb shell, а затем su, чтобы получить доступ root. Вы можете использовать adb push или wget, чтобы разместить свой сервер на устройстве.
Системный раздел монтируется как только для чтения, и в зависимости от производителя существует множество защит, которые запрещают вам писать там, поэтому вы должны скопировать сервер где-нибудь на раздел /data (например, mkdir /data/myserver). После этого все должно быть довольно прямолинейно.

Ответ 2

Я действительно не пробовал, но должен быть возможно использовать компилятор ARM GCC, который у вас есть, или тот, который был предоставлен Android NDK для компиляции собственного приложения, так же, как вы использовали бы его на своем рабочем столе.

Если ваше приложение мало (не так много файлов), вы можете управлять компиляцией вручную (или в простом Makefile). Ниже приведены команды из руководства по компиляции LuaJIT для Android:

/tmp$ cat test.c
#include <stdio.h>
int main() {
        printf("Hello world!\n");
        return 0;
}
/tmp$ NDK=/opt/ndk
/tmp$ NDKABI=8
/tmp$ NDKVER=$NDK/toolchains/arm-linux-androideabi-4.4.3
/tmp$ NDKP=$NDKVER/prebuilt/darwin-x86/bin/arm-linux-androideabi-
/tmp$ NDKF="--sysroot $NDK/platforms/android-$NDKABI/arch-arm"
/tmp$ ${NDKP}gcc $NDKF -o test test.c 
/tmp$ file test
test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

Очевидно, используйте linux-x86 вместо darwin-x86, если вы находитесь в Linux (не Mac OS X, также не уверены в Windows) и измените путь к NDK туда, где вы его установили.

Теперь вам нужно переместить скомпилированную двоичную копию на свое Android-устройство и запустить adb shell, чтобы увидеть, работает ли она:

/tmp$ ADB=/opt/sdk/platform-tools/adb
/tmp$ $ADB push test /data/
332 KB/s (3343 bytes in 0.009s)
/tmp$ $ADB shell
# /data/test
Hello world!

Ответ 3

Возможно, вопрос - это скорее проблема sysadmin (как установить исполняемый файл на вашем устройстве Android), чем проблема с разработчиком (как скомпилировать программу C для Android)?

Ответ 4

У меня есть chroot-раздел с моим телефоном галактики Android. Это рука с процессором с плавающей запятой, поэтому работают всевозможные компиляторы. Предупреждение: утилиты busybox/android distro utils не запускаются как программное обеспечение GNU. У их смолы проблема с распаковкой первой вещи, которую я пробовал. POSIX tar не поддерживается. Их zip имеют проблемы с некоторым полем 1 или 8. Их монтирование работает как нечто из космоса. Само их разделение, которое вы захотите использовать, не поддерживает сим-ссылку. После нескольких недель работы над секцией chroot я начинаю чувствовать, что весь Android-это всего лишь новый базовый BIOS с большим количеством прошивки.