ホームページ >バックエンド開発 >PHPチュートリアル >PHPDroid をダウンロード: WebView および PHP 組み込み HTTP サーバーに基づいて Android アプリケーションを開発します

PHPDroid をダウンロード: WebView および PHP 組み込み HTTP サーバーに基づいて Android アプリケーションを開発します

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-20 12:32:121925ブラウズ

私は個人的に、DroidPHP のチュートリアルに従って Ubuntu でクロスコンパイル ツール チェーン arm-none-linux-gnueabi を使用しています

Android (ARM アーキテクチャ) および Raspbian (Debian ベースの Linux ディストリビューションに基づく ARM アーキテクチャ) に適した PHP インタープリタ (cli、cli-server) を構築しました。

ダウンロード アドレス: http://pan .baidu.com。 /s/1gfJcXbX
コンテンツには以下が含まれます:
main: このディレクトリには、主に MainActivity.java とアセット データが含まれます。
phpdroid。アプリケーションの例。PHP と BusyBox を含めてサイズは約 7MB です。
ここで注意する必要があるのは、BusyBox は PHP にとって必要なものではないということです。
これは、PHP が呼び出すことを容易にするためだけにパッケージ化されています。一般的に使用される GNU/Linux コマンド、
BusyBox を削除すると、APK パッケージは 600 KB 削減できます

パッケージ内の PHP はパスに依存せず、実行に root 権限を必要としないことを強調する必要があります。 ,
assets/php/ のディレクトリ構造を維持している限り、アプリケーションで正常に実行できます。
PHP のバージョンは 5.5.9 です。


基本的な動作原理。 PHPDroid の説明: Java は PHP の組み込み HTTP サーバーを起動し、WebView を開いて PHP 駆動の HTTP サービスにアクセスします。
このうち、WebView は人間とコンピューターの対話を実現するために使用されます。グラフィカル インターフェイス プログラミングには従来の HTML/CSS/jQuery テクノロジを使用します。
PHP はローカル ファイル システム、SQLite データベース、ネットワークとの対話を担当します。

PHPDroid がその機能を追求しているわけではないことを強調しておく必要があります。 Java アプリのように Android システムが提供する API にアクセスする
PHPDroid の利点は、従来の Web 開発技術 HTML/CSS/JS/PHP/SQL を使用して、WebView に基づいてローカル Web アプリを開発できることです。 PHPDroid のローカル PHP は、Android が Java に提供する API にアクセスできませんが、ローカル ファイル システム (アプリケーション ディレクトリ) や SQLite を操作し、ネットワークと対話することができます。
たとえば、ニュース リストを取得するには、WebView にアクセスします。
リモート サーバーは、ニュースのタイトルと概要を含む JSON を返し、ローカル PHP はそれを配列に変換して WebView に出力します。
このローカル PHP は WebView のサーバー側であり、リモート サーバーのクライアントでもあり、WebView とリモート サーバー間のデータ通信の転送ステーションであることがわかります。 WebView とローカル PHP 全体としては、Android API を呼び出すことができないローカル WebApp です。
結局のところ、Android は Linux カーネルであり、すべてがファイルであるという考えがまだ存在します。
PHP には権限があるため、一部のシステム データ (/proc/cpuinfo など) を読み取ることは問題ありません。


PHPDroid の詳細な動作原理:

phpdroid/app/src/main/ java/net/php/phpdroid/MainActivity.java MainActivity は、onCreate の最初の開始時にコピーされます: /data/app/net.php.phpdroid.apk/assets/php/
から
/data/data/net .php.phpdroid/php/

次に、Runtime.getRuntime().exec が PHP サービス起動スクリプトを実行します:
/data/data/net.php.phpdroid/php/ bin/start.sh
#!/system/bin/sh
chmod 700 $1/php/bin/busybox
chmod 700 $1/php/bin/php
$1/php/bin/php $1/php/bin/ua .php #UserAgent をランダムに生成
$1/php/bin/php $1/php/bin/port.php #利用可能なポートを取得
$1/php/bin/php
- c $1/php/bin/ php.ini
-d app_dir="$1"
-d Upload_tmp_dir="$1/php/tmp"
-d session.save_path="$1/php/tmp"
-S 127.0.0.2:`cat $1/php/bin/port`
-t $1/php/www
$1/php/bin/auth.php
>/dev/null 2>&1 &
echo $! > $1/php/bin/pid #Record PHP PID
return 0
このスクリプトの機能は、WebView をマークするために使用される UserAgent をランダムに生成し、利用可能な127.0.0.2 のポート、
次に、PHP サーバーを起動し、kill でシャットダウンするための PID を記録します。
PHP の組み込み HTTP サーバーの概要については、次を参照してください:
https://wiki.php .net/rfc/builtinwebserver

ここで:
/data/data/net.php.phpdroid/php/bin/ua.php
file_put_contents(dirname(__FILE__) ).'/ua', sha1(uniqid(mt_rand(), true)));

