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

相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
218 4
|
1月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
60 14
|
1月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
1月前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
1月前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
38 0
|
2月前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
4月前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
403 3
|
14天前
|
NoSQL 关系型数据库 MySQL
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
138 7
|
5月前
|
Oracle Java 关系型数据库
Mac安装JDK1.8
Mac安装JDK1.8
801 4
|
5月前
|
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应用打下基础。
67 1