HeavyBommer@blog
時事ネタ、コンピュータ、家電、プログラミング等々、思ったこと/考えたこと/提案/使用レポ/Tipsなどを思いついたときに書いてゆきます
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
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にコンバートしているので、中途半端に処理を削ったための所為でした。

<おまけ>


DoJaの場合、JAMの設定項目(アプリ名とかバージョンとか)を取得できないという欠点があります。
#MIDPではgetAppPropertyでJAD項目はすべて取れます


ですので、JADファイルを解析してdefine定義するツールを作りました。
現在は以前のbuild.makを修正してこいつも組み込んでいます。
ファイルをアップするのは面倒なので、perlソースをコメントで貼り付けておきます。


スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

コメント
この記事へのコメント
おまけのコード
#!/usr/bin/perl

if(@ARGV < 2)
{
print STDERR "usage : $0 JAMfile INCfile\n";
exit 1;
}

$in = shift;
$inc = shift;


open(IN,"$in") || die "Can't open InputFile <$in>";
@in = <IN>;
close(IN);

open(OUT,">$inc") || die "Can't open OutputFile <$inc>";
print OUT "// JAM項目のデファイン定義(自動更新)\r\n";
print OUT "#ifndef JAM_ITEM_DEFINE_SW\r\n";
print OUT "#define JAM_ITEM_DEFINE_SW\r\n";
foreach $line (@in)
{
$buf = "";
$line =~ s/[\r\n \t]+$//;
($item,$val) = split(/[ \t]+=[ \t]+/,$line);
if("$item" ne "")
{
$item =~ tr/[a-z]/[A-Z]/;
$item = "JAM_$item";
$val = "\"$val\"";
$buf = "#define $item $val";
}
print OUT "//$line\r\n";
print OUT "$buf\r\n";
}

print OUT "#endif\r\n";
close(OUT);
2007/03/28(水) 18:16:22 | URL | B-51(管理人) #NSULs8mg[ 編集]
やはりインデントは…
インデントはやっぱり消えちゃいますね。
この辺fc2ブログはちょっと使いにくいですね…

まあ、インデント無くても動作には問題ないですが、ご自分で弄りたいかたはインデントを適宜調整してください。
2007/03/28(水) 18:19:22 | URL | B-51(管理人) #NSULs8mg[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。