【お題】王手、そして

質問お願いします

APKファイルにkeytoolで作成した署名をつけるためにjarsignerの実行をしたら

キーストアのパスワードを入力してください:
追加中: META-INF/TECHKEY.SF
追加中: META-INF/TECHKEY.RSA
署名中: res/layout/main.xml
署名中: AndroidManifest.xml
署名中: resources.arsc
署名中: res/drawable-hdpi/icon.png
署名中: classes.dex

と表示されています


jarsigner -verify -verbose -certs アプリ名.apk

で署名確認すると「ファイルが見つかりません」と出ています

これでは正常に署名されていないという事でしょうか?

APKファイルに署名をつけzipalign実行をしたいのですが
zipalign実行するとなぜか署名がついていないファイルになってしまいます

お分かりになる方、どうかご教授下さい
よろしくお願い申し上げます

A 回答 (5件)

>一体どうしてこのようになってしまうのでしょうか?



原因はANo.2に書いてあります。
>>それは"アプリ名.apk"に署名をつけた後にmain.xmlの内容を変更した場合に発生するエラーです。署名をつけた後にファイルの内容を変更してはいけません。

"jar tvf APKファイル名" を実行して、APKファイルの内容を表示してみてください。推測通りなら、META-INF/TECHKEY.SFよりもres/layout/main.xmlのタイムスタンプのほうが新しいと思います。

解決するには下記の手順でやり直してください。
[A] 今使っているAPKファイルは削除して、署名する前のAPKファイルを用意する
[B] APKファイルにjarsignerで署名する
[C] 署名後のAPKファイルをjarsignerで検証する

[B]以降にAPKの内容を変更してはいけません (ただし、zipalignは署名の検証に影響がないみたいです)。

この回答への補足

salsberry様

お忙しい中何度も回答頂き本当にありがとうございます
質問を投稿してもなかなか回答いただけない事がある中で
回答をいただけるというだけですごく嬉しい気持ちになります

APKの内容を変えるというのは一切行なってないのですが
どうしてこの表示が出ちゃうんでしょうか…

アドバイス頂いたように一旦APKファイルを削除して新しいファイルに
署名をしなおすという作業は何回も行ないました

アプリ名の変更は「.apk」の拡張子さえ変えなければ大丈夫と最初は
名前の変更を行なったりしたのですがそれさえもだめなのかもと
購入先からダウンロードしたアプリ名そのままで試したりしても
ダメでした

当方のような初心者がアプリの内容を変更するような事はできないです…
zipalign実行前に検証しても署名は検証できませんでした

jar tvf APKファイル名" を実行いたしましたところ

META-INF/TECHKEY.SFは

674 MON JUN 24 18:49:48

res/layout/main.xmlは

476 Sat JUN 01 10:24:18

になっていました

res/layout/main.xmlの方が古いものと思うのですが
違うのでしょうか?

何度も何度も本当にすみません
何卒ご教授下さい

よろしくお願い申し上げます

補足日時:2013/07/01 08:52
    • good
    • 0

>zipalign実行前に検証しても署名は検証できませんでした



残念ながら私はお手上げです。正常に署名できた直後に署名の検証が失敗する原因が思いつきません。
    • good
    • 0
この回答へのお礼

きゃ~!そうですか…

何度もご指導頂き本当にありがとうございました

おかげさまで色々と勉強になりました
また解決策が見つかりましたらご教授下さい

本当に本当にありがとうございました

お礼日時:2013/07/03 08:58

そもそも、署名をつけるためにjarsignerを実行したときは正しくファイルを指定できている(らしい)のですから、それと同じようにやれば署名の検証のときに「ファイルが見つかりません」が出るはずはないのです。

つまり、署名をつけるときと検証するときとで違うやり方で対象ファイルを指定しているということです。

>カレントディレクトリにファイルが存在しないということは
>jarsigner.exeがあるフォルダにapkファイルをおけばうまくいくのでしょうか?

「カレントディレクトリ」と「jarsigner.exeがあるフォルダ」は同じものではありません。
下の[A][B]のどちらかにするのが普通でしょう。
[A] apkファイルのあるディレクトリをカレントディレクトリにする (CDコマンド)。jarsignerやzipalignでファイル名指定時にディレクトリ名をつける必要がなくなる。
[B] カレントディレクトリは無視して、jarsignerやzipalignでは常にファイル名にディレクトリ名をつける。

> 署名後はファイル名を変えるものなのでしょうか?

区別しやすいように-signedjarオプションで出力ファイル名を指定しただけです。好きにしてください。

この回答への補足

salsberry様
お忙しい中回答いただき本当にありがとうございます

仕事でなかなか作業が進まずお礼も遅れまして誠に申し訳ございません

「カレントディレクトリ」を私なりに調べてみましてAPKファイルや証明書を
そこに置きましたところ正しく設定できているのかどうかわかりませんが
jarsigner実行時にディレクトリ名を入れなくても

「ファイルが見つかりません」

とは表示されなくなりました

しかしやはり

