2016/07/11

[android]Log.d()の文字列結合をStringBuilderにしたが、やはり残る

Android Lintはすぐ終わったので、Find Bugsに掛けることにした。
そうすると、ログ出力で文字列を足し算しているところに警告が出た。
StringBuilderとかがいいね、みたいなことを言っている。

うん、わかっているのだけど、ログ出すだけやん、とも思うのだ。
それに、最終的には出力されないし。

 

hiro99ma blog: [android]ProGuardでLog.d()がStringBuilderで残る
そういえば、ProGuardに掛けても文字列生成するところが残ってしまったのだが、もしかして最初からStringBuilder形式で書いておくと消してくれるのでは?

 

・・・ダメだった。
StringBuilderをnewして、append()して、最後にStringでnew(sb)したけど、全部残る。
しかも、以前は最適化してくれたせいかStringの足し算もStringBuilderに変換され、最後にStringに戻す部分がLod.d()がなくなることで不要になったのだけど、書き換えると明示的にStringBuilderからStringに変換する部分が残ってしまい、かえってコードが増えてしまっている。

 

だいたい、代入する人がいないのにnew StringBuilder()するところなんか、うまいこと消せないものなのだろうか。
C++だとできそうだけど、Javaはそういう書き方をすることが多いから無理か。。

 

とりあえず、こうしておこう。

  • Log.d()程度の文字列操作で、ProGuardでログ自体削除するなら、文字列は足し算で結合させた方が最終的に小さくなりやすい
    • StringBuilderからStringに変換する実装を明示的に書くと、それが残ってしまう
  • 自作で、結合させたい文字列を引数に取るログ出力メソッドを作って、文字列の結合処理をメソッドの中に押し込め、ProGuardで抑止させれば消えるのかもしれん。
    • Cなんかだとときどきある、DEBUG_LOG1(p1), DEBUG_LOG2(p1,p2)みたいに引数ごとにメソッドを作るとか

 

うーん、Javaにもプリプロセッサ、プリーズ!!
まあ、あったらあったでやっかいなのだけどね。。。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。