开发者社区> 科技小先锋> 正文

Ant和JDK7构建Android应用

简介:
+关注继续查看

 上半年用Android写了个小应用,使用Ant构建,一直都跑得非常顺利。突然有一天,生成的APK不能安装了!在用豌豆夹安装生成的APK时报了个错:

  安装失败:该应用签名有问题,无法安装,您可以尝试用豌豆荚手机精灵完整版进行重试。

  一开始,我以为是Debug版本和正式的keystore冲突造成的,结果即使把已安装的应用删了之后再安装,仍然报错……偶的神啊,我到底干了啥?

  回想良久,貌似我只更新了JDK而已,安装了JDK7。于是重设JAVA_HOME和PATH,使之指向JDK6,再重新用Ant构建——APK安装成功。

  事实证明了Ant+JDK7构建的APK不能安装,这引起了我的好奇心。我决定研究一下为什么不能。考虑到提示“签名有问题”,所以我将两个APK用压缩软件打开,比较了一下META-INF中的东西,结果发现.SF文件内容有点区别,JDK6生成的那个,是用的SHA1摘要算法,而JDK7生成的那个是用的SHA256。

  JDK7居然修改了jarsigner的默认算法!

  于是我尝试用jarsigner,指定参数-digestalg SHA1,手工对APK进行了签名。签名后的APK可以成功安装运行。

  既然如此,我认为去修改下Android SDK的tools/ant/build.xml,把签名那段配置加个参数就行了吧。没想到一查Ant Document,signjar任务居然不支持指定算法的参数。

  B方案,用exec调用jarsigner来签名好啦!


  1. <!-- <signjar 
  2.         jar="${out.packaged.file}" 
  3.         signedjar="${out.unaligned.file}" 
  4.         keystore="${key.store}" 
  5.         storepass="${key.store.password}" 
  6.         alias="${key.alias}" 
  7.         keypass="${key.alias.password}" 
  8.         verbose="${verbose}" /> --> 
  9. <exec executable="jarsigner" failonerror="true"> 
  10.     <arg line="-verbose -digestalg SHA1 -sigalg MD5withRSA" /> 
  11.     <arg line="-keystore ${key.store} -storepass ${key.store.password} -keypass ${key.alias.password}" /> 
  12.     <arg line="-signedjar &quot;${out.unaligned.file}&quot;" /> 
  13.     <arg line="&quot;${out.packaged.file}&quot; ${key.alias}" /> 
  14. </exec> 

  虽然B方案可行,但是我不甘心,决定上网搜搜,有没有更好的解决办法。一搜之下发现,原来还真有人要求Ant为signjar任务添加digestalg和sigalg参数。不过这在1.8.2里肯定是看不到了,一年了也没见Ant有更新,也许下一个版本里会有吧。

  不过Google毕竟是强大的,当然更强大的是聪明的程序员,我还搜到了一个C方案,说起来,跟B方案异曲同工,就是定义一个叫signjarjdk7的宏,调用exec来实现——这和B方案没啥区别,只是貌似改起来方便些:


  1. <macrodef name="signjarjdk7"> 
  2.     <attribute name="jar" /> 
  3.     <attribute name="signedjar" /> 
  4.     <attribute name="keystore" /> 
  5.     <attribute name="storepass" /> 
  6.     <attribute name="alias" /> 
  7.     <attribute name="keypass" /> 
  8.     <attribute name="verbose" /> 
  9.     <sequential> 
  10.         <exec executable="jarsigner" failonerror="true"> 
  11.             <!-- magic key --> 
  12.             <arg line="-verbose -digestalg SHA1 -sigalg MD5withRSA" /> 
  13.             <arg line="-keystore @{keystore} -storepass @{storepass} -keypass @{keypass}" /> 
  14.             <arg line="-signedjar &quot;@{signedjar}&quot;" /> 
  15.             <arg line="&quot;@{jar}&quot; @{alias}" /> 
  16.         </exec> 
  17.     </sequential> 
  18. </macrodef> 

  然后将后面调用signjar的地方改为调用signjarjdk7。这个方便就方便在不用改参数,以后Ant支持digestalg和sigalg了了,改回来容易。


  1. <!-- <signjar --> 
  2. <signjarjdk7 
  3.         jar="${out.packaged.file}" 
  4.         signedjar="${out.unaligned.file}" 
  5.         keystore="${key.store}" 
  6.         storepass="${key.store.password}" 
  7.         alias="${key.alias}" 
  8.         keypass="${key.alias.password}" 
  9.         verbose="${verbose}" /> 

 本文转自边城__ 51CTO博客,原文链接:http://blog.51cto.com/jamesfancy/752398,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Sui为根应用提供Java APIs,滴API。主要提供直接使用Android APIs的能力(几乎以Java作为root的身份
Sui为根应用提供Java APIs,滴API。主要提供直接使用Android APIs的能力(几乎以Java作为root的身份,在root下启动app自己的AIDL风格的Java服务。这将使root应用程序开发变得更加容易。
15 0
【Magisk模块】禁用Android 11-12应用文件夹限制
【Magisk模块】禁用Android 11-12应用文件夹限制
11 0
Android 获取栈顶应用包名
需求:因为需要做到应用锁功能,所以需要对前台展示的App进行判断锁屏,所以当应用锁的后台服务挂起时,需要对栈顶的应用包名进行判断。 这里做一个总结
20 0
【Android应用篇】防止连续点击,跳转两页
有时候在小说界面,你想点下一页,然后还没翻过去正翻一半,你又点了一次,结果就翻2页。
12 0
Android drawFunctor 原理及应用
Android drawFunctor 原理及应用
13 0
Flutter 环境搭建 与 Android 应用的调试
本文介绍 Flutter 环境搭建 与 Android 应用的调试
53 0
Android Studio 教程:创建 Android 应用
以下教程介绍了使用 Android Studio 创建具有基本功能的 Android 应用程序的过程。它将帮助您迈出学习 Android 开发的第一步。
52 0
Android 8.1 允许安装未知来源权限/允许来自此来源的应用
Android 8.1 允许安装未知来源权限/允许来自此来源的应用
42 0
RK3128 Android 7 BOX SDK 应用无法接收广播自启 + 眠休不黑屏问题
RK3128 Android 7 BOX SDK 应用无法接收广播自启 + 眠休不黑屏问题
94 0
Android 7.1 PackageInstaller(应用安装器)增加自动点击安装
Android 7.1 PackageInstaller(应用安装器)增加自动点击安装
104 0
+关注
科技小先锋
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
蚂蚁聚宝Android秒级编译——Freeline
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关镜像