(澳门银河官网下载) 用PHP开发Android应用的可行性探究
澳门银河官网
澳门银河官网
当前位置 : 澳门银河官网 > 澳门银河官网下载

(澳门银河官网下载) 用PHP开发Android应用的可行性探究

大家以前可能都听说过PFAPHP for Android这么一个东西,可以下结论的是,这个项目其实已经不再活跃失败了,因为其依赖的SL4AScripting 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
//以下代码的意思就是,如果UserAgent不匹配,就输出Forbidden并退出
$ua = dirname__FILE__./ua;
if isset$_SERVER[HTTP_USER_AGENT] 
    && file_exists$ua 
    && $_SERVER[HTTP_USER_AGENT] === trimfile_get_contents$ua  {
    return false;
} else {
    exitForbidden;
}

我们还知道,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.addJavascriptInterfacenew Object {
    @JavascriptInterface
    public String getpropString prop {
        return java.lang.System.getProperties.getPropertyprop;;
    }
}, "android";

WebView里的HTML代码:
<a href="javascript:void0" onclick="alertandroid.getpropos.name">os.name</a>

也就是说,你用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
$ua = Mozilla/5.0 Linux; Android; PHPDroid AppleWebKit KHTML, like Gecko Chrome Mobile Safari;
file_put_contentsdirname__FILE__./ua, $ua. .sha1uniqidmt_rand, true;

port.php
<?php
//PHP用 fsockopen 检测端口是否被占用,返回可用端口.
$port = 8181;
while  $fp = @fsockopen127.0.0.2, $port, $errno, $errstr, 1  {
    fclose$fp;
    $port++;
}
file_put_contentsdirname__FILE__./port, $port;

MainActivity.java 在 onCreate 时启动 WebView 如下:
webview = new WebViewthis;
webview.getSettings.setUserAgentStringua;
webview.getSettings.setJavaScriptEnabledtrue;
webview.setWebChromeClientnew WebChromeClient;
webview.setWebViewClientnew WebViewClient {
    public boolean shouldOverrideUrlLoadingWebView view, String url {
        view.loadUrlurl;
        return true;
    }
};
webview.loadUrl"http://127.0.0.2:" + port;
setContentViewwebview;

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

2
回复 ivanilla

我不像某些人只是想,我亲自交叉编译,亲自打包APK,亲自在小米华为手机以及树莓派上测试,已经印证了可行性.
在你还在认为本人的想法不切实际的时候,有些开发者已经坐地收钱.
比如App Store上售11美元的DraftCode,用PHP内置服务器在iOS上跑PHP应用,看不起国人的实践,那就看看老外的实践.
http://solesignal.com/draftcode/

eechen · 2016年08月31日

展开评论

所以,你的问题是什么?或是想讨论php4android的前景?就后者来说我觉得意义不大,首先是看不到php4android有什么优势点存在,从你提供的demo上看也是,走的是java&js交互的方式,而且依赖于webview,目前webview并不如你所看到的那么好,坑还多了去了,无论性能还是可靠性,都还有很大的问题,当然你要说只做静态页面展示等简单交互那另当别论,游戏图形、动画动效、复杂逻辑实现,webview是有心无力的,webview.addJavascriptInterface更是一个低效、不安全、频临淘汰的交互实现方式。要提前景,我更看好react-native这种基于js框架控制native的跨平台方式,虽然它们的坑也很多,但显然,在不依赖webview的情况下,它们总能更接近原生。对于大多数开发者来说,最不想“搞事”,今天php4android,明天python4android、ruby4android、scala4android、haskell4android等,会很痛苦的。一门计算机语言的出现应该是解决特定领域的问题,而不是解决所有问题,所以,各司其职,专注自己的领域,做好,就是最好!

php是性价比最高的web开发语言 没有之一 PHP专注WEB领域就OK了

前景并不看好,php擅长的还是web领域,php搞Android还不如python来得靠谱。

老东西了,准确来说 是
php<->js<->android
同样的 php<->js<->ios
php<->js<->c++
php<->js<->cocos
你想怎么玩都行

以下回答并非答案。

深度好文, 只可惜还没达到 @eechen @chuyao 这种高度, mark下,

该答案已被忽略,原因:宜作评论而非答案

一看到标题就知道谁发的

该答案已被忽略,原因:内容不是答案,可用评论、投票替代

所以这就是你不肯学Java的理由?

该答案已被忽略,原因:内容不是答案,可用评论、投票替代

楼主,我做的是hybrid app开发,前端用js,后端用php js的话是apicloud+腾讯的arttemplate apicloud做的事情是把安卓和ios上的差异给兼容起来,这样制作出来的app可以在两个平台下都能运行起来.我公司4个app都是用js+php后台来开发的
这是官网:http://www.apicloud.com/

该答案已被忽略,原因:

何必呢,基于Java语言的Android开源项目那么多,那么健全,干嘛非用PHP啊。

该答案已被忽略,原因:

直白的说,这压根就不是php开发应用。只不过是在本地使用php的内置服务器运行了一个服务器。

如果我直接使用html+css+js 更舒服了呗,web服务器都不需要。

该答案已被忽略,原因:

广告位

澳门银河官网