2013/03/29

[android]Mozcはビルドできたが、うちでは動かなかった

Mozcをビルドした。
ビルドしたら、インストールして動かしたくなるではないか。

ビルドしたapkはunsignedなので、符号無し・・・ではなく署名されてない。
jarsignerはどうやって使うんだったっけ、とAndroid Developerを参照した。

$ jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

こんなに長かったっけ?
と思いつつも、昔作ったkeystoreファイルを指定すると怒られた。
signature algorithmが違う、と。

keytoolで確認できるようなので、見てみた。
すると「SHA1withDSA」というやつになっていた。

うーん、あまり記憶は無いが、確か当時はサイトを見ながらkeystoreファイルを作ったはず。。。
ということは、時代が新しくなったので、アルゴリズムも新しくなったということか。


keystoreファイルを作り直すのはやめて、SHA1withDSAにするとうまくいった。
Nexus7へも、adb installでうまくいった。
設定アプリの「言語と入力」にも「Mozc for Android」が出てくるし、選択できる。

が・・・設定ができない・・・。
logcatで見ると、SIGBUSってなってるから、Bus Errorが起きているようだ。
libmozc.soらしい。
「RUN EMOJI PROVIDER DETECTION: null」というところかね。
これはandroid/inputmethod/japanese/emoji/EmojiProviderType.javaが出しているようだ。

では、Google Playにある方もだめなのかと思ってインストールしてみたが、こっちは問題ないようだ。
EMOJIのログもINFOだから致命的ではないのだろう。

ならば「Ignoring setInputMethod of uid 10111 token: null」の方が問題なのかもしれん。
バスエラーだからNULL参照とかそんなとこだと思うが、Javaだったらthrowするだろうから、原因はNDKの部分か。

む、BUS_ADRALNとある。
アラインメント不正か。アドレスが奇数になってるな・・・。
Thumb命令のベクタアドレスは奇数にするとかいう決まりがあったような気がするが、そういうのじゃないんだろうな。
addr2lineとかで追うしかないのか。。。

backtraceに出てくる最後は、これだった。

#00  pc 000cbab6  /data/app-lib/org.mozc.android.inputmethod.japanese-1/libmozc.so

では、これをaddr2lineしてみる。

[android/obj/local/armeabi]$ addr2line -e libmozc.so 0x000cbab6
/mnt/android/mozc/mozc/src/./storage/louds/simple_succinct_bit_vector_index.cc:47

ふむ。
ソースを見ておこう。

// TODO(hidehiko): Support XMM and 64-bits popcount for 64bits architectures.
inline int BitCount1(uint32 x) {
  return __builtin_popcount(x);
}

__builtin_popcount()はgccの組み込み関数で、ビットが立ってる数を求めてくれるらしい。
組み込み関数だからまずいのか?と思って、そうじゃない方の関数を呼ばせるようにしてみた。
が、これはこれでやはりだめだった。

 

報告は、こういう状況。

signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 69bcd243

バックトレースは、こう。

backtrace:
    #00  pc 000cbaf6  /data/app-lib/org.mozc.android.inputmethod.japanese-1/libmozc.so
    #01  pc 000cb4cb  /data/app-lib/org.mozc.android.inputmethod.japanese-1/libmozc.so
    #02  pc 000b504d  /data/app-lib/org.mozc.android.inputmethod.japanese-1/libmozc.so
    #03  pc 000b528d  /data/app-lib/org.mozc.android.inputmethod.japanese-1/libmozc.so

スタックトレースは、こう。

stack:
         69915940  00000000 
         69915944  63097b64 
         69915948  00000000 
         6991594c  6a90ba43  /data/app-lib/org.mozc.android.inputmethod.japanese-1/libmozc.so
         69915950  00000d88 
         69915954  0000ead8 
         69915958  59ae3b20 
         6991595c  63097b64 
         69915960  0003ab44 
         69915964  63117818 
         69915968  69bcd243  /data/app/org.mozc.android.inputmethod.japanese-1.apk
         6991596c  00075688 
         69915970  0003ab44 
         69915974  63117818 
         69915978  df0027ad 
         6991597c  00000000 
    #00  69915980  699159b4 
         69915984  6a91a053  /data/app-lib/org.mozc.android.inputmethod.japanese-1/libmozc.so

もっとログは出ているのだが、紙面の都合で省略した。

不正アドレスになっているのはわかるけど、それはapkが元になっていることになってる。
soファイルならaddr2lineすればいいけど、apkはどうしたらいいんだろうね?

0 件のコメント:

コメントを投稿

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

注: コメントを投稿できるのは、このブログのメンバーだけです。