资讯专栏INFORMATION COLUMN

用PHP开发Android应用的可行性探究(PHPDroid)

szysky / 1296人阅读

摘要:基于上的比如我打包的寥寥几行代码就能实现一个支持无线局域网用浏览器访问的手机的用于执行命令和代码大家以前可能都听说过这么一个东西可以下结论的是这个项目其实已经不再活跃失败了因为其依赖的已经停止更新和维护了而且它依赖的运行模式也跟我下面提到的


基于Android上的PHP(比如我打包的PHPDroid),寥寥几行PHP代码,就能实现一个支持无线局域网用浏览器访问的Android手机的Shell,用于执行命令和PHP代码.

大家以前可能都听说过PFA(PHP for Android)这么一个东西,可以下结论的是,这个项目其实已经不再活跃失败了,因为其依赖的SL4A(Scripting Layer for Android)已经停止更新和维护了,而且它依赖SL4A的运行模式也跟我下面提到的PHPDroid的本地Browser/Server模式截然不同.

个人在Ubuntu上用交叉编译工具链musl-cross-compilers参考DroidPHP的教程构建了适用于Linux ARM架构的二进制PHP解释器.其中DroidPHP的教程用的是arm-none-linux-gnueabi那一套工具链,我发现不好使,后来我又看到了PocketMine,一个用PHP7构建的MineCraft Android版服务器端,它用的是musl-cross-compilers,所以我也改用这套工具链.我主要做了一些修改,比如修改libc库的shell路径,以及DNS相关的resolv.conf和hosts位置,主要是为了让PHP能在Android上跑.

现在有了能够运行在Android上的PHP解释器,接下来就是看看能用什么方法构建App.因为PHP解释器从5.4开始内置了一个CLI HTTP Server,这是一个C实现的支持PHP编程的单进程Web服务器,很轻量,官方定位是开发测试.而且它还支持一个特性,就是可以启动时给它指定一个PHP路由脚本:
php -S 127.0.0.2:8080 -t /www auth.php
比如我打包的PHPDroid里的auth.php是这样的:


我们还知道,PHP还内置了SQLite引擎,一个文件就是一个数据库,管理起来非常方便,可视化管理工具可以用免费开源跨平台的SQLiteStudio.现在有了HTTP服务器和SQLite数据库,我编译时还启用了一些常用的扩展,如下:

bcmath calendar Core ctype curl date dom exif filter ftp gd hash json libxml mbstring mcrypt openssl pcre PDO pdo_sqlite Reflection session SimpleXML sockets SPL sqlite3 standard swoole xml xmlreader xmlwriter zip zlib

有了上面这些东西,我们该怎么进行图形化交互呢?我想大家都想到了,那就是Android内置的WebView.个人认为,浏览器是有史以来最成功的跨平台GUI应用.Android从4.4开始,WebView底层由Chromium驱动,性能也是相当不错的.如果你要调用一些Java编写的本地功能,WebView一直都提供有一个addJavascriptInterface的特性,可以把Java对象注入到WebView中供JS调用,比如:

Java代码:
webview.addJavascriptInterface(new Object() {
    @JavascriptInterface
    public String getprop(String prop) {
        return java.lang.System.getProperties().getProperty(prop);;
    }
}, "android");

WebView里的HTML代码:
os.name

也就是说,你用WebView也是可以进行一些本地API调用的,当然你得先用Java写好那些功能.

好了,现在PHPDroid的整个运行模式就比较清晰了,应用启动时,执行start.sh随机生成UserAgent并记录下来(ua.php),找到可用端口并记录下来(port.php),然后启动PHP内置HTTP服务器并记录PID(用于关闭),Java里启动WebView前读取随机生成UserAgent并setUserAgentString设置,PHP内置服务器的路由auth.php会对UserAgent进行比对,拒绝本机上其他应用(比如浏览器)发出的请求.
各个脚本如下:

start.sh
#!/system/bin/sh
cd $1/php/bin
chmod 700 busybox
if [ ! -f php ]; then
    ./busybox xz -d file.tar.xz
    ./busybox tar xf file.tar && rm file.tar
    chmod 700 lib/ld php watcher qrencode
    ./busybox sed -i "s@/data/data/net.php.phpdroid@$1@g" php.ini
    ./busybox sed -i "s@/storage/self/primary@$2@g" php.ini
    cp resolv.conf $1/php/www
    cp hosts $1/php/www
