[AS3] Parse AnalyticsのiOSのANEを作りたい! ANEビルド編

2014/08/10

この記事は全4回の「Parse AnalyticsのiOSのANEを作りたい!」シリーズの1つです。

[AS3] Parse AnalyticsのiOSのANEを作りたい! 準備編
[AS3] Parse AnalyticsのiOSのANEを作りたい! Static Library編
[AS3] Parse AnalyticsのiOSのANEを作りたい! ActionScript編
[AS3] Parse AnalyticsのiOSのANEを作りたい! ANEビルド編 << イマココ!


こんにちは。きんくまです。

ようやくANEのビルドまで来ました。
完成品のリンクはこちらです。
>> KinkumaDesign/ParseAnalyticsANE

ANEのビルドはAIR sdkに入っているadtというツールで行います。

でもその前に、設定ファイルを書く必要があります。それに関連して以前に書いたリンクはこちらです。
>> [AS3 / ANE] Dropbox Sync APIのiOSのANEを作ろうとしてplatform.xmlでハマったところ

それではまずはiOS用の platform options ファイルを見てみます。

ios_options.xml

<platform xmlns="http://ns.adobe.com/air/extension/4.0">
    <linkerOptions>
	    <option>-ios_version_min 6.0</option>
	    <option>-lz.1.1.3</option>
	    <option>-framework StoreKit</option>
    </linkerOptions>
    <packagedDependencies>
    	<packagedDependency>iOSLib/Parse.framework</packagedDependency>
    </packagedDependencies>
</platform>

前の記事で使っているライブラリを書きました。

もともとはこれを入れる必要があるのですが、
parse_libs1

ただ、ANE用のStaticLibararyではDynamicLibraryを抜かしてこうやってビルドしました。

parse_libs2

ここで ios_options.xmlを見ていただくとわかるのですが、linkerOptionsの項目に抜かしたDynamicLibraryのlibzが入っています。
本来は libz.1.1.3.dylib という名前なのですが、それが lib の ib と、最後のdynlibを抜かして
lz.1.1.3という名前でリンクされます。

また、その他のframeworkのうち、Adobeがデフォルトでリンクしているものは抜かしてかけばよいので、ひとつずつチェックしていくと、StoreKitのみを入れればよいことがわかったので、それのみリンクの設定を書いてあります。
>> iOS ネイティブライブラリ

それで、ios_options.xmlのpackagedDependenciesの項目には、iOS標準ではないサードパーティ製のライブラリを入れます。
今回はParseなので、ParseSDKをリンクしました。また、サードパーティ製の.ライブラリはiOSには標準で入っていないので、ANEを作る際に同梱する必要があります。なので、buildフォルダの中にiOSLibフォルダを作ってその中に置きました。
iOS標準のものである、libzやStoreKitはbuildフォルダには入れる必要はないです。

extension.xml

つぎにextension.xmlをみていきます。

<?xml version="1.0" encoding="utf-8" ?>
<extension xmlns="http://ns.adobe.com/air/extension/4.0">
    <id>com.kumade.ane.parse.analytics.extension</id>
    <versionNumber>1.0.0</versionNumber>
    <platforms>
    <!--
        <platform name="Android-ARM">
            <applicationDeployment>
                <nativeLibrary>xxx.jar</nativeLibrary>
                <initializer>xxxxx</initializer>
            </applicationDeployment>
        </platform>
    -->
        <platform name="iPhone-ARM">
            <applicationDeployment>
                <nativeLibrary>libParseAnalyticsANEiOS.a</nativeLibrary>
                <initializer>ParseAnalyticsAneExtensionInitializer</initializer>
                <finalizer>ParseAnalyticsAneExtensionFinalizer</finalizer>
            </applicationDeployment>
        </platform>
        <!--
        <platform name="iPhone-x86">
            <applicationDeployment>
                <nativeLibrary>libParseAnalyticsANEiOS.a</nativeLibrary>
                <initializer>ParseAnalyticsAneExtensionInitializer</initializer>
                <finalizer>ParseAnalyticsAneExtensionFinalizer</finalizer>
            </applicationDeployment>
        </platform>
        -->
        <platform name="default">
            <applicationDeployment/>
        </platform>
    </platforms>
