旧的安卓手机不要扔,可以用来做一个微型的linux服务器,编程开发,跑服务都不在话下!本文就以6年前发布的红米2s为例,亲自带你们一起体验一下这些手机服务器并简单剖析其中的一些原理。一、升级最新安卓操作系统
像魅族2s这样早已发布6年多的手机,配置已然不够用了。并且我们晓得,微软每年发布的新安卓系统版本都有性能的优化,所以旧手机倘若能升级系统,自然也能改善性能。工欲善其事必先利其器,我们先把旧手机升级一把再说。
魔趣ROM介绍
这是一个国外团队维护ROM,开源而且支持多款安卓设备。最主要的是他跟着微软的步伐,当有新的安卓版本发行后,魔趣ROM很快能够为多款安卓设备适配。
魔趣ROM下载地址:,须要的同学可依照自己的手机机型选择下载并救砖使用。
比如我的红米2s手机,选品牌和机型
选安卓的版本安卓运行linux软件,我选的是8.1版本:
如何救砖不是我们关注的重点,须要的请到魔趣峰会或百度搜索。救砖后,我那6年前的破手机用上了androd8.1:
魔趣ROM的是开源的,这意味着:只要我们乐意,随时可以下载代码出来订制自己的ROM,这十分符合开发人员的食欲!
二、将安卓手机打导致linux服务器
理解linux与安卓的关系
为何我们只关注C/C++,不是有这么多语言编撰的程序吗?
由于c/c++是基础,离开它们基本没哪些能跑的了。java虚拟机是c++编撰的,python的解析器是c写的,js的解析执行引擎也是c/c++写的。。。
本文的主角---termux简介
termux是一个安卓平台下的app,它还能在安卓上实现一个微型的linux,具有命令行界面,可以以apt形式简单的安装各类软件。
termux的安装与使用
软件下载地址
软件界面
软件安装后,在手机上诠释的界面如下所示,与我们平常操作的linux终端长得一样:
安装openssh,并从PC端访问
终端界面在手机上操作不便捷,所以我们安装一个ssh服务,之后用PC来操作它。
1.更新软件源:
apt update
2.安装openssh-server:
1pkg install openssh
3.给termux对应的用户设置一个密码:
$passwd #根据提示设置一个密码 New password:
4.安装后,须要自动启动sshd:
sshd &
注意:termux的ssh服务默认端口为8022
5.测试联接
在PC端,我在windows上用securecrt联接手机的sshd,设置端口为8022,联接似成功的。联接成功后,你就真正拥有一个微型的linux服务器,可以将手机息屏,为所欲为啦。
termux的简单剖析
termux在android系统中运行,与普通的app没有哪些两样,在apk安装时,系统为其分配一个用户,比如我的分配的用户为u0_a79。我在手机上点击termux这个app后,虽然termux会以u0_a79这个用户身分创建一个新的bash进程,之后所有的命令都在这个bash进程里解析执行。
在termux的界面输入export命令,结果如下:
$ export declare -x ANDROID_DATA="/data" declare -x ANDROID_ROOT="/system" declare -x EXTERNAL_STORAGE="/sdcard" declare -x HOME="/data/data/com.termux/files/home" declare -x LANG="en_US.UTF-8" declare -x LD_LIBRARY_PATH="/data/data/com.termux/files/usr/lib" declare -x LD_PRELOAD="/data/data/com.termux/files/usr/lib/libtermux-exec.so" declare -x LOGNAME="u0_a79" declare -x OLDPWD declare -x PATH="/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets" declare -x PREFIX="/data/data/com.termux/files/usr" declare -x PWD="/data/data/com.termux/files/home" declare -x SHELL="/data/data/com.termux/files/usr/bin/bash" declare -x SHLVL="1" declare -x TERM="vt100" declare -x USER="u0_a79"
我们就可以见到如下疲态:
当前shell虽然为/data/data/com.termux/files/usr/bin/bash当前用户为u0_a79,与安卓系统给termux分配的的uid一致。LD_LIBRARY_PATH为/data/data/com.termux/files/usr/lib,当前shell执行的程序链接的是termux自己的库文件,与安卓系统/system/lib下的无关。LD_PRELOAD加入了一个libtermux-exec.so,说明应当termuxhook了一些系统API插口。PATH环境变量不包含/system/bin目录,所有命令都与android系统自带的命令了无关,termux的shell是一个独立的shell环境。termuxshell里也有am等android命令,而且它自带的,与用/system/bin下的am无关。HOME目录为/data/data/com.termux/files/home
通过ps命令,我们就可以更清楚的晓得,它虽然是termux创建的一个子进程:
```shell $ ps PID USER TIME COMMAND 29893 u0_a79 0:00 /data/data/com.termux/files/usr/bin/bash -l ```
因而我们可以确定:
termux的shell是与/system/bin/下的程序一样,用的都是android的libc,编译器应当是arm-linux-androideabi-gcc/g++。
三、玩termux
构建个人编程环境
我们早已拥有一个微型linux服务器了,如今我们尝试在上面编程开发。
安装c/c++编译器:
apt install clang
测试
$ gcc -v clang version 8.0.0 (tags/RELEASE_800/final) Target: arm-unknown-linux-android Thread model: posix InstalledDir: /data/data/com.termux/files/usr/bin
可以看见复印的arm-unknown-linux-android,的确就是android的编译器。经过测试,用这个编译器编译的程序是可以直接放在androidshell中执行的。
经过测试,c、c++、python、node.js等语言在这个微型服务器里都正常运行;搭建tomcat之类的服务也没问题。
怎样构筑java编程环境?
从后面的剖析我们晓得,termuxshell和androidshell一样,执行java字节码的是ART虚拟机,而不是普通的java虚拟机,所以javac编译的.class是难以运行的。
假如一定要执行java字节码,须要通过dx工具将字节码转换成dex文件,之后art虚拟机能够执行。
#termux下不能用openjdk,可以用ecj apt install ecj #adroid的.class转.dex工具 apt install dx apt install termux-tools #编译 ecj HelloWorld.java dx --dex --output=HelloWorld.dex HelloWorld.class #执行 #参照/system/bin/pm 的内容执行即可
好多人肯定会说,这个java环境不爽。这么想构建一个像普通服务器那样的java环境如何做呢,可以“安装”一个操作系统,右边会介绍。
怎样在PC与termux之间传输文件?
我们在服务器内写代码,都在/data/data/com.termux/files/home这个目录里,手机没有root的话,我们是难以访问这个目录的。我原本想安装一个samba服务器,发觉没有这个软件包,所以只能依靠网路传输文件:
通过scp工具(windows下用winscp)传输文件,即使没有直接用samba这么便捷但至少可用。
在termux中“安装”ubuntu
termux的linux环境对好多人来说基本是够用的,并且仍然是一种android订制版linux,与普通嵌入式linux系统还是有差别的,比如没有普通的java虚拟机。
下边介绍怎样在termuxshell里搭建一个ubuntu系统环境:
安装wget
用于下载文件
pkg install wget
安装proot
在linux中,chroot是一个须要root权限的操作,它容许将当前根文件系统切换到另外一个目录。诸如手机中的进程对应的根目录为/,我们弄一个/data/local/tmp/xxxx文件夹,里面有ubuntu的根文件系统,我们chroot到这个文件夹后,在shell界面里看见的/则切换到/data/local/tmp/xxxx了。我们说的安装ubuntu虽然只是chroot到一个ubuntu的根文件系统文件夹里而已。
proot是一个无需root权限才能执行chroot操作的工具。用于在ubuntu里模拟须要sudo的权限(否则无法安装软件)。
pkg install proot
下载atilo脚本
wget https://raw.githubusercontent.com/YadominJinta/atilo/master/atilo
下载ubuntu根文件系统并chroot
chmod +x ./atilo ./atilo install ubuntu #这个命令会执行proot,chroot到所下载的ubuntu根文件系统 startubuntu
执行startubuntu后,根目变到-->data/data/com.termux/files/home/.atilo/ubuntu去了,我们就觉得步入了ubuntu系统了。
我们再来对比一下这个ubuntushell与termuxshell不一样的地方:
简单剖析和测试我们“安装”的这个ubuntu系统
1.这个系统用的是通用的libc,android系统下的可执行程序没法在这个系统中运行。
我们可以通过查看gcc的版本:
root@localhost:~/workspace# gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/8/lto-wrapper Target: arm-linux-gnueabihf
可见用的是arm-linux-gnueabihf,而不是arm-linux-androideabi了。
2.我们并没有以root身分运行
通过shell界面我们看见,我们或许在以root权限运行,并且似乎是模拟下来的,所以你别想写个内核模块安装到真正的内核里面去。
3.在ubuntu中,运行sshd,samba都失败了
sshd进程一运行就没了linux ftp,通过gdb运行我们发觉它虽然段错误了:
同样,smbd进程也奔溃了,报了一个无权限bindsocket的错误。
虽然这些chroot后的系统没有直接用termux稳定。对于早已root的系统,可能不须要proot,其实兼容性会更好,感兴趣的可以自行进行尝试。
4.samba服务无法用让我很沮丧,但其日志年报的socketbind权限问题是如何回事?
[2019/05/23 01:00:34.679242, 0] ../../source3/lib/util_sock.c:357(open_socket_in) open_socket_in(): setsockopt: SO_REUSEPORT = true on port 139 failed with error = Protocol not available [2019/05/23 01:00:34.680860, 0] ../../source3/lib/util_sock.c:396(open_socket_in) bind failed on port 139 socket_addr = 0.0.0.0. Error = Permission denied
经过验证,自己写一个tcpserver运行是没有问题的,只是不支持SO_REUSEPORT这个套接字选项。并且ubuntu系统中绑定的端标语与实际在android中的端口是不一样的,具体的端标语须要到外部termux的shell能够看下来。
比如:我在ubuntushell中写了一个服务,窃听的是9999端口,而你外部要访问这个服务时,确要联接3456端口。
四、写在最后
通过亲自体验,在魅族2s上使用termux基本能满足对一个微型linux服务器的需求,我甚至想在我的新手机上也弄一个。对于须要用ndk编译androidnative可执行程序的人来说linux是什么,直接在android中编译程序并立马可以执行,而不须要每次adbpush到机器里,也是十分不错的体验。
termux拥有比较完备的软件源,开发环境支持得很健全安卓运行linux软件,可玩性十分高。随着arm芯片的性能的不断提高,运行显存都超越PC了,完全可以把你的手机当作一个随身linux服务器,推荐喜爱技术的同学去尝试一下。
欢迎关注我们的同名陌陌公众号“麻辣软硬件”,与我们交流更多技术相关知识!