ラベル V8 の投稿を表示しています。 すべての投稿を表示
ラベル V8 の投稿を表示しています。 すべての投稿を表示

2013/07/31

Titanium Mobile Android ダイエット

先日Twitter上で、Android 用の Ti アプリのサイズが大きいのでなんとかしたいって話があって、@uk1124
[Titanium]APKのサイズを小さくする方法で結果をレポートしてくださった。
今回はこの補足です。

まず、@isis331 のいうandroid/builder.pyを修正する方法では、ディストリビューション用のapkでは何の効果もありません。
なぜかというと、Ti SDK 3.1.1 GAで生成されるディストリビューションのパッケージには、デフォルトでは、ARMv5(armeabi)とARMv7(armeabi-v7a)のコードしか含まれないからです。
では、x86を含めるにはどうするかというと@infosiaさんの指摘されたtiapp.xml の<abi>で、allを指定する必要があります。これで、ARM用2つに加えてx86も含まれることになります。
反対にarmeabiだけを指定すれば最小サイズのものが出来上がります。

さて、android/builder.pyを修正する方法が有効なのは、ディトリビューション用ではなく手元でテストする場合に生成されるapkに対してです。"Install to Android Device"等のコマンドで、ビルドされたときには、全てのabiが含まれた状態でビルドされます。この場合には、android/builder.pyを修正して、必要なabiだけ配列に入れておけば、最小限のサイズのapkが生成されます(x86を省けば、8.7Mから6.2M程度になります)。
デバイスへの転送速度が気になる向きには、有効な手段かも知れません。

(注)
apkの中身は、zipとして解凍してlibs以下のフォルダをみれば、確認できます。



2013/05/27

Titanium SDK をMIPS 対応にする(完成か?)

Titanium SDK のMIPS対応の続報です。


前回問題になっていた
libtiverify
libtiprofiler
のMIPS版が存在しない問題ですが、ないなら使わないようにSDKを修正することで対処可能です。今のところこれらがなくても、作成されたアプリは支障なく動作するようです。libtiverifyはおそらくTi アプリ起動時にライセンス等々を確認するためのもの、libprofilerはTiアプリのプロフィリングのためのものだと思われます。

その他、いろいろワーニングがでている箇所を、新しいV8のお作法通りにきれいにして、これで、無事解決と思ったのですが、そうはいかず、ハマってしまいました。

全般的に何となく動いているのですが、Ti.Media.vibrate()など、オブジェクトに対するメソッドを呼んだ場合、実行時に
illegal invocation
になって、肝心の登録された関数本体が呼ばれなくなっていました。あれこれ原因を探るのに時間を浪費してしまいました。
しかし、
[v8] r13131 committed - Change deprecated semantics of function template signatures....
によれば、新しいV8では、元になるFunctionTemplateのプロトタイプがHiddenでなければならないという仕様になったとのことです。

ということで、この修正を加えて、無事オブジェクトに対するメソッドも完動するようになりました。
これで、外部モジュール以外の部分は、問題なく動作するようになっていると思います。
MIPS以外の端末でも、新しいV8の効果が期待できるので、皆さんお試しください。


ソースコード
https://github.com/isis/v8_titanium/tree/gyp
https://github.com/isis/titanium_mobile/tree/mips
バイナリ(テスト用)
https://www.dropbox.com/s/3gn0qfdjzcwd1ld/mobilesdk-3.2.0-osx.zip


2013/05/19

Titanium SDK をMIPS 対応にする(研究中)

MIPSベースのAndroid端末がかなりの数に上るのに、Titanium Mobileは対応していません。とても残念なので、なんとかしようとトライしています。まだ研究途中ですが、Titanium SDKのビルドまではできる状態になったので、情報を公開しておきます。
(いろいろツール類のインストール作業等を伴いますが、うるさくなるのでそれらの説明は割愛します)


歴史


