web-dev-qa-db-ja.com

Android Antで署名する

Antを使用して、配布用のリリースモードでAndroidアプリケーションをビルドしようとしています。私の問題は署名プロセスにあります。 Androidアプリケーションのエクスポートウィザードを使用して、Eclipse経由でキーストアとエイリアスを作成しました。Eclipse経由でエクスポートすると、アプリは正しく署名されます。 Antを介して同じプロセスを完了しようとすると、build.propertiesファイルでキーストアとエイリアスを参照します。

key.store=C:\\Users\\a512091\\.Android\\release.keystore
key.alias=application
key.store.password=Android
key.alias.password=Android

ビルドプロセスが成功し、Application-release.apkファイルを取得します。このAPKにjarsignerを使用して、すべてのファイルに「sm」タグを付けました。これは出力の末尾です。

jar verified.
Warning:
This jar contains entries whose certificate chain is not validated.

このAPKをエミュレーターまたはデバイスにインストールしようとすると、次のメッセージが表示されます。

Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

Logcatは、CSSファイルと画像アセットの署名の問題を示しています。

11-07 11:06:20.060: WARN/PackageParser(58): Exception reading assets/www/css/base.css in /data/app/vmdl48898.tmp
11-07 11:06:20.060: WARN/PackageParser(58): Java.lang.SecurityException: META-INF/XXXXX.SF has invalid digest for assets/www/res/droidhdpi/favorite_off.png in /data/app/vmdl48898.tmp
11-07 11:06:20.060: WARN/PackageParser(58):     at Java.util.jar.JarVerifier.verifyCertificate(JarVerifier.Java:369)
11-07 11:06:20.060: WARN/PackageParser(58):     at Java.util.jar.JarVerifier.readCertificates(JarVerifier.Java:272)
11-07 11:06:20.060: WARN/PackageParser(58):     at Java.util.jar.JarFile.getInputStream(JarFile.Java:392)
11-07 11:06:20.060: WARN/PackageParser(58):     at Android.content.pm.PackageParser.loadCertificates(PackageParser.Java:337)
11-07 11:06:20.060: WARN/PackageParser(58):     at Android.content.pm.PackageParser.collectCertificates(PackageParser.Java:508)
11-07 11:06:20.060: WARN/PackageParser(58):     at com.Android.server.PackageManagerService.installPackageLI(PackageManagerService.Java:5885)
11-07 11:06:20.060: WARN/PackageParser(58):     at com.Android.server.PackageManagerService.access$2100(PackageManagerService.Java:134)
11-07 11:06:20.060: WARN/PackageParser(58):     at com.Android.server.PackageManagerService$5.run(PackageManagerService.Java:4743)
11-07 11:06:20.060: WARN/PackageParser(58):     at Android.os.Handler.handleCallback(Handler.Java:587)
11-07 11:06:20.060: WARN/PackageParser(58):     at Android.os.Handler.dispatchMessage(Handler.Java:92)
11-07 11:06:20.060: WARN/PackageParser(58):     at Android.os.Looper.loop(Looper.Java:123)
11-07 11:06:20.060: WARN/PackageParser(58):     at Android.os.HandlerThread.run(HandlerThread.Java:60)
11-07 11:06:20.069: ERROR/PackageParser(58): Package com.xxxxx.xxxxx has no certificates at entry assets/www/css/base.css; ignoring!
37
sgimeno

Antバージョンが1.8.3未満の場合(ant -version)JDK 7の問題に対してこのアプローチを試してください(前の回答に基づいて):

  1. Signjarjdk7をAndroid_SDK\tools\ant\build.xmlに追加します

    <macrodef name="signjarjdk7">
        <attribute name="jar" />
        <attribute name="signedjar" />
        <attribute name="keystore" />
        <attribute name="storepass" />
        <attribute name="alias" />
        <attribute name="keypass" />
        <attribute name="verbose" />
        <sequential>
            <exec executable="jarsigner" failonerror="true">
                <!-- Magic key, always verbose -->
                <arg line="-verbose -digestalg SHA1 -sigalg MD5withRSA" />
                <arg line="-keystore @{keystore} -storepass @{storepass} -keypass @{keypass}" />
                <arg line="-signedjar &quot;@{signedjar}&quot;" />
                <arg line="&quot;@{jar}&quot; @{alias}" />
            </exec>
        </sequential>
    </macrodef>
    
  2. 置換'signjar'から'signjarjdk7' in 'release'同じbuild.xml内のターゲット。

