記一次版本檢測更新的bug
最近在做Android上的版本自動檢測與更新功能齐苛,所有功能都沒問題了驶冒,結(jié)果在新的apk文件覆蓋安裝環(huán)節(jié)出錯了:
(版本檢測與更新功能:版本信息及apk放在ftp服務(wù)上,客戶端檢測→發(fā)現(xiàn)新版本→下載apk文件→安裝apk)
查了一下少欺,原因是新舊版本的apk文件簽名不同,有人給出的解決辦法是徹底卸載舊版應(yīng)用再重新安裝欣福。顯然,在版本更新這里不適用焦履。
我思考了一下拓劝,新版apk是我自己用AS生成的,簽名文件也是我自己生成的裁良。而舊版apk是由AS編譯完直接安裝的凿将,那問題應(yīng)該就在這里了校套,AS編譯完直接安裝的肯定沒用我的簽名文件...
找到問題了价脾,卸載、安裝生成的apk(不由AS安裝了)笛匙、調(diào)試版本更新功能侨把,成功。
這還不是最好的解決辦法妹孙,繼續(xù)往下看↓
另外說一句秋柄,調(diào)試盡量使用真機,因為模擬器只告訴了我“安裝包解析失敗”蠢正,是不是一臉懵逼骇笔?
應(yīng)用簽名的意義與使用
每個應(yīng)用都應(yīng)該有一個唯一的標(biāo)志來標(biāo)明身份,包名顯然不合適,太可能完全一樣了笨触,所以應(yīng)用簽名就負(fù)擔(dān)起了身份證的作用懦傍。有了這張身份證,就可以防止別人冒充你的應(yīng)用芦劣,比如把它覆蓋掉竊取用戶信息粗俱,想想都危險...當(dāng)然,我覺得你也要保護好自己的簽名文件和密碼~
那么虚吟,AS在debug時是誰給它簽名的呢寸认?
AS有一個默認(rèn)的簽名文件,位置:C:\Users\用戶.android\debug.keystore(win10)
可以看到串慰,AS debug時有自己的默認(rèn)簽名方式偏塞,既然跟我們生成apk使用的簽名文件不同,自然無法實現(xiàn)版本更新邦鲫。要徹底解決這個問題烛愧,讓我們在開發(fā)階段也可以愉快的測試版本更新功能,那就試試把AS debug的簽名文件也搞成我們自己的就行了掂碱,大家保持一致怜姿,愉快更新~
來解決第一節(jié)的問題:
辦法比較簡單,網(wǎng)絡(luò)上大多是這樣做的:
(來個鏈接疼燥,講的清晰的嘞:https://www.teachcourse.cn/2053.html)
1沧卢、首先要有一個簽名文件,沒有的話用AS自己生成一個醉者;
2但狭、在AS Build→Edit Build Types中打開Signing標(biāo)簽,尷尬撬即,我的3.4.1版本并沒有Signing立磁,遍尋無果,不著急剥槐,繼續(xù)往下看唱歧;
3、配置完Signing之后粒竖,在app模塊下的build.gradle文件生成配置信息颅崩,像這樣:
4、完成蕊苗。
既然最終目的是在build.gradle文件生成配置信息沿后,那我們直接添加就好了。
先有一個簽名文件朽砰,我的是YXDFQD3.jks尖滚,然后打開app模塊下的build.gradle喉刘,添加如下內(nèi)容:
android{
...
//signingConfigs標(biāo)簽用于配置自定義簽名文件
signingConfigs {
//使用YXDFQD3.jks簽名的配置(YXDFQD3.jks:生成apk時使用的簽名文件)
Testconfig {
keyAlias 'key0'
keyPassword 'liuyubo'
storeFile file('F:\\Project\\Android_Studio\\YXDTerminalManager\\YXDFQD3.jks')
storePassword 'liuyubo'
}
}
//指定AS debug時的簽名配置(默認(rèn)使用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環(huán)境下也會使用我們指定的簽名文件了饱搏。保持一致~
but!
居然安裝失敗,錯誤信息提示:新舊版本簽名不一致置逻?推沸??明明已經(jīng)卸載了呀券坞,毛都沒有怎么不一致鬓催。
不要焦急,碰到這種莫名其妙的問題恨锚,試試clean project宇驾,事實上我還重啟了手機~
Done!
后記
今天的收獲呢
1、明白了簽名的意義猴伶,唯一標(biāo)志應(yīng)用课舍,算安全機制的一部分;
2他挎、知道了AS debug模式下默認(rèn)使用debug.keystore簽名筝尾;
3、signingConfigs標(biāo)簽可以讓我們自定義簽名方法办桨,替換默認(rèn)簽名筹淫,在版本更新這個應(yīng)用場景里就很適合。
應(yīng)用發(fā)布還是應(yīng)該學(xué)一學(xué)呢撞,也許能了解更多關(guān)于簽名或者其它知識损姜,雖然我從事的b2b模式目前還沒遇到過應(yīng)用商店發(fā)布的需求,我們都是直接給用戶apk殊霞,或者放在服務(wù)器上做個掃碼下載(這是我馬上準(zhǔn)備做的功能摧阅,try~)。