* Android SDK のMIPS対応は API Level 9以降。
* Googleの公式NDKがMIPS対応したのは r8 (May 2012) 以降。
* V8 (https://code.google.com/p/v8/)がMIPS対応したのは、3.7以降だが、いろいろ問題があったので、V8 for MIPS (paul99 / v8m-rb) というプロジェクトが存在し、現在はこちらのコードが本家に適応されている。 
* V8 のビルドシステムはsconsベースからgypベースに変更されました。
* Titanium SDK の使用しているV8のバージョンは3.9.24.29で、Acceleratorが作ったTitanium Mobile 用のsconsベースのビルドツール (appcelerator / v8_titanium) を使って作成される。


v8_titaniumのビルド


v8 のライブラリの作成ができないことには、何もはじまらないので、まず、これに取りかかります。
問題は、AppceleratorがTi SDKに導入しているV8 v3.9.23.24 は古いので、そのままではMIPS対応できないようだということです。そして、新しいV8 はsconsベースではなくてgypベースのビルドシステムになっているので、v8_titaniumのビルドツールの修正が必要だということです。 しばらく自力でがんばろうとしましたが、世の中よくしたもので、既にgypベースのV8に対応するブランチを作成しているプロジェクトがありました。
     joshthecoder / v8_titanium
のgypブランチを使えば、最新のV8からもビルドできます。このブランチを元にMIPS対応を付け加えたブランチを作成しました。
     isis / v8_titanium
のgypブランチです。 リポジトリ取得後gypブランチをチェックアウトしてください。

V8のサブモジュールは、3.9.23.24を指しているので、最新版(2013/05/18時点で3.19.3)をフェッチしてください。

ビルドには build_v8.shを使います。
./build_v8.sh -j 4 -p android-9 -l all -s on 

とすると、armeabi armeabi-v7a x86 mipsel という4つのアーキテクチャ毎のライブラリが作成されます(ビルド時間はかなりかかります)。
./build_v8.sh -t 

とすると、上記のライブラリと必要な情報ファイルを含むtarballが作成されます。


Titanium SDKの修正


やらなければならないのは
  • MIPSアーキテクチャーの追加
  • 独自ビルドV8 ライブラリの導入
  • V8 のNew APIに対応
です。 
titanium_mobileの scons をたどって、適宜 mips を追加していきます。
Appcelerator の提供する titanium_mobile では、ビルド時に、V8 のライブラリをサーバーから取得し導入するようになっています。まずこの機能を削除して、手動で独自ビルドのV8 ライブラリを導入できるようにしなければなりません。
   <titanium_mobile>/android/build/common.xml

<condition property="libv8.latest">
<equals arg1="${libv8.current.version}" arg2="${libv8.version}"/>
</condition><antcall target="download.libv8"/>
<antcall target="download.libv8"/>

の部分をコメントアウトしておきます。

次にV8 ライブラリを
<titanium_mobile>/dist/android/libv8/

以下に展開します。ライブラリの tarbar を展開すると、必要な配置と違っているので、手動で以下のように配置します。V8のバージョン番号を示すディレクトリを起点にして
<titanium_mobile>/dist/android/libv8/
    3.19.3/
        release/
            libv8.json
            include/
            libs/
               mips/
               x86/
               armeabi-v7a/
               armeabi/

のようになります(gitからフェッチした直後はdistディレクトリ以下は存在しないので自前でディレクトリを作成する必要があります)。
libs以下の各ディレクトリにはアーキテクチャー毎のライブラリを配置します。
新しいV8のライブラリは、旧来1つのlibv8.aとして生成されていたのが、base, snapshot,nonsnapshotと3つのファイルに分かれて生成されるようになりました。Titanium で必要なbaseとsnapushotのライブラリを追加します。baseについては、ファイル名がアーキテクチャ名つきで生成されるので(なぜ?)、面倒なので、リネームします。また、V8生成時にMIPS用はmipsel (MIPSのリトルエンディアン)として生成されますが、titanium_mobileのビルドシステムを修正するのは面倒なので、mipsという名前に修正しておきます。mips/x86/armeabi-v7a/armeabi/ には、それぞれ、少なくとも
libv8_base.a
libv8_snapshot.a

2つのファイルが必要です。
sconsからたどって、libv8のバージョン番号の指定も適宜修正しておく必要があります。
V8のAPIがかわったので、Titanium からV8を呼び出している箇所で、コンパイルエラーがでます。New APIに置き換えてやる必要があります。
一応、ビルドが通る程度には置き換えてありますが、置き換えた正しいか検証はこれからです。
v8::Stringは非推奨になりましたが、現状ままにしてあります(なのでワーニングが大量にでます)。
以上まとめたものは、
isis / titanium_mobile
のmipsブランチに置いてあります。
ところで、出来上がったTitanium SDKを展開してみると、mipsのNDK関連のディレクトリに、
libtiverify
libtiprofiler
が欠けているのがわかります。これらのライブラリはTitanium Mobileのオープンソース部分ではないので、ビルド時に生成されません。このままの状態で出来上がったSDKでMIPSアプリを作成すると、起動時にクラッシュすると思われます。
どうしたものでしょうね ....
現時点では、最新のV8をもとにMIPS対応を含んだTitanium SDKのビルドができるようになった段階です。それを元に作成したアプリを検証等していません。
MIPSに対応しないとしても、新しいV8を利用できるのでJavaScriptの実行は高速になると期待できます(ただし実行コードのサイズも大きくなりいます)。
これを元に多くの方がトライされることを期待します。