注:プロジェクトのプロパティを'key.store.password'および'key.alias.password'を定義する必要があります(project.propertiesまたはlocal.properties) 。

更新1:

Ant 1.8.3(またはそれ以降)をインストールしている場合、より良いソリューションがあります。

Android_SDK\tools\ant\build.xmlを開き、元の 'signjar'呼び出しで2つの新しいパラメーターsigalgとdigestalgを追加します。

<signjar
    sigalg="MD5withRSA"
    digestalg="SHA1"
    jar="${out.packaged.file}"
    signedjar="${out.unaligned.file}"
    keystore="${key.store}"
    storepass="${key.store.password}"
    alias="${key.alias}"
    keypass="${key.alias.password}"
    verbose="${verbose}" />

PDATE 2: Android SDKツール。

49
FeelGood

JDK 7(1.7.0)を使用しているように聞こえるので、jarsignerで署名するときにこれらのオプションを追加してみてください。

-digestalg SHA1 -sigalg MD5withRSA
9
mr-euro

Android開発者向けドキュメント ごとに、これらのプロパティをant.propertiesファイル内に配置する必要があります。

$ cat ant.properties
key.store=C:\\Users\\a512091\\.Android\\release.keystore
key.alias=application
key.store.password=Android
key.alias.password=Android
6
Plinio.Santos

長期的な解決策は、Antのsignjarタスクにパッチを当てることです。

https://issues.Apache.org/bugzilla/show_bug.cgi?id=52344

Ant 1.8.3でsignjarに新しい属性が追加されましたが、Androidのビルドスクリプト(r19時点)は、それらを使用するためにまだ変更されていません。

http://code.google.com/p/Android/issues/detail?id=19567

それまでの間、「presetdef」は回避策を提供する場合があります。

 <presetdef name="signjar">
  <signjar sigalg="MD5withRSA" digestalg="SHA1" />
 </presetdef>
2
Joe Bowbeer

buntu 14.04 (Trusty Tahr)とWindowsを使用して、「。keystore」ファイルを作成します。

このファイルを生成する必要があります。これは、Javaに付属のkeytoolコマンドを使用して実行できます。通常、「C:\ Program Files\Java\jre7\bin」にあります。これもPATH変数に追加する必要があります。

プロジェクトのルートに移動して、次のコマンドを使用します。

.keystoreファイルの生成:

$ keytool -genkey -v -keystore key-name.keystore -alias alias-name -keyalg RSA -keysize 2048 -validity 10000

フォルダー「platforms/Android /」ant.propertiesにant.propertiesというファイルを作成します。

key.store=D:\\path\\to\\the\\project\\keyname.keystore
key.alias=alias-name

ビルドAPKファイルを作成します。

$ cordova build Android --release
1
Conor

(私のように)1.8.3よりも古いバージョンのAntで立ち往生している場合、Java 7、回避策は次のとおりです。

<exec executable="${Java.bin.path}/jarsigner">
  <arg value="-signedjar"/>
  <arg value="signed-${app.apk.name}"/>
  <arg value="-keystore"/>
  <arg value="my.keystore"/>
  <arg value="-storepass"/>
  <arg value="passwd"/>
  <arg value="-sigalg"/>
  <arg value="MD5withRSA"/>
  <arg value="-digestalg"/>
  <arg value="SHA1"/>
  <arg value="${app.apk.name}"/>
  <arg value="my_keystore"/>
</exec>

<!-- Where old version was: -->

<signjar
  alias="my_keystore" keystore="my.keystore"
  storepass="passwd"
  preservelastmodified="true"
  signedjar="signed-${app.apk.name}">
  <path>
  <fileset dir="." includes="${app.apk.name}" />
  </path>
</signjar>
0
hemisphire