Flex SDKのswfutilsでswfとXMLの相互変換を試してみる
SWFファイルフォーマットとライセンス(その2) で、swfutils.jarがSWFとSWFXというXMLフォーマットで相互変換できそうだとお伝えしましたが、その後相互変換に挑戦してみた経過をまとめます。
Flex SDKの用意
svn trunkのFlex SDKを用意します。(多分、sdk/branches/3.0.x を利用してもこの記事で行っている範囲では同じだと思います)
今回の例では、Windows XPで、C:\usr\flexsdk にFlex SDKをインストールしますが、皆さんの好みで適当に読み替えてください。SubversionとJDKとantはインストールされて環境変数(%PATH%, %JAVA_HOME%, %ANT_HOME%等)は適当に設定されているものとします。
C:\>cd usr\ C:\usr>svn co http://opensource.adobe.com/svn/opensource/flex/sdk/trunk flexsdk C:\usr>cd flexsdk C:\usr\flexsdk>ant C:\usr\flexsdk>set FLEX_SDK=C:\usr\flexsdk C:\usr\flexsdk>set PATH=%FLEX_SDK%\bin;%PATH%
SWFからSWFXへの変換
この段階で、SWFからSWFXへの変換はできます。ためしに、弊社のTOPページで使われているFlashを解析してみます。http://www.klab.org/images/main.swf をダウンロードして、C:\work ディレクトリ内に保存してください。
C:\usr\flexsdk>cd C:\work C:\work>swfdump -out klab.swfx main.swf
これで、klab.swfxという名前のXMLファイルができました。
ちなみに、ここでは%FLEX_SDK%/bin/swfdump.exeという実行ファイルを利用しましたが、同じディレクトリにシェルスクリプト版のswfdumpも用意されています。シェルスクリプトのソースを読めば、swfdumpで実際に実行されるのが、java -jar %FLEX_SDK%/lib/swfdump.jar
であることが判ります。
swfxc.jarとswfxc.batの作成
今度はSWFXからSWFへの変換をしたいのですが、こちら側のコマンドはありません。ソースコードを読むと、SwfxParser.javaを使えばできそうなので、SWFXからSWFへの変換用のjarを作ってみます。
jarの名前は、SWFX Compilerの略で、swfxc.jarにしました。%FLEX_SDK%/modules/swfutils/build.xmlを修正して、swfxc.jarを作成するようにします。次のpatchを当ててから、もう一度antを実行すれば、%FLEX_SDK%/lib/swfxc.jarができあがります。
Index: build.xml =================================================================== --- build.xml (revision 751) +++ build.xml (working copy) @@ -60,13 +60,24 @@ <attribute name="Class-Path" value="asc.jar swfutils.jar"/> </manifest> </jar> - + <echo message="Building lib/swfxc.jar"/> + <jar file="${lib.dir}/swfxc.jar" basedir="${module.src}" includes="flash/swf/tools/swfx.xsd"> + <manifest> + <attribute name="Sealed" value="${manifest.sealed}"/> + <attribute name="Implementation-Title" value="${manifest.Implementation-Title} - SWFx Compiler"/> + <attribute name="Implementation-Version" value="${manifest.Implementation-Version}.${build.number}"/> + <attribute name="Implementation-Vendor" value="${manifest.Implementation-Vendor}"/> + <attribute name="Main-Class" value="flash.swf.tools.SwfxParser"/> + <attribute name="Class-Path" value="asc.jar swfutils.jar"/> + </manifest> + </jar> </target> <target name="clean" description="clean"> <delete failonerror="false" includeEmptyDirs="true"> <fileset file="${lib.dir}/swfutils.jar"/> <fileset file="${lib.dir}/swfdump.jar"/> + <fileset file="${lib.dir}/swfxc.jar"/> <fileset dir="${module.classes}"> <include name="**/*"/> </fileset>
このjarを直接叩いても良いのですが、面倒なので、batファイルを作成する事にします。次のようなbatファイルを、%FLEX_SDK%/bin/swfxc.batという名前で作成してください。
java -jar %FLEX_SDK%\lib\swfxc.jar -aspath . %1 %2 %3 %4 %5 %6 %7 %8 %9
swfxc.batができたので、ためしに先ほど作成したklab.swfxをswfに戻してみます。swfxcは引数無しで実行してもusageを出したりしてくれないのですが、 SwfxParser.java を読むと、入力ファイル名を引数で指定し、その拡張子を.swfに変更したものを出力することがわかります。ということで、実行してみましょう。
C:\work>swfxc klab.swfx
・・・klab.swfができません。失敗です。
(続く)