HeavyBommer@blog
時事ネタ、コンピュータ、家電、プログラミング等々、思ったこと/考えたこと/提案/使用レポ/Tipsなどを思いついたときに書いてゆきます
CHtmlViewによるIEコアブラウザの作成
Windows(IE4以上を入れているかWin98/Win2K以降のOS)では、IEコアを使って簡単にオリジナルWebブラウザが作れます。
フリーのタブブラウザなども、多くのものはこの機能を利用しています。

さらに、VC++でMFCを使うなら、サンプルのmfcieってのを流用すればさらに簡単です。

でも、このIEコンポーネントが結構曲者で、ちょっと込み入ったことをやろうとするとすぐ壁にぶち当たります。
今回は、とあるアプリのブラウザ部分のエミュレートの為に、オリジナルのリクエストヘッダを付与するような仕組みを入れ込んだミニブラウザを作ったのですが、結構いろいろ壁がありました…
備忘録を兼ねて、それらについてメモっておきます。
ProGuard後のPreverifyエラー

前にJ2ME環境での難読化/最適化の話を書きましたが、今回変なエラーに遭遇しました。
もちろん、元のソースはエラーにならずきちんとjarの作成まで出来ています。
エラーが起きるのは、ProGuradをで難読化/最適化した後のファイルをPreVerifyするときです。
エラーの内容は


Inconsistent stack height 1 != 0

こんな感じです。
一応クラス名やメソッド名は出ていますが、ProGuardがかかってしまっているので、マップファイルを見てクラス/メソッドを特定しましたが、一件とくに問題はなさそうでした。
で、部分的にコメントアウトしつつ検証してみると、最適化によって中途半端にコードが削られるのが原因のようでした。
例えば
int a = 0;
if((a > 0) && (str.length() > 0))
のような感じで、けして中に入らない条件分岐に論理積(&&)で別の条件をくっつけたりすると、このエラーが起きる可能性が出てくるようです。


 ただ、必ず起きるわけではなく、javacのバージョンによっても変わってくるようです。
私の場合、1.4.2では上記エラーが出ましたが、1.5.0では出ませんでした。
とりあえず、このようなエラーが出た時は、マップファイルを見るとか、ProGuardの-keepオプションで問題のクラスのメソッドを難読化しないようにするとかして原因となるメソッドを特定し、このようなけして通らない処理が無いかどうか調べてみるのが良いと思います。


 ちなみに、なぜこのような処理があったかと言うと、MIDP用のプログラムをDoJaにコンバートしているので、中途半端に処理を削ったための所為でした。

J2ME(DoJa/MIDP)の開発環境
J2ME(携帯電話向けJAVA)では、アプリのサイズを小さくすることが求められます。
最近の海外端末や、DoCoMoでも903i以降の機種はかなり大きなアプリでも大丈夫ですが、それでも数MBなので、リッチコンテンツを搭載しようと思うと極力容量は削りたいところです。
また、JAVAのクラスファイルは容易にリバースエンジニアリング出来てしまいますが、DRMなどに対応させるのは結構面倒&対応機種も限られてきます。

そこで、登場するのが難読化&最適化ツールです。
これは、クラス名やメソッド名なんかを短い名前に付け替えたりして、(リバースエンジニアリングされても)読みにくく、かつクラスファイルの縮小もしてくれるという物です。

今回は、備忘録をかねて、有名どころのProGuardをDoJaやMIDP端末向けに利用する方法を紹介します。

あと、携帯向けだとJAVAの理念はすっかり鳴りを潜めてしまい、メーカや機種による差異がかなり大きいです。
そうなると欲しくなるのがプリプロセッサなのですが、Sunは頑なにプリプロセッサの導入を拒否してくれちゃっています。
なので、今回はCのプリプロセッサも使えるようにする工夫も入れてあります。(ただし、デバッグ文の削除とか機種による動作の違いを吸収するとかいった程度を想定しています)