PHPDroid 更新了,集成最新PHP7+Swoole+BusyBox+QRencode 开发 Android 应用。
下载地址:
phpdroid_20160703.apk(5.8M)
phpdroid_20160703.7z(4.7M)
apk里包含PHP-7.0.8和高性能网络编程扩展Swoole,
另外还有BusyBox和生成二维码的qrencode.
7z包是项目源代码,主要就是MainActivity.java和assets数据.
PHPDroid: 基于WebView和PHP内置HTTP服务器开发Android应用
Android从4.4开始,WebView由Chromium驱动,性能今非昔比.
一直以来,浏览器是最成功的跨平台桌面应用.
基于PHP(CLI HTTP Server)+Browser(WebView),
使用PHPDroid,能够轻松像开发WAP手机站一样快速开发APP应用.
有了 android.webkit.JavascriptInterface ,
也可以很容易地把一些Java写好的功能注入到WebView给JS调用.
其中PHP包含了以下常用扩展:
bcmath: Binary Calculator Math,任意精度数学计算函数(bc*).
calendar: 历法扩展集包括了一系列用于在不同历法间进行转换的函数(cal_*)
Core: PHP核心
ctype: 字符类型检测函数(ctype_*)
curl: cURL(client URL)库函数(curl_*,支持http/https/ftp/ftps等协议).
date: 日期和时间函数,是PHP核心的一部分
dom: Document Object Model操作类和函数(DOM*)
exif: 读取exif格式数码照片的信息
filter: 验证和过滤数据
ftp: 用于FTP交互
gd: 用于处理图像
hash: 哈希信息摘要框架(hash_*)
json: JSON编解码函数(json_*)
libxml: dom,xsl,simplexml,xml,xmlreader,xmlwriter,xmlrpc,wddx,soap都依赖libxml扩展(libxml_*).
mbstring: 多字节字符串函数(mb_*)
mcrypt: mcrypt库函数(mcrypt_*)
openssl: openssl库函数(openssl_*)
pcre: 正则表达式库函数(preg_*)
pdo: PHP数据对象(PDO)
pdo_sqlite: SQLite的PDO接口
reflection: 反射,PHP核心部分
session: session_*,会话处理函数
simplexml: XML简易操作函数
sockets: socket函数
spl: PHP解决典型问题库,PHP核心部分
sqlite3: SQLite3数据库引擎
standard: 标准库,PHP核心部分
swoole: 峰哥开发的高性能网络编程扩展
xml: XML解析函数(xml_*)
xmlreader
xmlwriter
zip: 读写zip压缩文件函数(zip_*)
zlib: 读写gz(gzip)压缩文件函数(gz*)
引用来自“rieon”的评论
都没用面向对象,require来include去,水平可见一斑引用来自“eechen”的评论
你说对了,我就是反框架反完全面向对象的PHPer.不爽? You Can You Up, No Can No BB.
引用来自“rieon”的评论
都没用面向对象,require来include去,水平可见一斑不爽? You Can You Up, No Can No BB.
https://pan.baidu.com/s/1dEEnBtJ
@Vancent 这是我使用musl-cross-compilers交叉编译Android版PHP7的详细笔记,你可以下载下来看一下.静态编译PHP的关键点就在configure里加参数--enable-static和修改Makefile:
sed -i "s{-export-dynamic{-all-static{" Makefile
引用来自“Vancent”的评论
大神可以请教一下php静态链接执行文件的编译过程吗?自己编的都是动态链接库...https://github.com/DroidPHP/DroidPHP/blob/master/docs/Compiling.md
而resolv.conf我放在了网站根目录下,所以你的脚本里运行curl的部分也应该放在网站根目录下,可以是直接的也可以是间接的,比如:
/resolv.conf
nameserver 180.76.76.76
/index.php
require __DIR__.'/include/common.php';
foo();
/include/common.php
require __DIR__.'/functions.php';
/include/functions.php
function foo() {
require __DIR__.'/../view/index.php';
}
/view/index.php
header('Content-Type: text/plain; charset=GBK');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
exit();
访问 /index.php 正常
访问 /view/index.php 返回 false
还有就是你要打包自己的应用,则需要自己下载Android Studio和Android SDK,新建自己的项目,然后把我在phpdroid_20160703.7z里提供的代码和assets放到你的项目里面,然后打包发布自己的应用就好了.
引用来自“小白变老白”的评论
怎么在window下PC端来测试APP呢 楼主的方法没看懂啊引用来自“eechen”的评论
你安装5.8MB的PHPDroid的APK后,用USB线连接手机跟电脑,然后就可以在电脑里的文件管理器查看手机SD卡内容,SD卡下的phpdroid目录就是网站的根目录,你把你的PHP脚本放到这个目录里,然后在手机启动应用就能看到你写的效果了.引用来自“小白变老白”的评论
哦哦 我以为直接在浏览器里面看呢...前面不是说用浏览器的移动模式输入IP地址加端口访问么这时如果还用AngularJS这类复杂的前端框架,体验就更不好了. 我推荐使用jQuery 2 (84KB) + jQuery Mobile Touch Events (8KB). jQuery Mobile 也是一个挺重的框架,这里只用它提供的触摸事件就够了,其他自己实现. 又因为 jQuery Mobile 1.4.5 还不支持 jQuery 3,所以可以配合 jQuery 2 使用. jQuery 1和2和3这几个大版本,它们的API基本都是相同的,主要区别在于1支持IE6/7/8, 而Android上并不需要考虑IE的兼容.
jQuery Mobile官方提供了一个Alpha版本的Download Builder
可以用来定制自己用到的功能,比如触摸事件(Touch Events):
访问 jQuery Mobile 官网,找到 Download Builder 页面,
勾选 Events 下的 Touch 然后点击页面下方的 Build My Download 下载.
有人可能会说,为什么不用Zepto?
zepto.min.js是25KB,jquery-2.2.4.min.js是84KB,体积上看的确Zepto更小.但更小并不意味着执行效率更高,有人测试过,jQuery2效率要比Zepto高不少.而且就算不谈效率,用jQuery2也能保证功能性和使用各种jQuery插件.jQuery2是官方对jQuery的重构,抛弃IE6/7/8的历史包袱,更加高效,并且jQuery2兼容jQuery1插件(比如幻灯片插件flexslider),适合应用于没有IE困扰的移动浏览器.
引用来自“无糖咖啡”的评论
PHPDroid开发出来的应用,取数据还是通过接口了?举例来说,你的应用需要把一张图片上传到服务器:
因为WebView对上传支持不好,这时你可以直接用PHP读SD卡,
然后在WebView里列出图片的文件名,供用户选择,
然后再通过PHP的curl库函数把图片作为附件通过HTTP或HTTPS传输到远程服务器.
Linux系统一切皆文件,所以PHP还能通过读取系统文件才获取系统信息.
对于那些只能通过Java访问的Android API才能实现的功能,可以通过webview.addJavascriptInterface注入Java写好的功能到WebView给JS调用,JS可以把信息交给PHP处理,PHP可以用SQLite存储起来.
引用来自“空空乳业”的评论
eechen是个厉害的javaer。话说这个框架怎么从javascript调用java的,求大神写个开发手册。引用来自“拉风的道长”的评论
phonegap的分析系列。应该差不多:http://my.oschina.net/lifj/blog/346770我基本啥事都没干,就是start.sh启动PHP内置的HTTP服务器,然后Java那边开一个WebView访问这个PHP服务器.
开发出来的应用其实就有点像我们本地开发网站时用phpMyAdmin管理MySQL数据库那样.
引用来自“兆前”的评论
大神 苹果什么时候支持 还有ide什么时候跟上PHPDroid本质还是PHP编程,所以一不需要什么特殊的IDE辅助.
另外,PHPDroid名字就预示着这个是Android上的PHP打包.
还是期待那些使用Mac和iPhone的PHP开发者构建iOS版PHP吧.
不过我猜就算构建出iOS版PHP(--host=arm-apple-darwin10),可能iOS的运行机制也会阻止应用后台启动一个PHP常驻服务进程吧.比如Kodiak PHP就是一个iOS上的PHP,但其需要越狱(JailBroken)后才能在命令行下执行PHP.而Android上的PHP在完全没有这个限制,因为Android,本质还是ARM架构的Linux.
引用来自“falconchen”的评论
抄袭还删掉别人的评论,心虚了还不赶紧去看我博文学习:
64位Ubuntu 14.04上使用musleabi最小化交叉编译Android版PHP7
http://my.oschina.net/eechen/blog/679342
PHPDroid: 基于WebView和PHP内置HTTP服务器开发Android应用
http://my.oschina.net/eechen/blog/655689
PHP开发Linux桌面应用和Android应用思路
http://my.oschina.net/eechen/blog/501341
解压即用,跨Linux发行版PHP7打包
http://my.oschina.net/eechen/blog/411534
解压即用,Ubuntu上Nginx/Apache/PHP编译打包
http://my.oschina.net/eechen/blog/298027
引用来自“Liuxd”的评论
这个世界需要一些新鲜有趣的东西。感谢 @eechen其实国人爱特很早就打包了Android上的PHP,项目名叫Anmpp,包含PHP+MySQL+PostgreSQL+Nginx等组件,只不过Anmpp的定位是把Android手机打造成一台家用LAMP服务器,Anmpp因为需要监听80端口,所以需要root权限.而我打包的PHPDroid则是用于App开发,不需要用80端口,而且我也只打包了PHP,这样APK(不到6MB)就小得多了,而且也不需要root权限.
引用来自“554330833a”的评论
能讲一下这个东西的思路是怎么样的吗你看一下启动脚本start.sh和路由auth.php基本就懂PHPDroid的工作方式了.
PHP解释器从5.4开始就内置了一个可编程的单进程HTTP服务器:
http://php.net/manual/zh/features.commandline.webserver.php
PHP CLI HTTP Server启动时可以传一个PHP脚本充当路由.
php -c php.ini -S 127.0.0.2:8181 -t /www auth.php
每一个请求的资源(包括静态资源)都要经过auth.php处理.
@_君剑 auth.php通过识别UserAgent来判断是否允许访问.
UserAgent是启动时随机生成在应用目录里,WebView访问时读取并设置,
这样,只有应用的WebView才能访问PHP服务,系统其他应用比如浏览器访问则返回Forbidden.
至于端口,也不是固定的,PHP启动前会用fsockopen自动找到可用的端口.
另外就是我把libc库的DNS配置resolv.conf和hosts都使用了相对目录(当前目录),并且我把文件放到了网站根目录.
引用来自“独立风华”的评论
如果 java 能像 C/C++ 那样,不属于任何一家公司,那也挺好引用来自“空空乳业”的评论
eechen是个厉害的javaer。话说这个框架怎么从javascript调用java的,求大神写个开发手册。网站的根目录位于:
/data/data/net.php.phpdroid/php/www
开发时可以把根目录放到SD卡的phpdroid文件里.
android.webkit.JavascriptInterface是Android自带的东西,下面是JS调用Java写的功能示例:
Java代码:
webview.addJavascriptInterface(new Object() {
@JavascriptInterface
public String getprop(String prop) {
return java.lang.System.getProperties().getProperty(prop);;
}
}, "android");
WebView里的HTML代码:
<a href="javascript:void(0)" onclick="alert(android.getprop('os.name'))">net.dns1</a>