付費下載
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應用開發(fā)技術(shù)】AndroidStudio第八十三期-AndroidStudio3.1構(gòu)建緩存的坑
本文記錄的是今天在群里提到的昨天所踩的一個坑,有關(guān)AndroidStudio緩存的。先說一下背景。
我負責的一個項目,對一個圖表庫有外部依賴。這個圖表庫是我在維護的,由于新功能在開發(fā)中,所以我就使用了SNAPSHOT版本發(fā)布到OJO()上。我在項目中剛更新了依賴,忽然想到還少幾個API,于是發(fā)布了SNAPSHOT版本。
故事就這樣開始了。這時候回到AndroidStudio再去
SyncProjectwithGradleFiles
肯定是拉不下來的。眾所周知,Gradle的緩存策略中,對于SNAPSHOT版本默認的緩存周期是24小時,也就是從我上次更新之后,24小時內(nèi)都會使用上次的緩存。不周知的也沒關(guān)系,我在這里補充說明一下,在Gradle用戶指南的依賴管理一章中,有提到Gradle對于動態(tài)版本和變化模塊的緩存時間默認是24小時。
何為動態(tài)版本?你見過的像
3.+
這種就是動態(tài)版本,它會取檢查到的最高的版本號。又比如
egration,它也是動態(tài)版本。
而變化模塊,就是像
0.2-SNAPSHOT
這種后面帶
SNAPSHOT
的版本了。
這兩者的區(qū)別就是,前者盡管你代碼中的版本號寫法不變,但實際上它仍然是去取倉庫的最新版本。而后者它在倉庫中的版本號還是一樣,仍然是
xxx-SNAPSHOT,但實際上這個版本所對應的內(nèi)容已經(jīng)變了。不周知的也沒關(guān)系,我在這里補充說明一下,在Gradle用戶指南的依賴管理一章中,有提到Gradle對于動態(tài)版本和變化模塊的緩存時間默認是24小時。
何為動態(tài)版本?你見過的像
3.+
這種就是動態(tài)版本,它會取檢查到的最高的版本號。又比如
egration,它也是動態(tài)版本。
而變化模塊,就是像
0.2-SNAPSHOT
這種后面帶
SNAPSHOT
的版本了。
這兩者的區(qū)別就是,前者盡管你代碼中的版本號寫法不變,但實際上它仍然是去取倉庫的最新版本。而后者它在倉庫中的版本號還是一樣,仍然是
xxx-SNAPSHOT,但實際上這個版本所對應的內(nèi)容已經(jīng)變了。這里再多說幾句,緩存周期也是可以修改的,在Gradle用戶指南中同樣有詳細說明,就是添加如下配置:configurations.all
{
resolutionStrategy.cacheDynamicVersionsFor
10,
'minutes'
//
動態(tài)版本
resolutionStrategy.cacheChangingModulesFor
10,
'minutes'
//
變化模塊}1234只是這里我一開始就貪省事,在更新依賴懶得去改。既然如此,那怎么辦?把
~/.gradle/caches
整個給干掉?
不不不,那樣太小題大做。其實這個問題我早已遭遇過,并且對于“漢化”過一遍Gradle用戶指南的我來說太簡單了。命令行下執(zhí)行:./gradlew
aTD
--refresh-dependencies1這里啰嗦一下,aTD
是項目中一個Gradle任務的縮寫,全名是
assembleTestingDebug,其中
Testing
是項目里的一個
ProductFlavor。這并不重要,重點是后面的參數(shù)
--refresh-dependencies,加上這個參數(shù),表示強制刷新依賴。
但是回到AndroidStudio寫代碼,發(fā)現(xiàn)代碼提示中新的API還是沒有出來??磥硎茿ndroidStudio沒有更新。不過沒關(guān)系,這事我也有經(jīng)驗。點開右邊的Gradle面板,找到
androidDependencies
任務,右鍵,CreatexxxxxConfiguration,然后在彈出的面板的Arguments一欄中輸入前面提到的參數(shù)
--refresh-dependencies,添加完,在運行那里選擇它執(zhí)行。
等執(zhí)行完,按照幾年前的經(jīng)驗,這時候應該出來了吧?/20180308095044469?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFvc2lkaWFveGlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70然而,實際上并沒有。
這時候我忽然想起,我們公司在阿里云服務器上搭建了一個maven私服,去年的時候我在上面配置了對OJO的代理,這時候拉取的是私服上的版本,是它沒有更新?
沒關(guān)系,解決方法很簡單,刪!
于是我登錄到nexus上,找到緩存的這個庫,右鍵,整個版本刪掉。刪了服務器上的之后,還覺得不放心,于是再把.gradle里的緩存給找出來刪掉,我當時應該是這樣子的:
/20180308095110546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFvc2lkaWFveGlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70使用nexus搭建maven私服有幾種好處,一是可以放公司內(nèi)部的庫;二是配置對其他maven倉庫的代理,當有人去訪問某一個依賴時它就會緩存下來,下次其他人再訪問同一個依賴的話它就會直接取緩存,對于一些在國內(nèi)訪問不是很友好的倉庫如jcenter,能有效減少等待時間。當然如果公司內(nèi)部局域網(wǎng)部署一個的話,提升效果會更顯著。使用nexus搭建maven私服有幾種好處,一是可以放公司內(nèi)部的庫;二是配置對其他maven倉庫的代理,當有人去訪問某一個依賴時它就會緩存下來,下次其他人再訪問同一個依賴的話它就會直接取緩存,對于一些在國內(nèi)訪問不是很友好的倉庫如jcenter,能有效減少等待時間。當然如果公司內(nèi)部局域網(wǎng)部署一個的話,提升效果會更顯著。最后再執(zhí)行前面步驟。命令行中已經(jīng)可以看到重新下載了這個依賴了,并且我也檢查了
.gradle/caches/modules-2
下對應的源碼jar包,確實是更新了。
再回到AndroidStudio,發(fā)現(xiàn)依然沒有更新。
這什么情況?
我疑惑了一下,心中一個聲音響起:
?。ㄟ@里應讀四聲)!
這時候我想到了,新版的AndroidStudio為了提速,多了一層緩存:對于第三方依賴會把它們解壓出來,放到
~/.gradle/caches/transforms-1
目錄中。
于是繼續(xù):
刪!find
.
-name
"hichart*"
|xargs
rm
-rf1然后再構(gòu)建,讓它重新緩存,這時候應該就可以了吧。
在AndroidStudio中執(zhí)行了構(gòu)建,然后發(fā)現(xiàn)它確實重新緩存了。但是——
悲劇就此發(fā)展,深坑就此塌陷!這時候,我發(fā)現(xiàn)不單是新加的API沒有出來,編輯器里有關(guān)這個庫的代碼全都變紅了!盡管!項目還是能跑起來!當時的屏幕是這樣的:
不對不對。咋回事?/20180308095126656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFvc2lkaWFveGlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70這時候我又機智地想到,這里緩存的路徑有包含hash作為名稱的文件夾,更新了之后,hash值也不同了,所以應該是哪里的索引沒有對應上。于是找啊找,就在
transforms-1/metadata-1.1
中發(fā)現(xiàn)了一個叫
results.bin
的文件。再搜一下里面有沒有包含那個庫的內(nèi)容:cat
results.bin|
grep
"hichart"1提示是二進制文件。哦,那就加個參數(shù):cat
results.bin|
grep
-a
"hichart"1結(jié)果出來了,果然有。那好,那就再刪!
等等——我這時謹慎了一下,還是重命名一下好了。于是重命名,然后再執(zhí)行構(gòu)建,然后看到這個文件重新生成了,看起來正朝預料中的發(fā)展。然而,有關(guān)這個庫的引用還是報錯。這時候的我陷入了一番沉思,再試其他方法:SyncwithFileSystemSyncProjectwithGradleFilesFile->InvalidateCaches/Restart還是無效。帶著郁悶,我下班了。雖然這問題此刻表現(xiàn)得如此頑固,但是最終它還是被我解決了。
早上一來,我覺得我應該是有點急了,畢竟項目的開發(fā)時間由此被我拖多了一天了,但是作為一名有著一顆運維的心的程序員,自己踩陷的坑無論怎樣也要把它踩平。
于是我開始往其他緩存方面上考慮,也沒有去想合不合邏輯。我想到了Gradle在構(gòu)建時會對一個任務的輸入做快照,于是找到項目里的
.gradle/buildOutputCleanup
目錄,刪!
還不行,那就
.gradle/4.4(當前使用的Gradle版本),刪!
還不對,那就整個
.gradle,刪!
甚至,~/.gradle/caches/transforms-1/,刪!
依然不對,那就AndroidStudio的配置文件夾,~/.AndroidStudio3.1,刪!
刪完重新打開AndroidStudio導入配置,這時候發(fā)現(xiàn)已經(jīng)不是之前的問題了,你以為問題解決了嗎?不!是問題升級了!這時候已經(jīng)不是那個庫報紅了,而是所有引用第三方庫的地方都報紅了?。?!盡管,還是可以運行起來??!百般無奈之下,繼續(xù)google,看到的還是前面提到的InvilateCache的方法。忽然在Stackoverflow中看到了一個看起來不是很常見的回答:退出AndroidStudio,刪除所有的.iml文件以及.idea目錄,打開AndroidStudio重新導入項目。退出AndroidStudio,刪除所有的.iml文件以及.idea目錄,打開AndroidStudio重新導入項目。咦?這方法沒試過。那就試試吧:find
.
-name
"*.iml"
|xargs
rm
find
.
-name
".idea"
|xargs
rm
-rf12然后重新打開AndroidStudio,點
SyncwithFileSystem,這時候奇跡終于出來了,應該說,AndroidStudio終于正常了,編輯器不報紅了!壓抑著心中的萬分激動,有著打破沙鍋問到底精神的我,對此問題仍不放棄思考。
所以,究竟是什么原因呢?
我看了一下.iml文件,沒什么異常。那就再看.idea目錄。find
.idea
-type
f
|xargs
grep
"hichart"1結(jié)果如下:
原來是在.idea/libraries里會記錄每一個第三方庫的classes,javadoc以及sources所對應的路徑。其中classes對應的正是前面所提到的transforms-1里的目錄,同樣也正如前面所說,其中包含的路徑是有hash值的,更新了依賴之后,hash值不同,新的緩存路徑也就不同了,而這里還是用的原來被刪的那個路徑,找不到對應的文件當然編輯器里就提示
cannotr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- IPv4課件教學課件
- 2026四川西昌市人民醫(yī)院招聘8人備考題庫及答案詳解(易錯題)
- 跨境電商獨立站2025支付外包協(xié)議
- 初級牙醫(yī)考試題及答案
- 2025-2026人教版小學三年級語文測試卷
- 預防接種多選試題及答案
- 2025-2026人教版初中七年級數(shù)學上學期期末測試卷
- 2025-2026人教版二年級科學期末卷
- 2025-2026七年級上學期道德與法治
- 廣元市衛(wèi)生監(jiān)督管理制度
- 2026年甘肅省公信科技有限公司面向社會招聘80人(第一批)筆試模擬試題及答案解析
- 文獻檢索與論文寫作 課件 12.1人工智能在文獻檢索中應用
- 艾滋病母嬰傳播培訓課件
- 公司職務犯罪培訓課件
- 運營團隊陪跑服務方案
- 北京中央廣播電視總臺2025年招聘124人筆試歷年參考題庫附帶答案詳解
- 工業(yè)鍋爐安全培訓課件
- 2026中國單細胞測序技術(shù)突破與商業(yè)化應用前景報告
- 叉車初級資格證考試試題與答案
- 2025至2030中國新癸酸縮水甘油酯行業(yè)發(fā)展研究與產(chǎn)業(yè)戰(zhàn)略規(guī)劃分析評估報告
- 剪映完整課件
評論
0/150
提交評論