fi
#随机生成UserAgent
./php -c php.ini ua.php
#获取可用端口
./php -c php.ini port.php
#开发调试时把网站根目录复制到SD卡,方便修改
# -t $1/php/www  实际应用的网站根目录
# -t $2/phpdroid 开发调试的网站根目录
if [ ! -d $2/phpdroid ]; then cp -R $1/php/www $2/phpdroid; fi
#启动PHP服务
$1/php/bin/php 
-c php.ini 
-S 127.0.0.2:`cat $1/php/bin/port` 
-t $2/phpdroid 
$1/php/bin/auth.php 
>/dev/null 2>&1 &
#记录PHP的PID
echo $! > pid
#监听,发现文件auth.php被删除,则关闭PHP进程
$1/php/bin/watcher $1/php/bin/auth.php >/dev/null 2>&1 &
#记录watcher的PID
echo $! > pid_watcher
return 0

stop.sh
#!/system/bin/sh
ua=$1/php/bin/ua
if [ -e $ua ]; then
    rm $ua
fi
port=$1/php/bin/port
if [ -e $port ]; then
    rm $port
fi
pid=$1/php/bin/pid
if [ -e $pid ]; then
    kill -9 `cat $pid`
    rm $pid
fi
pid=$1/php/bin/pid_watcher
if [ -e $pid ]; then
    kill -9 `cat $pid`
    rm $pid
fi
return 0

ua.php

好了,看到这里,大家基本已经明白我所说的用PHP开发Android应用的思路.
大家感兴趣可以下载我打包好的APK来体验一下:
phpdroid_20160703.apk(5.8M)
phpdroid_20160703.7z(4.7M)
apk里包含PHP最新的7.0.8和高性能网络编程扩展Swoole,
另外还有BusyBox和生成二维码的qrencode.
7z包是项目源代码,主要就是MainActivity.java和assets数据.
提示下,我打包的APK在start.sh里把网站根目录调整到了SD卡的phpdroid目录下,主要上方便大家体验时USB连接手机把自己写的PHP文件放到里面运行测试.

附:开头题图(Shell)的PHP代码:







PHPDroid Web Shell







文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21774.html

相关文章

  • 探究 React Native 中 Props 驱动 SVG 动画和 Value 驱动动画

    摘要:再来看前端,前端的动画实现,经过多年的发展,已分为动画和动画。此外还探究了驱动动画在实现方法上的不同之处。驱动的动画接下来看驱动的动画。改造后的函数如下关键修改,强制刷新。对于,函数是可行的,然而对无效。 引言 一直以来,动画都是移动开发中极为特殊的一块。一方面,动画在交互体验上有着不可替代的优越处,然而另一方面,动画的开发又极为的耗时,需要消耗工程师大量的时间用于开发和调试。再来看前...

    Codeing_ls 评论0 收藏0
  • Web离线技术(一)—— 技术选型

    摘要:上面提到在安卓完全不需要像这样大费周章的绕弯路,所以安卓可能就不需要这个自定义的,这样又会导致面临着与安卓差异化严重问题。前言 最早接触离线包的概念要追溯到16年初,项目迎来大改版,其中重点项目之一就是离线包方案的制定与实施。离线包顾名思义就是将H5/CSS/JS和资源文件打包提前下发到App中,这样App在加载网页的时候实际上加载的是本地的文件,减少网络请求来提高网页的渲染速度,并实现动态...

    null1145 评论0 收藏0
  • 后台 - 收藏集 - 掘金

    摘要:探究系统登录验证码的实现后端掘金验证码生成类手把手教程后端博客系统第一章掘金转眼间时间就从月份到现在的十一月份了。提供了与标准不同的工作方式我的后端书架后端掘金我的后端书架月前本书架主要针对后端开发与架构。 Spring Boot干货系列总纲 | 掘金技术征文 - 掘金原本地址:Spring Boot干货系列总纲博客地址:http://tengj.top/ 前言 博主16年认识Spin...

    CrazyCodes 评论0 收藏0

发表评论

0条评论

szysky

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<