记一次版本检测更新的bug
最近在做Android上的版本自动检测与更新功能,所有功能都没问题了,结果在新的apk文件覆盖安装环节出错了:
(版本检测与更新功能:版本信息及apk放在ftp服务上,客户端检测→发现新版本→下载apk文件→安装apk)
查了一下,原因是新旧版本的apk文件签名不同,有人给出的解决办法是彻底卸载旧版应用再重新安装。显然,在版本更新这里不适用。
我思考了一下,新版apk是我自己用AS生成的,签名文件也是我自己生成的。而旧版apk是由AS编译完直接安装的,那问题应该就在这里了,AS编译完直接安装的肯定没用我的签名文件...
找到问题了,卸载、安装生成的apk(不由AS安装了)、调试版本更新功能,成功。
这还不是最好的解决办法,继续往下看↓
另外说一句,调试尽量使用真机,因为模拟器只告诉了我“安装包解析失败”,是不是一脸懵逼?
应用签名的意义与使用
每个应用都应该有一个唯一的标志来标明身份,包名显然不合适,太可能完全一样了,所以应用签名就负担起了身份证的作用。有了这张身份证,就可以防止别人冒充你的应用,比如把它覆盖掉窃取用户信息,想想都危险...当然,我觉得你也要保护好自己的签名文件和密码~
那么,AS在debug时是谁给它签名的呢?
AS有一个默认的签名文件,位置:C:\Users\用户.android\debug.keystore(win10)
可以看到,AS debug时有自己的默认签名方式,既然跟我们生成apk使用的签名文件不同,自然无法实现版本更新。要彻底解决这个问题,让我们在开发阶段也可以愉快的测试版本更新功能,那就试试把AS debug的签名文件也搞成我们自己的就行了,大家保持一致,愉快更新~
来解决第一节的问题:
办法比较简单,网络上大多是这样做的:
(来个链接,讲的清晰的嘞:https://www.teachcourse.cn/2053.html)
1、首先要有一个签名文件,没有的话用AS自己生成一个;
2、在AS Build→Edit Build Types中打开Signing标签,尴尬,我的3.4.1版本并没有Signing,遍寻无果,不着急,继续往下看;
3、配置完Signing之后,在app模块下的build.gradle文件生成配置信息,像这样:
4、完成。
既然最终目的是在build.gradle文件生成配置信息,那我们直接添加就好了。
先有一个签名文件,我的是YXDFQD3.jks,然后打开app模块下的build.gradle,添加如下内容:
android{
...
//signingConfigs标签用于配置自定义签名文件
signingConfigs {
//使用YXDFQD3.jks签名的配置(YXDFQD3.jks:生成apk时使用的签名文件)
Testconfig {
keyAlias 'key0'
keyPassword 'liuyubo'
storeFile file('F:\\Project\\Android_Studio\\YXDTerminalManager\\YXDFQD3.jks')
storePassword 'liuyubo'
}
}
//指定AS debug时的签名配置(默认使用C:\Users\用户\.android\debug.keystore),解决AS debug版与生成apk版本签名不一致造成的更新安装失败问题
buildTypes {
release {
minifyEnabled false //是否混淆
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.Testconfig
}
debug {
signingConfig signingConfigs.Testconfig
}
}
...
}
然后同步、编译再安装,AS环境下也会使用我们指定的签名文件了。保持一致~
but!
居然安装失败,错误信息提示:新旧版本签名不一致???明明已经卸载了呀,毛都没有怎么不一致。
不要焦急,碰到这种莫名其妙的问题,试试clean project,事实上我还重启了手机~
Done!
后记
今天的收获呢
1、明白了签名的意义,唯一标志应用,算安全机制的一部分;
2、知道了AS debug模式下默认使用debug.keystore签名;
3、signingConfigs标签可以让我们自定义签名方法,替换默认签名,在版本更新这个应用场景里就很适合。
应用发布还是应该学一学,也许能了解更多关于签名或者其它知识,虽然我从事的b2b模式目前还没遇到过应用商店发布的需求,我们都是直接给用户apk,或者放在服务器上做个扫码下载(这是我马上准备做的功能,try~)。