2013年3月6日 星期三

【技術】Flash Air Native Extension 應用

AIR是啥?

一說到Flash,大部分人想到的,都是網路上內嵌的動畫或遊戲。但事實上,Flash的應用不只是這樣。
在網頁上,我們有 Flash Player,可以用來播放 Flash的內容。但是在網路以外的地方,則有威力強大的Adobe AIR。而似乎知道它的人就比較少了一點。

Adobe AIR 包山包海,從 Windows、Mac、Linux 等電腦作業系統,到 Android、iOS等行動裝置作業系統,都可以看到它的蹤跡。透過 Adobe AIR 我們就能用 Flash(或Flex),打造出跨平台的應用程式,相當好用。

ANE是啥?

而今天要講到的ANE(AIR Native Extension),就是與 Adobe AIR有關的一項應用。

雖然 Adobe AIR 火力強大,讓我們可以用幾乎相同的 AS3 程式碼,做出各種平台皆可使用的應用程式(包括App)。但當然還是有其限制,在某些平台特有的功能,AIR 就可能不支援。由於開發者想要使用的功能包羅萬象,AIR 雖強,卻也很難滿足所有人的要求,何況他必須兼顧那麼多個不同的平台。而開發者當然會想,難道如果 AIR 不支援,我們就只能兩手一攤,就這樣放棄嗎?如果我能力夠強,難道我不能幫 AIR 增加擴充功能嗎?

答案是,可以。所謂的ANE,就是一個專門給 AIR 在特定平台使用的擴充包。
的如果你有足夠的能力,你就可以把在某平台上原生的功能,製作成ANE,附加到 AIR 專案中。讓你的 AIR 程式在該平台上可以使用它的原生功能。

在 Android平台上使用 ANE

老實說我還不會自製ANE。但今天花了很多時間研究,終於知道怎麼在 Flash的 AIR for Android專案當中使用他人做的ANE了。所以就來分享一下我奮鬥的成果,也免得自己不小心忘了。這些步驟應該也適用於其他平台的ANE....吧(我是這麼相信啦...)


以下說明操作步驟:

步驟 1

到網路上找到自己喜歡的ANE,把它的 ane檔案下載下來。(本篇以這個語音辨識功能的ANE作為例子)建議在專案資料夾裡面新增一個資料夾「ane」,用來存放專案用到的ane檔案。

步驟 2

在Flash當中建立新的 AIR For Android 檔案。並且使用較高版本的AIR作為發佈的設定。注意:盡可能幫自己的Flash換個新一點的AIR SDK,以免自己的版本比ANE的版本舊而失敗(更換教學在這裡)。
建立 AIR for Android 檔案
使用較高版本的AIR for Android 發佈設定

步驟 3

在「進階Actionscript3.0設定」中,將ane檔的路徑,加到元件庫路徑的清單中。注意:CS5.5和CS6的作法稍有不同。CS5.5需要把 ane檔複製一份,把副檔名改為swc。將swc的路徑加到清單中(而非ane),並把連結類型設為外部。

↑ Flash CS6 的操作方式
↑ Flash CS5.5 的操作方式

步驟 4

接下來就可以進行專案的製作與程式的撰寫了。由於我們之前已經把ane檔加入清單,因此在我們在程式碼當中,就可以使用ANE所提供的類別了。(由於所使用的ANE只支援Android平台,所以在電腦上發佈測試時將會出現錯誤,此為正常現象。為避免除錯上的妨礙,建議先自行製作一個替身類別來代替ANE提供的類別,等到程式的其他部分確定可以運行,再換回真正的ANE類別)
出現這類訊息,或某些執行階段錯誤,應該是正常現象。

步驟 5

在「AIR for Android設定」中,勾選所需要的權限。(有些ANE會在使用說明當中提到所需的權限)

步驟 6

檢查「XXX-app.xml」描述檔(XXX與 fla檔案名稱相同)。確定標籤<manifestAdditions>裡面有確實列出需要的權限,且<extensions>標籤和<extensionID>標籤的內容格式也正確。
<manifestAdditions>的標籤結構應該會在前一個步驟由Flash自動產生,所以應該不用手動加入。
而<extensions>標籤的部分,Flash CS6 通常也會自動產生,但CS5.5則需要手動把下面的結構放在<application>與</application>之間。

<extensions>
    <extensionID>com.ruedaminute.SpeechService</extensionID>
</extensions>

「com.ruedaminute.SpeechService」是範例,請自行置換成所使用之ANE的ID。(ane檔其實是個壓縮檔,解壓縮之後,就可以在 META-INF\ANE\extension.xml 當中的<id>標籤中,找到它的ID。)

步驟 7

在命令提示自元中,使用AIR SDK提供的 bin\adt.bat檔來打包apk檔案。(因為Flash目前尚不支援打包ANE的功能。一旦使用了ANE,就無法使用 Flash輸出 apk檔。)

adt -package 
    -target apk 
    -storetype pkcs12 -keystore ../codesign.p12 
    myApp.apk 
    myApp-app.xml 
    myApp.swf icons 
    -extdir extensionsDir

「../codesign.p12」請置換成自己所使用的憑證檔的路徑。
「myApp.apk」是輸出的apk檔案的檔名,可以自行更改。
「myApp-app.xml」請置換成專案描述檔的路徑,其中「myApp」的部分跟 fla檔的檔名相同。
「extensionsDir」指的是放置 ane檔案的資料夾路徑(若同時用到多個ANE建議可以放一起),請自行置換。

在執行此命令時,會要求輸入憑證檔的密碼。若出現 test字樣,且沒有其他錯誤訊息,則表示成功。

步驟 8

在命令提示自元中,使用AIR SDK提供的 lib\android\bin\adb.exe檔案來將 apk安裝到 Android手機上。

adb devices
adb install example.apk

詳細的說明可以參考這裡

於是,這樣就完成囉~

完成品

我使用語音辨識的ANE,依照上面的步驟,完成了我的測試App,並在Galaxy SII上成功執行!點擊文字欄位,就會跳出Android內建的語音辨識視窗,等你說完一句話,就會跳回去,並在文字欄位中看到辨識出來的文字內容!我想,要做一款自己的語音命令App,甚至語音控制的遊戲還蠻有可能的!歡迎有興趣的人下載這個範例專案當參考。

測試成功!

參考資料

官方ANE教學文件:使用 Adobe AIR 的原生擴充功能