TEL:400-8793-956
当前位置:程序、服务器

用PHP开发Android应用程序的可行性探讨

提问者:网民 近期获赞:63 浏览人数:13 发布时间:2020-12-09 11:43:37

问:您可能之前听说过PFA(Android的PHP),并且可以得出结论,该项目不再活动且失败,因为它所依赖的Android脚本层已停止更新和维护,并且它依赖于SL4A的操作模式。与下面我提到的PHP Droid的本地浏览器/服务器模式完全不同。

就个人而言,在Ubuntu上使用针对Droid PHP教程的交叉编译器工具musl-cross-compilers构建了用于Linux ARM体系结构的二进制PHP解释器。Droid PHP教程使用arm-none-linux-gnueabi工具链。我发现很难。后来,我看到了PocketMine,这是MinCraft Android版本的服务器,基于PHP 7构建,它使用musl-cross-comp。Ilers,所以我也改用了这个工具链。我主要进行了一些修改,例如修改libc库的shell路径以及与DNS相关的解析。conf和主机位置,主要是为了使PHP在Android上运行。
 
 
 
现在您已经拥有可以在Android上运行的PHP解释器,下一步是了解如何构建App。因为PHP解释器自5.4起内置了CLI HTTP Server,所以这是C语言实现的单进程Web服务器,支持PHP编程,该服务器是轻量级的,并且正式用于开发测试。它还支持一项功能,您可以在启动时为其指定一个PHP路由脚本:
php -S 127.0.0.2:8080 -t /www auth.php
例如auth。我打包的PHP Droid中的PHP如下所示:
 
<?php
// The following code means that if the UserAgent does not match, output Forbidden and exit.
$ua = dirname(__FILE__).'/ua';
if( isset($_SERVER['HTTP_USER_AGENT']) 
    && file_exists($ua) 
    && $_SERVER['HTTP_USER_AGENT'] === trim(file_get_contents($ua)) ) {
    return false;
} else {
    exit('Forbidden');
}
我们也知道PHP具有内置的SQLite引擎,文件就是数据库,这非常便于管理。可视管理工具可以使用免费的开源跨平台SQLite Studio。现在使用HTTP服务器和SQLLite数据库,在编译时还启用了一些常用扩展,如下所示:
 
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 Code:
webview.addJavascriptInterface(new Object() {
    @JavascriptInterface
    public String getprop(String prop) {
        return java.lang.System.getProperties().getProperty(prop);;
    }
}, "android");
 
HTML code in WebView:
<a href="javascript:void(0)" onclick="alert(android.getprop('os.name'))">os.name</a>
也就是说,您还可以使用WebView进行一些本地API调用。当然,您必须首先用Java编写这些功能。
好的,现在PHP Proid的整个运行模式都清晰了。当应用程序启动时,执行start.sh以随机生成用户代理并进行记录(ua.php),找到可用端口并进行记录(port.php),然后启动PHP内置HTTP服务器并记录PID(对于关闭),请先以随机方式生成用户代理,然后再以Java启动WebView并设置用户代理字符串设置,然后路由PHP内置服务器。H.php比较用户代理,并拒绝来自计算机上其他应用程序(例如浏览器)的请求。
脚本如下:
 
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
# Random Generation User Agent
./php -c php.ini ua.php
# Get Available Ports
./php -c php.ini port.php
Copy the root directory of the website to SD card when developing and debugging for easy modification
#-t $1/php/www practical application of the website root directory
#-t $2/phpdroid development and debugging site root directory
if [ ! -d $2/phpdroid ]; then cp -R $1/php/www $2/phpdroid; fi
# Start PHP Service
$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 &
# Recording the PID of PHP
echo $! > pid
# listen, find the file auth. PHP deleted, then close the PHP process
$1/php/bin/watcher $1/php/bin/auth.php >/dev/null 2>&1 &
Record watcher's 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_contents(dirname(__FILE__).'/ua', $ua.' '.sha1(uniqid(mt_rand(), true)));
 
port.php
<?php
//PHP uses fsockopen to detect whether the port is occupied and return the available port.
$port = 8181;
while ( $fp = @fsockopen('127.0.0.2', $port, $errno, $errstr, 1) ) {
    fclose($fp);
    $port++;
}
file_put_contents(dirname(__FILE__).'/port', $port);
 
MainActivity. Java starts WebView at onCreate as follows:
webview = new WebView(this);
webview.getSettings().setUserAgentString(ua);
webview.getSettings().setJavaScriptEnabled(true);
webview.setWebChromeClient(new WebChromeClient());
webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
});
webview.loadUrl("http://127.0.0.2:" + port);
setContentView(webview);
好了,正如您在这里看到的那样,您基本上了解了使用PHP开发Android应用程序的意思。
如果您有兴趣,可以下载我打包的APK来体验它。
phpdroid_20160703.apk(5.8M)
phpdroid_20160703.7z(4.7M)
APK包含最新的PHP 7.0.8和Swoole,这是一个高性能的网络编程扩展。
还包括用于生成二维代码的BusyBox和qrencode。
7z软件包是项目的源代码,主要是MainActivity。Java和资产数据。
提示,我一开始就打包了APK。sh将站点根目录调整为SD卡的phpdroid目录,主要是为了方便所有人在USB连接的手机将自己编写的PHP文件放入其中以运行测试时进行体验。
 
答:那你怎么了 还是您想讨论PHP4 android的未来?就后者而言,我认为这没有意义。首先,我看不到PHP4 android的任何优势。从您提供的演示中,我可以看到它是Java和JS交互的方式,并且依赖于Webview。目前,WebView还不如您所见。还有很多坑。无论其性能还是可靠性,仍然存在许多问题。当然,您应该只做静态页面。显示等简单的交互是另一回事。游戏图形,动画动画,复杂的逻辑实现,Web视图无能为力。webview.addJavascriptInterface这也是实现交互的效率低下,不安全且经常过时的方法。为了提前,我更喜欢react-native,这是一种基于JS框架的跨平台方法来控制本机。尽管其中有很多凹坑,但很明显,它们始终更接近于本机,而无需依赖于Webview。对于大多数开发人员而言,他们最后要做的就是“做某事”。今天的PHP4 android,明天的Python 4 android,ruby4 android,scala4 android,haskell4 android等将非常痛苦。计算机语言的出现应该是解决特定领域的问题,而不是解决所有问题。因此,最好是履行职责,专注于自己的领域,做好工作!
 
 
答:确切地说是旧东西
php <-> js <-> android
相同的PHP <-> JS <-> IOS
php <-> js <-> c ++
php <-> js <-> cocos
您可以随心所欲玩。
上一篇: ASP.NET开发网站问题
下一篇: CSS困难的版式:反转Z-index