昔作った Adobe AIR のアプリをメンテしようとしたら、リリースビルドが出来ずに苦労した件
Flash Builder x AIR
Adobe AIR は、一つのソースコードから様々なOSやデバイス向けのアプリを作れる仕組みです。
そして、Flash Builder は、Adobeが開発したデベロッパー向けのアプリで、FlashやAIRの開発が行えます。Flashで開発してた頃はメインで使っていました。数年前まではAIRを使って、デスクトップアプリ向けやモバイル向けに、いろんなゲームやツールを作ってました。
昔作ったairアプリがインストールできなくなってしまった
ふと、昔作ったアプリのインストーラーである、拡張子 .air ファイルをクリックすると、
Sorry, an error has occurred.
The application could not be instlled because the installer file is damaged. Try obtaining a new installer file from the application author.
というエラーが出ました。
ネットの情報では、このエラーはインストーラーを作ったときの証明書が古いと出るそうで、たしかにインストーラーをコンパイルしたのは今から数年前で、その証 明書を作ったのはそれから更に数年前なので、かなり古いです。
再ビルドしようとしたらエラーが出た
それなら新しく証明書を作りビルドしなおせば良いと思い、そうしようとしたところ、こんどは、
Error creating AIR file:Could not generate timestamp: Operation time out
というエラーが出ました。
調べて見ると、これは、Flexの使っている Java 6 が参照しているタイムスタンプサーバがいまは動いてないのが問題で、Java 7 か 8 に上げれば解決するそうです。
Fixing the ‘timestamp’ error when packaging an AIR app for desktop
Javaのバージョンをあげる
マシンにはすでに Java 8 が入っています。ところが、Flash Builderは古いバージョンのJavaを参照しているので、新しい方を参照するように直す必要があります。 macでの対処法はここに書いてあったので、このとおりにやってみました。 Running Adobe Flash Builder on Win and Mac with Java 7/8 (UPDATED)
まず、ターミナルで、Javaのバージョンを調べます。
java -version
私の環境では、このように返ってきました。
java version "1.8.0_71"
このバージョンをメモしておき、次のコマンドのJavaのバージョンjdk1.8.0_71
のところは、自分の環境のものに置き換えて実行します。
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_71.jdk/Contents/Home
次のコマンドはroot権限が必要です。これもJavaのバージョンを自分の環境のものに置き換えて実行します。これは、私の環境では失敗しましたが、このパスにフォルダをつくればいいのでFinderから手動で作っても大丈夫です。
sudo mkdir –p /Library/Java/JavaVirtualMachines/jdk1.8.0_71.jdk/Contents/Home/bundle/Libraries
続けてこのコマンドを実行します。これもJavaのバージョンを自分の環境のものに置き換えて実行します。
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_71.jdk/Contents/Home/jre/lib/server/libjvm.dylib /Library/Java/JavaVirtualMachines/jdk1.8.0_71.jdk/Contents/Home/bundle/Libraries/libserver.dylib
上記のJAVA_HOMEに設定したパスの一つ上に Info.plistというファイルがありますが、これをテキストエディタで開くと
<key>JVMCapabilities<key> <array> <string>CommandLine</string> </array>
の箇所があるので、array の中に2行追加します。
<key>JVMCapabilities<key> <array> <string>JNI</string> <string>undledApp</string> <string>CommandLine</string> </array>
そして、Flash Builderのアプリ "/Applications/Adobe Flash Builder 4.7/Adobe Flash Builder 4.7.app" のところまで行き、右クリックでコンテキストメニューを開き、Show Package Contents で中身を見ます。更に奥の階層の中の、Contents/MacOS/Adobe Flash Builder 4.7.ini をテキストエディタで開きます。このファイルまでのフルパスは、
/Applications/Adobe Flash Builder 4.7/Adobe Flash Builder 4.7.app/Contents/MacOS/Adobe Flash Builder 4.7.ini
です。
そして、このファイルの最後の行に、
-Djava.library.path=../../../eclipse/plugins/com.adobe.flexide.nativelibs_4.7.0.349722/os/macosx/:../../../eclipse/plugins/com.adobe.flexide.amt_4.7.0.349722/os/macosx/:../../../eclipse/plugins/com.adobe.flexbuilder.utils.osnative_4.7.0.349722/os/macosx/
を足します。念のため事前にこの相対パスが存在するか確かめてみましたが、私の環境では大丈夫でした。
そして、これが大事ですが、マシンを再起動 してください。Flash Builderを再起動しただけでは変更が反映されません。
最新のAIR SDK を昔のやり方で入れようとして失敗
実は、Flash Builder を Java 8 で動くようにしただけでは、Timestampの問題は解決しませんでした。調べてみると、SDKを最新にしたら直ったという報告があったので、最新を入れてみることにしました。
ですが、AdobeのSDKは4.6が最後のバージョンで、その後オープンソース化されて、いまは Apache Flex SDK という名称に変わっていました。 ちなみに、SDKは Adobeが開発していた時代は Flex と AIR は別々に配布されていて、zipを解凍したものを、Flexのフォルダの中にAIRのフォルダの中に混ぜて使っていました。混ぜたフォルダをアプリの sdks フォルダの中に置き、Flash Builderの プロジェクトのプロパティの Flex Compiler から Configure Flex SDKs を選んで、そのフォルダを読み込めば利用できます。
まず、今回の問題はAIR書き出し時の問題なので、最新の AIR SDK 28.0 をFlex4.6に混ぜてみました。しかし、Timestampの問題は解決しません。
AIR SDKのバージョンがあがったので、アプリ名-app.xml の 名前空間の
<application xmlns="http://ns.adobe.com/air/application/3.1">
のバージョンの部分を
<application xmlns="http://ns.adobe.com/air/application/28.0">
に変えました。しかし、今度は、その名前空間が認識できないというエラーが出て、ビルドできません。
最新のFlex SDK を昔のやり方で入れようとして失敗
Flex SDKも最新にしないといけないことに気づき、sdkをzipで落としてきて入れようとしたら、Flash Builderがそれをうまく読み込んでくれませんでした。エラーメッセージを見るといろんなファイルが足りないようです。おそらく著作権などの問題が絡んでいて一緒に配布できないのでしょう。一つずつ入れて行こうとしましたが、 ant を使って解決できると書いてあったので試してみました。ですが、うまくいきませんでした。
SDK Installer を使ったらSDKを最新にできた
いろいろ探していたら、SDK Installer を見つけました。なんと今は、インストーラーを使ってSDKをインストールできるようになっていました。
これを使って、SDKを最新にすることができました。
でもFlash Builderが不安定、パッチをあてて解決
その後、ビルドしようとすると、
Error: Comparison method violates its general contract!
というエラーが頻発し、うまくビルドできませんでした。 解決法を探していたら、 この記事 Error: Comparison method violates its general contract! の対処法 を見つけました。Flex SDKのバグのようで、その対処のパッチを作ってくれていたので、それを使わせていただいたところ、見事解決しました。
そして、無事、airアプリをビルドすることができるようになりました。
まとめ
今回はかなり大変でしたが、まとめると、Timestamp問題を解決するためには、これらが必要でした。
- Flash BuilderをJava 8で動くように設定する
- ApacheのSDK Installerを使って FlexとAIRのSDKを最新にする
- アプリ名-app.xml の 名前空間を最新のAIRのバージョンに書き換える
- Flex SDKのバグに対処するためのパッチをあてる
Flashはもう2020年に終了が決まっていますが、AIRはどうもその後もまだ続くようです。 Flash Playerのサポートは2020年末で終了、ただしAdobe AIRは継続の方針
せっかく最新の環境にできたので、もうすこしやってみようかなと思いました。