- 目前我聽著歌,心里預(yù)約,發(fā)現(xiàn)bug,到解決Bug,總共費時3天,心情如過山車一樣,便有此文
我們App是一個LAUNCHER應(yīng)用,就是一個安卓系統(tǒng)搭載我們APP,我們App作為啟動的應(yīng)用,在OTA的時候沒有發(fā)現(xiàn)數(shù)據(jù)庫丟失,但是更新系統(tǒng)的時候,發(fā)現(xiàn)所有數(shù)據(jù)丟失,這是QA反饋的情況
- 1、首先懷疑是系統(tǒng)的問題,因為我們的系統(tǒng)是定制化的,有些特定的程序,特定的分區(qū)給我們App獨特使用,同時我們App是沒有權(quán)限限制,也就是說代碼沒有做動態(tài)權(quán)限的申請,所以有可能是系統(tǒng)更新后,導(dǎo)致某個權(quán)限沒有了,然后導(dǎo)致讀取文件的失敗

- 所以我先排除了是權(quán)限的問題,但是這個時候,還是不明白為什么OTA APP正常,OTA Image不正常,同時也反饋情況給leader,說明情況

回到問題的本身,我們數(shù)據(jù)如何處理,我們App本身內(nèi)置了一個數(shù)據(jù)庫文件,這個數(shù)據(jù)庫文件主要是確定用戶在沒有網(wǎng)絡(luò)的情況下,也能夠正常的使用內(nèi)置的數(shù)據(jù),同時我們把資源文件(主要是圖片)放在專門的一個分區(qū),apd分區(qū)

OTA 系統(tǒng)會改動這個分區(qū)的數(shù)據(jù)么?不會,這個可以算是用戶分區(qū),同時"/data/data/" + context.getPackageName()這個也是用戶空間,OTA App或者是系統(tǒng)是不會丟失這里面的文件的
App的數(shù)據(jù)庫加載流程
- 1、首次啟動APP。App會判斷是否有數(shù)據(jù)庫文件,如果有,不做任何處理
- 2、如果沒有數(shù)據(jù)庫文件,那么通過流的操作,把App的資源文件寫入到
"/data/data/" + context.getPackageName(),也就是原始的數(shù)據(jù)庫文件,這個文件,會跟著APP一生,也就是這個產(chǎn)品的一生
問題是數(shù)據(jù)庫文件丟失?觀察原始系統(tǒng)下的 db文件大小,和ota完成以后的大小

但是當(dāng)ota成功后,這個數(shù)據(jù)庫變?yōu)?66k,所以問題是數(shù)據(jù)庫文件丟失

到這里明白數(shù)據(jù)文件的丟失了,但是為什么OTA APP正常呢?為什么呢?這個問題困擾我一直到第二天,我的理解就是兩個都有問題,然后就可以去找數(shù)據(jù)庫文件為什么丟失
到這里我第一個思路,就是替換原來的DB文件到最新版本,同時資源文件也是,因為我們有新增的數(shù)據(jù),在沒網(wǎng)的情況下,用戶能夠看到數(shù)據(jù),但是顯示不了圖片,同時我在這里忽略了一個極其重要的問題,用戶原來的數(shù)據(jù)庫文件怎么辦?
由于發(fā)的是正式版本,需要對每一條數(shù)據(jù)庫文件檢查,同時每一條數(shù)據(jù)都在APP上實際操作,這個過程在我們發(fā)第一個版本,足足弄了一周,而且還有不確定的問題產(chǎn)生,所以這個解決很大問題,同時還要備份原來的數(shù)據(jù)庫文件,實際操作的時間遠大于解決這個問題的意義
So,我不太能夠說服我自己,同時心里開始產(chǎn)生懷疑,應(yīng)該OTA都有問題,但是我今天加班,QA的小伙伴不在公司
由于系統(tǒng)集成的app都是system分區(qū)的,自己可以通過push模擬OTA的操作,通過模擬的結(jié)果:開始懷疑,QA的測試結(jié)果有問題,應(yīng)該是OTA App 和 Image 都是有問題的,對的,這次更加的確定
放棄幻想,開始戰(zhàn)斗,開始懷疑數(shù)據(jù)庫的更新關(guān)鍵是有問題的,由于這塊邏輯不是我寫的
所以,大膽假設(shè),小心求證
DB的更新流程如下:
1、備份數(shù)據(jù),如果是新表的話,其實是不需要備份數(shù)據(jù)的,需要做些判斷
2、刪除表
3、創(chuàng)建表
4、恢復(fù)數(shù)據(jù),同第一點一樣,如果備份數(shù)據(jù)表的中間表不存在,也是不需要的
通過以上流程的分析,這塊代碼沒有問題,只不過是我們Pro的版本,有個跨表升級的問題,最后修復(fù)了,跨表升級的問題
我們App分為好多個版本,但是數(shù)據(jù)版本是一直在增加,所以有可能出現(xiàn),Rro的線上版本需要從1升級到9這種情況,需要特定處理
第二天正式上班,第一件事情,就是讓QA復(fù)現(xiàn)他的情況,為什么OTA App是正常的,最后看了測試視屏,終于明白,OTA App 是保持有網(wǎng)絡(luò)的狀態(tài),所以當(dāng)更新到最新版本,發(fā)現(xiàn)本地沒有數(shù)據(jù),就回去網(wǎng)絡(luò)上獲取,到這里終于真想大白。
解決這個問題,我的心態(tài)是變化是:迷茫--->清晰--->困惑---->懷疑--->解決--->多方求證--->驗證答案,皆大歡喜

最后感謝我們公司的QA小伙伴不離不棄,哈哈
