Android与Ant签约

sgi*_*eno 37 ant android

使用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
Run Code Online (Sandbox Code Playgroud)

构建过程成功,我得到一个Application-release.apk文件.我用jarsigner使这个APK变得非常漂亮,所有文件都有"sm"标签.这是输出的尾部:

jar verified.
Warning:
This jar contains entries whose certificate chain is not validated.
Run Code Online (Sandbox Code Playgroud)

当我尝试将此APK安装到模拟器或设备中时,我得到以下内容:

Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
Run Code Online (Sandbox Code Playgroud)

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!
Run Code Online (Sandbox Code Playgroud)

Fee*_*ood 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>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更换'signjar''signjarjdk7''release'在同一个build.xml文件的目标.

注意:您必须为项目定义'key.store.password''key.alias.password'propeties(在project.properties或local.properties中).

更新1:

如果您已经安装了Ant 1.8.3(或更高版本),那么您有一个更好的解决方案:

打开你的ANDROID_SDK\tools\ant\build.xml并在原来的'signjar'调用中添加两个新参数 - 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}" />
Run Code Online (Sandbox Code Playgroud)

更新2: 在最新版本的Android SDK工具中将'signjar'替换为'signapk'之后,似乎已弃用此答案.


mr-*_*uro 9

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

-digestalg SHA1 -sigalg MD5withRSA
Run Code Online (Sandbox Code Playgroud)


Pli*_*tos 6

根据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
Run Code Online (Sandbox Code Playgroud)