AIRのリリースビルドをAntで自動化する

FlexBuilderのメニュー「Export Release Build...」からAIRファイルを作成できるけど、
環境毎に設定ファイルとか、エンドポイントのURL(AIRの場合はコンパイル時に固定される)とかの変更したい場合は、該当するファイルを修正したり、置き換えたりする必要があってめんどくさい。


で、Antで自動化してみた。
いろいろはまって1日半かかったぞ。


テスト環境用(airapp_test_v1.0.air)と、本番環境用(airapp_honban_v1.0.air)のAIRファイルをAntで生成する。
※v1.0のところは-app.xmlのversionの値を入れたい。

今回対象のプロジェクト構成

/
	build.xml (Antのビルドファイル)
	src/ (AIRプログラムソース)
		com/ (AS、MXMLソース)
		css/ 
		icon/
		app.properties (環境依存ファイル)
		main.mxml
		main-app.xml
		updaterConfig.xml (環境依存ファイル)
	deploy/ (ビルドに必要なファイル、環境依存ファイル)
		test/ (テスト環境依存ファイル)
			app.propertites
			updaterConfig.xml
			messaging-config.xml (※1)
			proxy-config.xml (※1)
			remoting-config.xml (※1)
			services-config.xml (※1)
		honban/ (本番環境依存ファイル)
			app.propertites
			updaterConfig.xml
			messaging-config.xml (※1)
			proxy-config.xml (※1)
			remoting-config.xml (※1)
			services-config.xml (※1)
		password.p12 (オレオレ証明書)
	target/ (ビルド結果出力先)

※1 endpointを環境毎に変えてやる必要がある。コンパイルタスクでservices-config.xmlを渡す。

作ったbuild.xmlファイル

<project name="airbuild" basedir="." default="all">

	<property name="SDK_HOME" value="C:/Program Files (x86)/Adobe/Flex Builder 3/sdks/flex_sdk_3.4.1.10084/" />
	<property name="ADL" value="${SDK_HOME}/bin/adl.exe" />
	<property name="ADT.JAR" value="${SDK_HOME}/lib/adt.jar" />
	<property name="MXMLC.JAR" value="${SDK_HOME}/lib/mxmlc.jar"/> 

	<!-- Project properties -->
	<property name="APP_ROOT_DIR" value="./src" />
	<property name="AIR_NAME" value="airapp" />
	<property name="APP_DESCRIPTOR" value="${APP_ROOT_DIR}/main-app.xml" />
	<property name="MAIN_SOURCE_FILE" value="${APP_ROOT_DIR}/main.mxml" />
	<property name="RELEASE_DIR" location="./target" />
	<property name="DEPLOY_DIR" value="deploy" />
	<property name="STORETYPE" value="pkcs12" />
	<property name="KEYSTORE" value="deploy/password.p12" />
	<property name="PASSWORD" value="password" />
	
	<target name="all">
		
		<!--main-app.xmlからバージョンをゲットする。-->
		<loadfile property="version" srcFile="${APP_ROOT_DIR}/main-app.xml">
			<filterchain>
				<tokenfilter>
					<containsregex pattern="&lt;version>.+&lt;/version>"/>
					<trim/>
				</tokenfilter>
				<striplinebreaks/>
				<tokenfilter>
					<replacestring from="&lt;version>" to=""/>
					<replacestring from="&lt;/version>" to=""/>
				</tokenfilter>
			</filterchain>
		</loadfile>
		<echo message="v${version} building."></echo>		
		
		<!-- テスト環境用 -->
		<antcall target="package">
			<param name="ENV" value="test"/>
		</antcall>
		
		<!-- 本番環境用 -->
		<antcall target="package">
			<param name="ENV" value="honban" />
		</antcall>
		
	</target>

	<target name="init" depends="clean">
		<echo message="${ENV} initing..." />
		<mkdir dir="${RELEASE_DIR}/${ENV}"/>
	</target>
	
	<!-- コンパイル(swfを作る) -->
	<target name="compile" depends="init">
		
		<echo message="${ENV} compiling..." />
		<java jar="${MXMLC.JAR}" fork="true" failonerror="true">
			<arg value="-debug=false"/>
			<arg value="+flexlib=${SDK_HOME}/frameworks"/>
			<arg value="+configname=air"/>
			<arg value="-services"/>
			<arg value="${DEPLOY_DIR}/${ENV}/services-config.xml"/>
			<arg value="-file-specs=${MAIN_SOURCE_FILE}"/>
			<arg value="-output=${RELEASE_DIR}/${ENV}/main.swf"/>
		</java>
		<echo message="${ENV} compiled." />
	</target>
	
	<!-- AIRファイルにする -->
	<target name="package" depends="compile">
		
		<copy todir="${RELEASE_DIR}/${ENV}">
			<fileset dir="${DEPLOY_DIR}/${ENV}" includes="app.properties,updaterConfig.xml" ></fileset>
		</copy>
		
		<echo message="${ENV} packing..." />
		
		<java jar="${ADT.JAR}" logerror="yes" fork="true">
			<arg value="-package" />
			<arg value="-storetype" />
			<arg value="${STORETYPE}" />
			<arg value="-keystore" />
			<arg value="${KEYSTORE}" />
			<arg value="-storepass" />
			<arg value="${PASSWORD}" />
			<arg value="${RELEASE_DIR}/${AIR_NAME}_${ENV}_v${version}.air" />
			<arg value="${APP_DESCRIPTOR}"/>
			<arg value="-C"/>
			<arg value="${APP_ROOT_DIR}"/>
			<arg value="css"/>
			<arg value="icon"/>
			<arg value="-C"/>
			<arg value="${RELEASE_DIR}/${ENV}"/>
			<arg value="main.swf"/>
			<arg value="app.properties"/>
			<arg value="updaterConfig.xml"/>
		</java>
		<echo message="${ENV} packed." />
	</target>

	<target name="clean">
		<delete dir="${RELEASE_DIR}/${ENV}" />
	</target>

</project>

コンパイル(swfを作る)するところ

エンドポイントURL

-servicesでservices-config.xmlを指定してやる事でコンパイル時に決まるエンドポイントのURLを指定できる。

Antがエラーになって困った
compile:
     [echo] local compiling...
     [java] 設定ファイル "C:\Program Files (x86)\Adobe\Flex Builder 3\sdks\flex_sdk_3.4.1.10084\frameworks\air-config.xml" をロードしています
     [java] エラー: Java heap space
     [java] java.lang.OutOfMemoryError: Java heap space

コンパイルでメモリー不足ってありえないだろ…。
とりあえず、AntのJREをSeparete JREから64bitのJDKに変更して、引数に「-Xmx1024M -XX:MaxPermSize=256m」指定すれば通った。
つうか、コンパイル時にメモリ使用量が800Mぐらい上昇するけど大丈夫か?

AIRファイルにするところ

証明書のパスワード

-storepassで証明書のパスワードを指定できる。
これを指定しないといつまでたっても終わらない。