zoukankan      html  css  js  c++  java
  • JDK1.7签名APK异常

    转:http://blog.csdn.net/sgz_china/article/details/8060315

    1.这两天搞ant打apk的,到签名apk的时候发现明明签名成功,但是安装时死活提示无数字证书。
    同事的机器上签名后可以正常安装,但是在我机器上却不行,最后发现同事JDK版本1.6的,我是1.7的。

    最后在网上查了资料解决的办法,在我们签名的时候,在jarsigner命令后增加两个参数:

         -digestalg SHA1
         -sigalg MD5withRSA


    使用Ant如下:

    [html] view plaincopy
     
    1. <target name="jarsigner" depends="package" >  
    2.     <exec executable="${jarsigner}" failonerror="true" >  
    3.         <arg value="-verbose" />  
    4.         <arg value="-digestalg" />  
    5.         <arg value="SHA1" />  
    6.         <arg value="-sigalg" />  
    7.         <arg value="MD5withRSA" />  
    8.         <arg value="-keystore" />  
    9.         <arg value="${key.store}" />  
    10.         <arg value="-storepass" />  
    11.         <arg value="${key.store.password}" />  
    12.         <arg value="-keypass" />  
    13.         <arg value="${key.alias.password}" />  
    14.         <arg value="-signedjar" />  
    15.         <arg value="${out-signed-package-ospath}" />  
    16.         <arg value="${out-unsigned-package-ospath}" />  
    17.         <arg value="${key.alias}" />  
    18.     </exec>  
    19. </target>  

    2. 后在打包的时候发现在打手动编译的的class后,打dex文件后会发现这个dex里少一些class文件,百思不得其解,

    eclipse自动编译的打包正常,为什么执行自己的compile就打不进去了呢?而且还进行过多方对比未发现异常。

    后同事打印日志并注意到日志中有很多“ bad class file magic (cafebabe) or version (0033.0000)”的提示。后来在网上

    看到有同行也碰到如此问题,是jdk版本原因,jdk1.7编译后会出现,如果你碰到这种情况的话换成jdk1.6就ok了。


    3. 另外,注意:

    我用Ant打apk的,打完后运行时会因为NotFoundClassException,跟踪后发现打包路径直接写成文件夹不行。如下:

    把<arg value="${outdir-classes-ospath}" />改为<arg value="${outdir-classes-ospath}/*" />,否则可能会在打dex包的时候class文件并没有真正的打进去。

    [html] view plaincopy
     
      1. <!-- 将.class文件转化成.dex文件 -->  
      2. <target name="dex" depends="proguard">  
      3.     <echo>Converting compiled files and external libraries into a .dex file...</echo>  
      4.     <exec executable="${dx}" failonerror="true">  
      5.         <arg value="--dex" />  
      6.         <arg value="--verbose" />  
      7.         <!-- 输出文件 -->  
      8.         <arg value="--output=${dex-ospath}" />  
      9.         <!-- 要生成.dex文件的源classes和libraries -->  
      10.         <arg value="${outdir-classes-ospath}/*" /><!-- 注:${outdir-classes-ospath}"则运行时会抛NotFoundClassException,疑似目录下的class打不进dex -->  
      11.         <arg value="${external-lib-ospath}" />  
      12.     </exec>  
      13. </target>  

    对于JDK 1.7,keytool生成的keystore默认签名算法是SHA256,Android早期版本不支持,所以

    一种办法是创建keystore的时候用该默认算法:
    keytool -genkeypair时加入以下参数
    -sigalg SHA1withDSA -keyalg DSA -keysize 1024

    如果keystore已经在项目中确定,不能随意更改,那么就只能在jarsigner调用的时候按最上方的做法,加入以下参数:
    -sigalg SHA1withDSA -digestalg SHA1

  • 相关阅读:
    关于Tomcat版本的使用
    Twitter
    Thinkpad在Windows8上热键的解决方案
    关于C#中程序当前目录的小随笔
    【Network】OSPF排错及其七种状态机
    如何修改已有的ONNX模型
    安全计算环境(三)Windows服务器4
    安全计算环境(三)Linux服务器5
    安全计算环境(三)Linux服务器2
    安全计算环境(二)防火墙2
  • 原文地址:https://www.cnblogs.com/xhqgogogo/p/3699419.html
Copyright © 2011-2022 走看看