proguardを使って難読化

ちょっとハマったのでメモ代わりに。

ファイルの指定

project.propertiesに以下の一行を付け加えましょう。検索で引っかかるのproguard.cfgが多いけど、最新だとproguard-project.txtって名前になっているのでこっちを指定してあげないといけない。

proguard.config=proguard-project.txt

除外ファイルの設定

ライブラリとかほかから持ってきたものに関しては基本難読化しないほうがいいので、難読化から外す。以下の様な記載方法

-keep class com.google.gson.** { *; }

GSONを使っている場合

ここが一番ハマったんだけど、GSONを使っている場合は解析用のClassも難読化から外さないとうまく動かない。難読化は中身ごと外さないといけないんで、以下の様な記述が必要。一つづつ指定するのが面倒なのでpackageで一括でやったほうが楽。

# 解析が必要なモデルが含まれているpackageを指定 -keep class jp.exsamples.model.** { *; }

まとめ

modelを難読化したらダメってのはなんとなくわかったんだけど、「-keep class jp.exsamples.model.**」だとファイル名だけしか難読化しなようにならないってのがすごいハマった。動くようにはなったけど記載方法が間違っているような気もする。。。

Androidの一部端末でTextAreaにline-heightを指定すると選択位置がずれる

一部端末というより今の状態だと現象が起こる端末の方が多そう。現象を詳細に書くと「テキストエリアに長文を入力して、入力した文章の途中を変更しようと変更箇所をタップしてもタップした位置が選択されない」というもの。

なぜそうなるのか?

一部端末のAndroidの標準ブラウザではtextarea:focusに対するline-heightが効かないが、textareaに対してはline-heightが効くので、フォーカス時と非フォーカス時で見た目の高さが変わってしまう。変更したい箇所をタップしてカーソルを移動した場合、非フォーカス時のline-heightで位置が計算されるようで、表示はフォーカス時のもの、選択した位置は非フォーカス時のものとなってしまいカーソルがずれてしまうというのが本現象を引き起こしている模様。

対処法

今のところ対処法は無い。textarea:focusでもCSSが効く端末と効かない端末を判別出来れば色々できるだろうけど、端末名をUserAgentから引っ張りだしてやるにはケアレスミスが多すぎるのでtextareaにCSSを指定しない or CSS効かなくても問題がないデザインにするしか無いと思う。

まとめ

AndroidのChromeは大丈夫なのに標準ブラウザは解釈できないってなんだよー。iPhoneはできるみたいだからもうちょっと頑張って欲しい。

ADTでlibsフォルダ配下においたファイルが認識されない

ちょっとハマったのでメモ。

libsフォルダ配下に入れると、[Property] -> [Java Build Path] -> [Android Private Library]に入る。ソース上は認識してるからこれで大丈夫だと思ったらjava.lang.NoClassDefFoundErrorで落ちる。こういった場合は[Property] -> [Java Build Path] -> [Order and Export]を確認してみましょう。ここで、[Android Private Library]のチェックが外れれている場合があり、これにチェックが入っていないとダメみたい。

なんかADT17からこういうことが起こるらしい。前のADTのVersionで作成したProjectの場合はlibsフォルダがlibフォルダになっていることがあるので、この場合はlibからlibsに名前を変えた後にCleanしてJava Build Pathを確認してみるとよいそうです。

参考:http://android.foxykeep.com/dev/how-to-fix-the-classdefnotfounderror-with-adt-17