jarsigner:java.lang.SecurityException: invalid SHA1 signature file digest for n ・・・es/layout/main.xml

が表示されてしまいます

ディレクトリを指定してもしなくても同じです

一体どうしてこのようになってしまうのでしょうか?

検索でいろいろなサイトを見させていただいてもみなさん

jarsigner -verify -verbose -certs

で正常に検証されています

しまいにはXPの古いPCを使っていたのでJAVAが古いのかとか、ど素人丸出しの考えで
子供のwin7のPCを借りて作業をしたりしてみたのですがやはりだめでした(当たり前?)

もうどうしていいかわからず泣きそうです


原因はどこにあるのでしょうか?

おわかりになりましたらご指導お願いいたします

お忙しい中何度もお手間をおかけして申し訳ございませんが
なにとぞよろしくお願い申し上げます

補足日時:2013/06/30 17:17
    • good
    • 0

>ファイルが存在するのに「ファイルが見つかりません」と出るのはなぜでしょうか?



カレントディレクトリって知っていますか?
jarsignerに与えるファイル名にディレクトリ名をつけたら「ファイルが見つかりません」とは出なくなったということは、「ファイルが見つかりません」と出ていたときにはファイル名にディレクトリを指定していなかったのですよね。ディレクトリの指定をしなければ、カレントディレクトリにあるファイルをアクセスしようとします。
つまり、カレントディレクトリに"アプリ名.apk"という名前のファイルが存在していなかったということです。

>jarsigner:java.lang.SecurityException: invalid SHA1 signature file digest for n ・・・es/layout/main.xml
>
>のように文面が表示されてしまいます

それは"アプリ名.apk"に署名をつけた後にmain.xmlの内容を変更した場合に発生するエラーです。署名をつけた後にファイルの内容を変更してはいけません。

この回答への補足

何度も回答いただき本当に本当にありがとうございます!

カレントディレクトリにファイルが存在しないということは
jarsigner.exeがあるフォルダにapkファイルをおけばうまくいくのでしょうか?

恥ずかしながら「カレントディレクトリ」というものも知らず
検索で調べてみると作業中のディレクトリの事とありました

そんなことも知らずに大それた事をしようとして非常に恥ずかしい思いです
まさかGooglePlayにアプリを登録するのにこんなに色々な作業をしなければ
ならないと知らなかったのです…

あと、salsberry様が先ほど回答してくださった中で
署名後の


- testA.jarに署名したもの → testA1.jar

でtestAからtestA1にファイル名が変わっていますが署名後はファイル名を
変えるものなのでしょうか?

jarsigner -verbose -keystore c:\ディレクトリ\証明書名.keystore c:\ディレクトリ\アプリ名.apk 証明書別名

で署名をつけていたのですがこの方法ではファイル名は署名前と変わらない状態でした

この時点でも間違っていたのでしょうか?

お忙しい中何度もご面倒をおかけして申し訳ございません

ご教授のほどなにとぞよろしくお願い申し上げます

補足日時:2013/06/23 22:39
    • good
    • 0

>「ファイルが見つかりません」と出ています



それは"アプリ名.apk"という名前のファイルが存在していないからでは?

>APKファイルに署名をつけzipalign実行をしたいのですが
>zipalign実行するとなぜか署名がついていないファイルになってしまいます

Android用のファイルではありませんが、試したところではそんなことないです。
- testA.jarに署名したもの → testA1.jar
- testA1.jarにzipalignしたもの → testA2.jar

$ jarsigner -verbose -keystore keystore.dat -storepass password1 -keypass password2 -signedjar testA1.jar testA.jar foo
更新中: META-INF/MANIFEST.MF
追加中: META-INF/FOO.SF
追加中: META-INF/FOO.DSA
署名中: TestA.class
署名中: TestB.class

$ zipalign -v 4 testA1.jar testA2.jar
Verifying alignment of testA2.jar (4)...
50 META-INF/MANIFEST.MF (OK - compressed)
295 META-INF/FOO.SF (OK - compressed)
646 META-INF/FOO.DSA (OK - compressed)
1473 META-INF/ (OK - compressed)
1534 TestA.class (OK - compressed)
1879 TestB.class (OK - compressed)
Verification succesful

$ jarsigner -verify -verbose -certs testA2.jar
[略]
jarが検証されました。

↑ zipalignの後のファイルでも署名は検証できる

この回答への補足

回答ありがとうございます

ファイルはPC内に存在しています

試しに"アプリ名.apk"がある場所を指定するためにc:\ディレクトリ名をつけてみたら


jarsigner:java.lang.SecurityException: invalid SHA1 signature file digest for n ・・・es/layout/main.xml

のように文面が表示されてしまいます
(…は画面の端が切れて表示されていません)


正しく作業できていれば通常はzipalignの後のファイルでも署名は検証できるんですね…

ファイルが存在するのに「ファイルが見つかりません」と出るのはなぜでしょうか?


無知なものですみません
ご教授の程何卒よろしくお願い致します

補足日時:2013/06/23 12:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報