Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

File_AndroidManifest作ってみた

2012年ももう20日近く経とうとしていますが、今年最初のエントリです:-)
昨年の10月にKlabさんの開発者Blogに面白そうなエントリが上がりました。

AndroidアプリにはAndroidManifest.xmlというマニフェストファイルが含まれていますが、プレーンなXMLファイルではなく独自のバイナリ形式となっているため通常は読むことができません。Klabさんのエントリではバイナリデータの解析を行ってデータフォーマットを類推し、Cによるパーサを作成しています。
で、「おお、これ面白い」ということでPHPでも実装してみました。まあ、特に何かをするという訳ではないんですが(汗)

インストールはpearコマンド一発です。

$ sudo pear channel-discover openpear.org
$ sudo pear install openpear/File_AndroidManifest-alpha
$ 

ざっとした使い方は以下のとおりです。

<?php
error_reporting(E_ALL);
require_once 'File/AndroidManifest.class.php';

$manifest = new AndroidManifest(file_get_contents('/path/to/AndroidManifest.xml'));
$element = $manifest->getSimpleXMLElement();
          :

AndroidManifestクラスをrequireしてコンストラクタにAndroidManifest.xmlの中身を丸ごと渡し、結果をgetXMLメソッドもしくはgetSimpleXMLElementメソッドで受け取ります。前者は文字列で、後者はSimpleXMLElementオブジェクトを返します。
Klabさんのエントリで使用しているエンコードずみAndroidManifest.xmlを読み込ませた場合、getXMLメソッドで以下のようなXMLが取得できます。実際は整形されておらず、1行で返されます。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0"
    package="jp.klab.sample.myapp" >
    <uses-sdk android:minSdkVersion="4" ></uses-sdk>
    <application android:label="@0x7F050001" android:icon="@0x7F020000" >
        <activity
            android:label="@0x7F050001"
            android:name=".MyApp"
            android:excludeFromRecents="false"
            android:launchMode="2"
            android:configChanges="0x000000A0" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" ></action>
                <category android:name="android.intent.category.LAUNCHER" ></category>
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
</manifest>

ホントは年末年始の宿題として作ってあったのですが、ソースのコメントを書くのが億劫になってしまって伸び伸びになってしまいました。。。orz