今天在build android apk的时候遇到一个奇怪的问题,以release 模式build 好了之后用jarsigner给apk签名,结果报出一个warning
No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (xxxx-xx-xx) or after any future revocation date
很奇怪,之前的好好的,现在怎么突然有warning了,而且发现虽然是warning,但是我安装apk的时候提示我找不到签名被拒绝了。很纳闷,怎么突然就不好用了。本来昨晚要给老大发个版本的,得正式签名,一般都是在服务器上做,但是昨晚在家的时候登不上内网服务器,还好后来老大不要包了!不然要被K的狗血喷头。完全不知道什么情况。就不好用了。google了一上午,没有发现任何有用的信息,一般都是说是使用jarsigner的时候把-tsa 参数补全就好了,但是以前都没有出现过呀,就又继续google。有个哥们儿说java7之后jarsigner增加了对timestamp的检查,所以得加上了,找到一个提供timestamp的网站 http://tsa.starfieldtech.com。 但我不太想用时间戳,主要是不知道为什么现在突然要用了。已经受够了不知其所以然的状态了。
冥思苦想一阵子之后想起,前阵子想鼓捣java8,就安装了java吧,一查java 的version果然是1.8,在网上搜了一下怎么配置java的版本
使用 update-alternatives 命令可以修改命令对应的程序路径,自然也可以修改版本号。于是使用
sudo update-alternatives --config java
可以查看目前的java配置,我的如下
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/java-6-openjdk-i386/jre/bin/java 1063 auto mode
1 /usr/lib/jvm/java-6-openjdk-i386/jre/bin/java 1063 manual mode
2 /usr/lib/jvm/java-8-oracle/jre/bin/java 1062 manual mode
可以看出我的java用的是java6,之前是java8,这个是我改过之后的配置了,需要注意的是优先级越高的话,系统会自动挑选那个作为使用版本,除非手动选择其他版本,于是我调用
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-6-openjdk-i386/jre/bin/java 1063
给java6提高了优先级,系统就自动选择java6的编译器。
我以为问题解决了,但是使用jarsigner的时候还是相同的问题,纠结了一会儿之后想到,是不是jarsigner也有版本的,对应不同的java应该有不同的signer,一查果然,jarsigner还是用的java8的jarsigner,按照上面的办法把jarsigner的默认版本号也修改成了java6的,一切又恢复了正常。
虽然问题解决了,但是实际上,我只是把版本回退了,最好还是增加tsa参数加上时间戳更现代化一点。但是应用开发的问题就在这里,很多时候,我们不能用最新的一些东西,由于历史或者现实的原因只能用一些旧的工具或者技术,这是搞技术的人的最大的悲哀。如果能用最新的东西,最好还是用新的,虽然新的可能有bug,但是新的集合了开发者新的功能或者有优化,发展的趋势一定是好的,当然也不排除那些不做死就不会死的人。以此自醒。