/data/data/net.php.phpdroid/php/bin/port.php
//PHP は fsockopen を使用します。ポートが占有されているかどうかを確認し、使用可能なポートを返します。
$port = 8181;
while ( $fp = @fsockopen('127.0.0.2', $port, $ errno, $errstr, 1) ) {
fclose($fp);
$port++;
file_put_contents(dirname(__FILE__).'/port', $port);
/data/data/net.php .phpdroid/php/bin/auth.php
//PHP サービス プロセスをトリガーして resolv_php.conf を開き、resolv_php.conf と auth を要求します.php を同じディレクトリに置く
gethostbyname('localhost ');
$ua = file_get_contents(dirname(__FILE__).'/ua');
if(isset($_SERVER['HTTP_USER_AGENT') ]) && $_SERVER['HTTP_USER_AGENT']===$ua ) {
return false;
} else {
exit('Auth Failed');
PHP サービス各リクエストを処理する前に auth.php ファイルが実行されます。
ua (UserAgent) が一致しない場合、プログラムは終了します。
Android 上のアプリケーションはユーザーに対応し、各アプリケーション ディレクトリはユーザーによるアクセスのみを許可します。アプリケーションが属するユーザー、
したがって、電話機が root 化されていない限り、他のアプリケーションは PHPDroid アプリケーション ディレクトリ内のデータを読み取ることができません。
アプリケーション MainActivity.java は ua ファイルを読み取り、WebView の UserAgent として設定するため、PHP サービスにアクセスできます。 🎜> ブラウザなどの携帯電話上の他のアプリケーションには、/data/data/net.php.phpdroid などの他のアプリケーション ディレクトリを読み取る権限がないため、
は PHPDroid によって生成された ua を読み取ることができず、当然のことながら、
MainActivity.java
webview.getSettings().setUserAgentString(ua);
webview.loadUrl("http://127.0.0.2:" + ポート); 🎜>
DNS 解決に関して、glibc はデフォルトで /etc/resolv.conf
にアクセスします #define _PATH_RESCONF "/etc/resolv.conf"
glibc をコンパイルするときに、相対パスに変更しました:

# _PATH_RESCONF "./resolv_php.conf"

/data/data/net.php.phpdroid/php/bin/resolv_php.conf
# Baidu パブリック DNS http://dudns.baidu. com/
ネームサーバー 180.76.76.76
# CNNIC パブリック DNS http://www.sdns.cn/
ネームサーバー 1.2.4.8
ネームサーバー 210.2.4.8
glibc ライブラリが静的にリンクされた PHP、 auth.php で gethostbyname('localhost') 操作を実行すると、
は auth.php が配置されているディレクトリ内の resolv_php.conf へのアクセスをトリガーし、それによって DNS を実行します。

より良い方法が必要です。 Android を呼び出すには getprop net.dns1 を使用してローカル DNS を取得し、それを resolv_php.conf に追加します。
しかし、奇妙なことに、adb シェルで getprop net.dns1 を実行すると、
A セットが正しく出力されます。 echo shell_exec(' getprop net.dns1'); 出力はありません。
echo shell_exec('vmstat'); を実行すると正常に出力されます。

問題はここにあります。権限の問題でしょうか?

glibc のコンパイルに関して、コマンドを呼び出す /bin/sh も Android の /system/bin/sh に変更しました。 、 これにより、PHP のshell_exec およびその他の関数が正常に実行されます。
sed -i "s{/bin/sh{/system/bin/sh{" ./libio/oldiopopen.c
sed -i "s{/bin/sh{/system/bin/sh{" ./libio/iopopen.c
sed -i "s{/bin/sh{/system/bin/sh{" ./posix/tst -vfork3.c
sed -i " s{/bin/sh{/system/bin/sh{" ./posix/bug-regex9.c
sed -i "s{/bin/sh{/ system/bin/sh{" ./sysdeps/posix/system.c
sed -i "s{/bin/sh{/system/bin/sh{" ./sysdeps/generic/paths.h
sed -i "s{/bin/sh{" /system/bin/sh{" ./sysdeps/unix/sysv/linux/paths.h
PHP の proc_open 関数も同様に変更する必要があります。
sed -i "s{/bin/sh{ /system/bin/sh{" ext/standard/proc_open.c
このようにして、PHP は Android と BusyBox で提供される GNU/Linux 共通コマンドを問題なく呼び出すことができます。 🎜>
onKeyDown が押されると MainActivity が返されます。 KEYCODE_BACK キーがアプリケーションを終了するために使用される場合:
Stop.sh が呼び出され、PHP サービスが閉じられます。 stop.sh の内容は次のとおりです。 #!/system/bin/sh
ua=$1/php/bin/ua

if [ -r $ua ]; then
rm $ua
fi
port=$1/php /bin/port
if [ -r $port ]; then
rm $port
fi
pid=$1/php/bin/pid
if [ -r $pid ];
kill `cat $pid`
rm $pid
fi
return 0
ua と port の 2 つのファイルを削除して、PHP プロセスを閉じるだけです
実際、MainActivity はこれを実行します。また、予期せず終了した可能性のある最後のアプリケーションから残ったもののクリーンアップを開始するときに stop.sh を呼び出します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。