</extension>

まず、Android-ARMとiPhone-x86のコメントアウト部分ですが、今回はそれように作っていないので、コメントアウトしています。消してもよかったのですが、参考までに残してあります。iPhone-x86はmac上で動くiOSシミュレータアプリ用の設定になります。Static Libraryのときに、iOS Deviceでビルドすると書いたと思うのですが、もしあのときシミュレーターでビルドすれば、このiPhone-x86で使えるようになります。

あとは、iPhone実機用のiPhone-ARMとその他用のDefaultの設定となります。
ここまで書けばあとはビルドするだけです。

ちなみに、私の場合このANEづくりをはじめるときまでx86とかarmとかあまり意識したことなかったのですが、CPUの種類です。x86はmacやwindowsなど主にPC上で動いているのもの。(Core i7とか) ARMは主にスマホなどのモバイル端末で使われているCPUです。CPUの種類が変わると、そのCPU向けにビルドしてあげないとうまく動いてくれません。。なので、iOS実機用のiPhone-armと、mac上で動くiOSシミュレーター用のx-86が分けてあります。(iOSシミュレーターはmacのCPU = x86で動いているので)

ビルドする

ビルドは手動でやると、ちょっと面倒です。ANEを作り始めた最初の頃は、手動で何回もやっていたのですが、すごく面倒くさくなったので、シェルスクリプトでやるようになりました。

手動でやるとわかるのですが、やっていること自体はそんなに難しくなくて、ファイルをコピーしてきたり、zipを圧縮・解凍してということを繰り返すことがメインになります。

それで作ったものがこれです。

build.sh

#!/bin/sh

#=====================
# settings
#=====================

#ANE's name
ANEName="KKParseAnalytics.ane"

#build directory
buildDir="build"

#ActionScript directory and file
ASLibBinDir="ParseAnalyticsANEAS/bin"
ASLibSwcName="ParseAnalyticsANEAS.swc"

#default directory and file
DefaultBinDir="ParseAnalyticsANEDefault/bin"
DefaultSwcName="ParseAnalyticsANEDefault.swc"

#Ane directory in test project
TestAneDir="ParseAnalyticsANETest/ane"

#iOS static library directory in build directory
iOSDir="Release-iphoneos"

#iOS static library for simulator in build directory
#iOSSimDir="Release-iphonesimulator"

#iOS library(Third party)
iOSLib="iOSLib/Parse.framework"

#Android Project
#AndroidDir="xxxxx"

#Android directory in build directory
#AndroidBuildDir="android"

#directory for copy
#AndroidRes="res"

#path for adt tools
adt="/Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flash.compiler_4.7.0.349722/AIRSDK/bin/adt"

#working directroy(you don't have to change it)
WorkingDir="workingdir"
#=====================

# copy AS lib
mkdir ${WorkingDir}

cp -f ${ASLibBinDir}/${ASLibSwcName} ${buildDir}

