个人在Ubuntu上使用交叉编译工具链 arm-linux-musleabi 或 arm-none-linux-gnueabi 按照 DroidPHP 的教程构建了适用于Android(ARM架构)和树莓派Raspbian(ARM架构基于Debian的Linux发行版)的PHP解释器(cli,cli- server). 从图中可以看到,PHP进程的内存(RSS)内存占用才5MB,WebView的内存占用将近80MB.
内容包括: main : 这个目录里面是项目源代码,主要就是MainActivity.java和assets数据. phpdroid.apk : 应用示例,大小不到6MB,包含PHP,Swoole,BusyBox,QRencode.
这里需要说明的是,BusyBox并不是PHP必备的东西, 打包它只是为了方便PHP能够调用里面常用的GNU/Linux命令, 去掉BusyBox后APK包还能缩小600KB.
需要强调的是,包里的PHP是路径无关的,运行也不需要root权限, 只要维持assets/php/的目录结构,放到你的应用里也能正常运行. PHP的版本是7.1.0.
网站根目录位于assets/php/www. PHPer在PC上开发时,只需执行: php -S 127.0.0.2:8181 -t /path/to/assets/php/www 然后打开浏览器的手机模式访问 127.0.0.2:8181 就可以了.
PHPDroid基本工作原理: Java启动PHP内置的HTTP服务器,然后开一个WebView访问这个PHP驱动的HTTP服务. 其中,WebView用于实现人机交互,可以用传统的HTML/CSS/jQuery技术进行图形界面编程. PHP则负责跟本地文件系统,SQLite数据库,网络进行交互.
需要强调的是,PHPDroid追求的不是像Java App那样能够访问Android系统提供的API. PHPDroid的优势在于用传统的Web开发技术HTML/CSS/JS/PHP/SQL就能开发基于WebView的本地WebApp. PHPDroid内置的本地PHP不能访问Android提供给Java的API,但可以操作本地文件系统(应用目录)和SQLite以及进行网络交互. 比如获取一个新闻列表,WebView通过AJAX访问本地PHP,PHP再通过cURL等访问远程服务器. 远程服务器返回JSON,里面包含新闻的标题,摘要,缩略图网址,本地PHP转成数组后循环输出到WebView. 可见这个本地PHP既是WebView的服务器端,又是远程服务器的客户端,是WebView和远程服务器数据交互的中转站. 把WebView和本地PHP看做一个整体,那它就是一个不能调用Android API的本地WebApp. 毕竟Android是Linux内核,一切皆文件的思想还是在那里的, 只要有权限,PHP读取一些系统数据(比如/proc/cpuinfo)并没有问题.
比如基于Android上的PHP(比如我打包的PHPDroid),寥寥几行PHP代码, 就能实现一个支持无线局域网用浏览器访问的Android手机的Shell,用于执行命令和PHP代码.