2011/12/10

二重署名できるときとできないときの差がわからん

EjectSDというAndroidアプリをマーケットに置いている。
このアプリは、アップするときに二重署名になっている。
二重署名、というのは、すでに署名済みのjarファイルに、別の署名をしたものだ。

Androidでよくある質問に「apkファイルに署名すると『java.util.zip.ZipException: invalid entry compressed size』が出てくる」というものがある。
この回答として一番多いのは「apkファイルが署名済みだからです」というものだ。
しかしよく考えてみよう。
ここでエラーを出しているのはjava.util.zipで、圧縮サイズがうんぬん、という内容だ。
署名がすでにあるからエラーを出しているというわけではない。
結果として同じことなのかもしれないが、気になるではないか。
というのも、二重署名できるということは、署名済みであってもさらに署名ができるということだからだ。
エラーが出る場合と、出ない場合がある。
今のEjectSDは、そんな状況に追い込まれているのだ。
署名が違うと、マーケットにアップするのが大変。
新規のアプリにしないといかんのだ。

まずはこちらのサイト。
http://d.hatena.ne.jp/skirnir/20090220/1235143925
.NETの話ではあるが、エラーの原因はそういうことなのだ。
jarファイルはzipと同じ構造なので、同じことだろう。

こちらは、おそらくExceptionを出す箇所のソースファイル。
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/Collections-Jar-Zip-Logging-regex/java/util/zip/ZipOutputStream.java.htm
真ん中くらいに「invalid entry compressed size」の文字がある。

ああだこうだ考えたが、結局のところjarファイルのヘッダ情報が正しくない、ということだろう。
なら、作り直せばいいじゃないの、ということで、jar xfしてjar cfした。
そしたら、二重証明できるようになった。
ふーん。

2 件のコメント:

  1. 参考にさせていただいております。
    一点質問させてください。

    >なら、作り直せばいいじゃないの、ということで、jar xfしてjar cfした。
    >そしたら、二重証明できるようになった。
    こちら、できたapkは2つの証明書で署名されたものでしょうか?
    それとも後から署名したもののみで署名されたものでしょうか?

    当方も試してみましたが、後から署名したもののみが適用されます。
    ご回答いただければ幸いです。

    よろしくお願い致します。

    返信削除
    返信
    1. すみません、こちらはもう記憶に残っておらず。。。
      (そしてAndroidのことも長いことやっていません。。。)

      その1年後くらいに、こういう記事を書いていました。
      http://hiro99ma.blogspot.jp/2012/09/apk.html
      参考にならないでしょうか

      もう4年くらい前のことなので、当時はできたけど今はできなくなった、という事もあるかもしれません。

      削除

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

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