最近在做OTA升级的时候出现了问题,是因为以前一直没搞懂OTA升级的具体流程,然后现在出现了问题,只能重新生成apk,以前的老版本都无法OTA升级,只能卸载重新下载安装,所以在此记录下。
首页要弄明白两个问题:什么是OTA?什么是签名?
- OTA
OTA(Over-the-Air Technology)空中下载技术。是通过移动通信(GSM或CDMA)的空中接口对SIM卡数据及应用进行远程管理的技术。空中接口可以采用WAP、GPRS、CDMA1X及短消息技术。OTA升级是Android系统提供的标准软件升级方式。它功能强大,可以无损失升级系统,主要通过网络[例如WIFI、3G]自动下载OTA升级包、自动升级。总结:所谓ota升级就是通过无线网络下载、升级,不用通过有线连接来下载、升级,直接通过无线环境下载、升级就可以了,比较方便。
- 签名
这里要搞起三个问题:什么是签名?为什么要签名?如何签名?
签名简单点讲就是给每个应用做唯一标识符。为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动更新不会因为版本不一致而无法安装)。
- 如何签名
1.生成keystore
2.用生成的keystore对apk进行签名
生成keystore和签名可以用eclipse来操作,也可以使用命令行来操作。
方法一:命令行进行签名
1.生成keystore:
这里要使用到jdk,命令行进入到jdk的bin目录下。
E:\java\jdk\bin>keytool -genkey -v -keystore demo.keystore -alias alias_name -keyalg RSA -validity 10000
注:
keytool是生成keystore的工具,位于jdk\bin目录下。
-genkey:产生密钥;
-keystore demo.keystore:生成的keystore的名字的demo.keystore;
-alias alias_name:生成的keystore别名是alias_name;
-keyalg RSA:使用RSA算法对签名加密;
-validity 10000:有效期限10000天。
然后会提示输入密码,再确认密码(这里的密码一定要记住)。之后会依次输入姓名、组织单位、组织名称、城市区域、省份名称和国家代码(CN)。
再次回车之后就能在jdk\bin目录下看到生成的keystore。
2.用keystore进行签名
签名要使用jarsigner.exe,同样也位于jdk\bin目录下,
E:\java\jdk\bin>jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk alias_name
注:
-keystore demo.keystore:签名生成的keystore的名称;
-signedjar demo_signed.apk demo.apk alias_name:-signedjar后面跟了3个参数,分别表示签名后生成的apk,待签名的apk和keystore别名。
命令行输入签名命令后,回车提示输入签名生成keystore设置的密码,再次回车开始签名。
3.查看签名
E:\java\jdk\bin>jarsigner -verify demo_signed.apk
如果已经签名会打印“jar verified”。
4.查看签名详细信息
E:\java\jdk\bin>jarsigner -verify -verbose -certs demo_signed.apk
5.优化签名的apk(非必须,但建议这么做)
这里要使用到zipalign.exe工具,在android sdk目录下:SDK\tools\zipalign.exe
优化apk
zipalign -v 4 demo_signed.apk app.apk
查看apk是否优化
zipalign -c -v 4 app.apk
然后就可以用生成的app.apk进行OTA升级了。
OTA升级不成功有几点原因:签名改变(即keystore变了),包名改变,版本号不对,OTA包不完整。
如果OTA升级失败,在确认其他几点没问题的时候,基本就是签名改变了,这时就可以查看以前版本apk的MD5和此时keystore的MD5值是否一样。
查看apk签名信息:
用winRAR打开apk,将其中META-INF文件夹解压出来,得到其中的CERT.RSA文件,然后使用命令行:
keytool -printcert -file META-NIF\CERT.RSA
能查看到apk的签名信息(序列号、有效期、MD5、SHA1等信息)。
查看keystore信息:
命令行输入:
keytool -list -v -keystore C:\Users\Desktop\demo.keystore -storepass password
password指此keystore的密码。此时会打印keystore信息。
方法二:用eclipse生成keystore,签名
1、右击项目点击Export导出;
2、选择Export Android Application,点击Next;
3、继续Next;
4、这个如果已经有keystore就选择Use existing keystore,没有就选择Create new keystore,然后分别选择Location,输入密码和确认密码;
5、如果选择Use existing keystore,则会让你根据别人输入别人的密码,然后继续Next,最后finish就导出了签名后的apk。这里也可以选择Create new key。
6、如果第4步选择了create new keystore,就会让你填写一些信息:别名、密码、有效期限、姓名、组织单位、组织名称等,根据提示一步一步来就OK了。
好了,以上基本是对签名的总结了。其实就是两步:生成keystore,然后用生成的keystore对apk进行签名。