cp ${ASLibBinDir}/${ASLibSwcName} ${WorkingDir}
unzip -o ${WorkingDir}/${ASLibSwcName} -d ${WorkingDir}
#cp -f ${WorkingDir}/library.swf ${buildDir}/${AndroidBuildDir}
cp -f ${WorkingDir}/library.swf ${buildDir}/${iOSDir}
#cp -f ${WorkingDir}/library.swf ${buildDir}/${iOSSimDir}
rm ${WorkingDir}/*.*

# copy default 
cp ${DefaultBinDir}/${DefaultSwcName} ${WorkingDir}
unzip -o ${WorkingDir}/${DefaultSwcName} -d ${WorkingDir}
if [ ! -e ${buildDir}/default ]; then
    mkdir ${buildDir}/default
fi
cp -f ${WorkingDir}/library.swf ${buildDir}/default

# clean up
rm -r ${WorkingDir}


# copy android res directory
#if [ -e ${buildDir}/${AndroidBuildDir}/${AndroidRes} ]; then
#    rm -Rf ${buildDir}/${AndroidBuildDir}/${AndroidRes}
#fi
#cp -Rf ${AndroidDir}/${AndroidRes} ${buildDir}/${AndroidBuildDir}



# build

cd ${buildDir}

#adt command ========
"$adt" -package \
-target ane ${ANEName} extension.xml \
-swc ${ASLibSwcName} \
-platform iPhone-ARM \
  -platformoptions ios_options.xml \
  iOSLib/Parse.framework \
  -C ${iOSDir} . \
-platform default \
  -C default . 

#below comment out code is tempolary. not used.

#-platform Android-ARM \
#  -platformoptions android_options.xml \
#  -C android . \

#-platform iPhone-x86 \
#  -C ${iOSSimDir} . \




  
#================

cd ../

# copy to test directory
cp -f ${buildDir}/${ANEName} ${TestAneDir}

exit 0

このスクリプト自体他のANEを作るときに使い回しているので、AndroidとiOSシミュレータ用がコメントアウトして入っています。使い回すときは上の方のsettingsを書き換えて、下のadtコマンドあたりをいじるだけでやっています。
このスクリプトの内容的には、さっき書いたようにファイルのコピーやzipの操作をして、adtコマンドでビルドするというものになります。

シェルスクリプトを使うときは、そのフォルダまでcdコマンドで移動したあとに、まず実行権をつけてあげます。

chmod 707 build.sh

とやります。

ls -l

とやると、こんな感じになりました。

% ls -l
total 16
drwxr-xr-x   8 kinkuma  staff   272  7 30 13:56 ParseAnalyticsANEAS/
drwxr-xr-x   2 kinkuma  staff    68  7 30 12:01 ParseAnalyticsANEAndroid/
drwxr-xr-x   8 kinkuma  staff   272  7 30 13:58 ParseAnalyticsANEDefault/
drwxr-xr-x   8 kinkuma  staff   272  7 30 13:59 ParseAnalyticsANETest/
drwxr-xr-x   7 kinkuma  staff   238  7 30 12:04 ParseAnalyticsANEiOS/
-rw-r--r--@  1 kinkuma  staff   271  7 30 18:55 README.md
drwxr-xr-x  10 kinkuma  staff   340  7 30 18:43 build/
-rwx---rwx@  1 kinkuma  staff  2508  7 30 18:26 build.sh*

build.sh が rwx—rwx となっていて、xがついているので、実行権がついているのがわかります。
これで、スクリプトとして実行できるので、コマンドをうちます。ファイル名の頭に ./ をつけるのをお忘れなく。

./build.sh

とやるとビルドがはじまり、時間がちょっとかかるのですが、無事に終わるとbuildフォルダ内に KKParseAnalytics.ane というANEができています。

こんな感じにシェルスクリプトにすると、何かANEの修正や変更が入ったときもコマンド一発でできるようになるので便利です。ターミナル上で、コマンドはカーソルの↑(上)を押せばコマンドの履歴が出るので、上+Enterでできあがるようになります。

あとANEをテストするためのテストプロジェクトを事前に作っておけば、build.shの最後でそのプロジェクトのaneフォルダに作ったaneファイルが上書きコピーされます。

テストプロジェクトを実機で動かすとこんな感じの青い四角が出てくるので、ぽちぽち押します。

parse_test_proj

それで、ParseのDash boardをみるとグラフがあがっていくのが確認できると思います。

parse_dashboard

というわけでParse AnalyticsのiOSのANEを作る説明はおしまいです。
長い間お疲れさまでした!

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る