Android与Ant签约

时间:2011-11-07 12:21:40

标签: android ant

使用Ant,我尝试在发布模式下构建Android应用程序以进行分发。我的问题出在签署过程中。我使用Export Android Application向导通过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文件。我用jarsigner改进了这个APK,所有文件都有" 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!

6 个答案:

答案 0 :(得分:49)

如果你有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'替换为同一build.xml中'signjarjdk7'目标中的'release'

  3. 注意:您必须定义&#39; key.store.password&#39; &#39; key.alias.password&#39; propeties for您的项目(在project.properties或local.properties中)。

    更新1:

    如果您已安装Ant 1.8.3(或更高版本),则可以获得更好的解决方案:

    打开您的ANDROID_SDK \ tools \ ant \ build.xml,并在原始&#39; signjar&#39;中添加两个新参数 - 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}" />
    

    更新2: 似乎这个答案在“签名”后被弃用了。被替换为&#39; signapk&#39;在最新版本的Android SDK工具中。

答案 1 :(得分:9)

听起来你可能正在使用JDK 7(1.7.0),所以在使用jarsigner签名时尝试添加这些选项:

-digestalg SHA1 -sigalg MD5withRSA

答案 2 :(得分:6)

Android developer documentation,您应该将这些属性放在ant.properties文件中:

$ cat ant.properties
key.store=C:\\Users\\a512091\\.android\\release.keystore
key.alias=application
key.store.password=android
key.alias.password=android

答案 3 :(得分:2)

长期解决方案是修补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>

答案 4 :(得分:1)

使用Ubuntu 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

答案 5 :(得分:0)

如果您(如我所知)使用的是早于1.8.3和Java 7的Ant版本,这里有一个解决方法:

<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>