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,如需转载请自行联系原作者

相关文章
|
22天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
23天前
|
存储 搜索推荐 Java
打造个性化安卓应用:从设计到实现
【10月更文挑战第30天】在数字化时代,拥有一个个性化的安卓应用不仅能够提升用户体验,还能加强品牌识别度。本文将引导您了解如何从零开始设计和实现一个安卓应用,涵盖用户界面设计、功能开发和性能优化等关键环节。我们将以一个简单的记事本应用为例,展示如何通过Android Studio工具和Java语言实现基本功能,同时确保应用流畅运行。无论您是初学者还是希望提升现有技能的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧。
|
26天前
|
搜索推荐 开发工具 Android开发
打造个性化Android应用:从设计到实现的旅程
【10月更文挑战第26天】在这个数字时代,拥有一个能够脱颖而出的移动应用是成功的关键。本文将引导您了解如何从概念化阶段出发,通过设计、开发直至发布,一步步构建一个既美观又实用的Android应用。我们将探讨用户体验(UX)设计的重要性,介绍Android开发的核心组件,并通过实际案例展示如何克服开发中的挑战。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧,帮助您在竞争激烈的应用市场中脱颖而出。
|
28天前
|
算法 Java 数据库
Android 应用的主线程在什么情况下会被阻塞?
【10月更文挑战第20天】为了避免主线程阻塞,我们需要合理地设计和优化应用的代码。将耗时操作移到后台线程执行,使用异步任务、线程池等技术来提高应用的并发处理能力。同时,要注意避免出现死循环、不合理的锁使用等问题。通过这些措施,可以确保主线程能够高效地运行,提供流畅的用户体验。
39 2
|
2月前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
52 5
|
2月前
|
移动开发 Dart 搜索推荐
打造个性化安卓应用:从零开始的Flutter之旅
【10月更文挑战第20天】本文将引导你开启Flutter开发之旅,通过简单易懂的语言和步骤,让你了解如何从零开始构建一个安卓应用。我们将一起探索Flutter的魅力,实现快速开发,并见证代码示例如何生动地转化为用户界面。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供价值。
|
2月前
|
前端开发 JavaScript 测试技术
Android适合构建中大型项目的架构模式全面对比
Android适合构建中大型项目的架构模式全面对比
46 2
|
2月前
|
开发工具 Android开发 iOS开发
Android vs iOS:构建移动应用时的关键考量####
本文深入探讨了Android与iOS两大移动平台在开发环境、性能优化、用户体验设计及市场策略方面的差异性,旨在为开发者提供决策依据。通过对比分析,揭示两个平台各自的优势与挑战,帮助开发者根据项目需求做出更明智的选择。 ####
|
3月前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
348 3
|
4月前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
59 1