如何为Android设备编写死的简单本机SERVER程序(不是应用程序)?

时间:2011-11-03 12:07:06

标签: android linux pthreads native

首先,我相信,这不是一个重复的问题。我不想用NDK编写本机应用程序,我只想将Android设备用作廉价的Linux 服务器。在此上下文中,服务器表示具有无UI 的程序。此外,服务器是用裸C ++编写的,但根本不使用任何库,所以这就是为什么这个问题与其他问题不同。

故事

我们为Linux编写了一个小型服务器,它有一个webserver接口,所以你用一个vanilla浏览器连接它,你可以玩它。我们已将它编译为Linux / x86,Linux / ARM(GuruPlug),Linux / PPC(某种NAS)和Mac OS X Darwin平台。

Linux / ARM版本在我的PalmPré智能手机上运行良好。我刚刚将可执行文件复制到我的手机上(在webOS场景中,没有像越狱这样的东西,有一个官方的“开发者模式”,如果你通过输入一个密钥组合激活,你可以用ssh登录你的手机或使用本地ssh应用程序)。因此,我们的小型服务器程序(守护程序,可能会说)即使在最小的Linux设备上也能运行。 (将千兆级桌面计算机的浏览器连接到智能手机服务器时,这很有趣。)

服务器程序设计为即使在最小的Linux上运行(正如我所说,它运行在NAS,路由器,智能手机上),它只需要STDLIB和PTHREADS

问题

在Android设备上运行简单的服务器程序的直接方法是什么?

  • 我们还没有Android设备。但我认为,任何基于ARM的都可以。服务器的内存占用空间很小,没问题。
  • 我认为,设备必须是root用户才能将可执行文件复制到它并运行。
  • 我不想在设备上安装全新的Linux。它应该继续运行Android,而我们的服务器在后台运行。对于Dalvik而言足够的Linux发行版对我们的服务器来说已经足够了,我很确定。
  • 服务器不应该只使用外部设备(USB,触摸屏,音频,相机,麦克风 - 谢谢,而不是)网络服务器的端口(例如8080),这不是由Android分配的。
  • 我有ARM GCC工具链,安装它不是问题的一部分(除非有技巧)。
  • 程序的安装应该是手动的(scp,无论如何)。此外,我不想制作包或任何自动部署。
  • 启动服务器程序的问题是另一个问题,我们现在忽略了。

所以,我想用Andrid设备(手机,平板电脑)做同样的事情,就像我在我的webOS设备上做的那样:复制服务器程序并运行它。计算机就是这样,运行程序,不是吗? ;)

4 个答案:

答案 0 :(得分:5)

我还没有真正尝试过,但应该可以使用你拥有的ARM GCC编译器,或Android NDK提供的编译器来编译本机应用程序,就像在桌面上使用它一样

如果您的应用程序很小(文件太多),您可以手动(或在简单的Makefile中)管理编译。以下命令来自LuaJIT compilation guide for 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(不是Mac OS X,也不确定Windows),请使用linux-x86代替darwin-x86,并将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 :(得分:1)

或许问题更多的是系统管理员问题(如何在Android设备上安装可执行文件)而不是开发人员问题(如何交叉编译Android的C程序)?

答案 2 :(得分:1)

你肯定需要一个有根的Android设备。 我建议您安装busybox以获得一些很好的命令行工具,例如wget, tar, gzip等等。 您可以使用adb shell然后su获取root访问权限,从而获得对设备的shell访问权限。您可以使用adb pushwget将您的服务器放在设备上 / system分区以只读方式挂载,并且根据制造商的不同,有很多保护措施限制您在那里写入,因此您应该将服务器复制到/ data分区上的某个位置(例如mkdir /data/myserver)。在此之后,一切都应该非常直接。

答案 3 :(得分:1)

我的android galaxy手机有一个chroot分区。它是带浮点处理器的臂,因此各种编译器都可以工作。警告:busybox / android distro utils不作为GNU软件运行。他们的焦油问题解决了我尝试过的第一件事。 POSIX tar不受支持。他们的拉链有一些领域1或8的问题。他们的装置就像太空中的东西一样。他们想要放置软件的分区本身不支持sym链接。在chroot分区上工作几周之后,我开始觉得整个android只是一个新的底层BIOS,有很多固件。