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

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

История

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

Версия Linux / ARM также хорошо работает на моемСмартфон Palm Pré.Я только что скопировал исполняемый файл на свой телефон (в сцене с WebOS нет такой вещи, как джейлбрейк, есть официальный «режим разработчика», который, если вы активируете, набрав комбинацию секретного ключа, вы можете войти в свой телефон с помощью sshили используйте локальное приложение ssh).Итак, наша небольшая серверная программа (скажем, демон) работает даже на самых маленьких устройствах Linux.(Забавно, когда вы подключаетесь с помощью браузера настольного компьютера с гигабайтом к серверу смартфона.)

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

Вопрос

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

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

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

Ответы [ 4 ]

5 голосов
/ 08 ноября 2011

Я на самом деле не пробовал, но должна быть возможность использовать имеющийся у вас компилятор 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!
1 голос
/ 07 июля 2012

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

1 голос
/ 11 ноября 2011

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

1 голос
/ 08 ноября 2011

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

...