1 問題
(1) 當(dāng)項(xiàng)目中引用的第三方模塊太多,打開Android Studio的時(shí)候就會(huì)非常慢,提示一直在解決模塊依賴,點(diǎn)擊sync按鈕同步第三方代碼的時(shí)候也是巨慢,慢的原因是:
在gradle中引用第三方模塊時(shí)采用maven方式依賴,每次打開Android Studio或者點(diǎn)擊sync按鈕時(shí),都會(huì)去maven中央倉庫去取第三方的庫文件,一般是jar或者aar文件
如果本地沒有該文件,則下載回來,由于通過網(wǎng)絡(luò)訪問Android Studio默認(rèn)的maven中央倉庫jcenter很慢,因此就導(dǎo)致同步會(huì)非常耗時(shí),尤其是第一次同步,或者clean后重新build的時(shí)候,一般都會(huì)在十分鐘左右,
即使庫文件已經(jīng)下載到本地了,也會(huì)去訪問maven倉庫的,因此當(dāng)過多的通過maven方式依賴第三方庫的時(shí)候Android Studio就會(huì)非常慢
(2) Android Studio為什么編譯很慢?
Android Studio在編譯的時(shí)候,如果沒有同步第三方代碼,或者任何一個(gè)gradle文件發(fā)生變化后,沒有去同步,那么點(diǎn)擊運(yùn)行按鈕會(huì)自動(dòng)先同步,也就是先同步后編譯,平時(shí)我們感覺編譯慢的原因主要是同步代碼太慢,真正同步完成后編譯其實(shí)是很快的
2 maven依賴是啥?
svn用來管理文本文件,但它不擅長管理二進(jìn)制文件,這個(gè)時(shí)候maven就登場(chǎng)了,簡單點(diǎn)說,maven就是管理二進(jìn)制文件的svn,這樣說應(yīng)該可以理解了吧。一般我們使用別人的庫需要下載jar文件然后依賴到我們的工程,現(xiàn)在作者將jar文件發(fā)布到公共的maven倉庫中,在gradle中我們只需要簡單的像下面這樣:
dependencies { //使用square開源的網(wǎng)絡(luò)訪問框架okhttp compile 'com.squareup.okhttp:okhttp:2.5.0'}
1
2
3
4
同步代碼時(shí),Android Studio就會(huì)自動(dòng)去下載作者發(fā)布的jar(或者aar)文件,如果作者發(fā)布了新的版本,則只需要簡單的修改一下后面的版本號(hào)即可,不要這個(gè)庫,直接刪掉這行代碼即可,是不是瞬間覺得相當(dāng)方便啊 在web開發(fā)中,只需要使用maven插件就能實(shí)現(xiàn)同樣功能,只是依賴的寫法不同。這就是解決不同模塊不同版本依賴的方法—maven大法。 然而由于我們?cè)L問國外的服務(wù)器太慢,這么先進(jìn)的生產(chǎn)工具就成了雞肋,這是造成Android Studio卡、慢的根源
3 解決方法
方法一:
(1) 當(dāng)?shù)谝淮瓮酱a后,第三方庫都下載到本地了,將gradle設(shè)置為offline模式,這樣下次就不必訪問網(wǎng)絡(luò)了,這樣同步速度從幾分鐘縮短到幾秒鐘,但缺點(diǎn)是一旦引入新的maven依賴,本地不存在這個(gè)庫文件,還是得去訪問網(wǎng)絡(luò),同樣同步慢
方法二:
(2) 自己搭建maven倉庫,將常用的第三方庫放在自己搭建的maven服務(wù)器上,這樣訪問內(nèi)部的maven服務(wù)器就快多了,又方便分模塊開發(fā)和打包,但這樣對(duì)服務(wù)器的管理麻煩,技術(shù)含量高,比較適合需要分模塊開發(fā)的大型項(xiàng)目,而且當(dāng)多個(gè)模塊開發(fā)不同步,需要對(duì)模塊分版本進(jìn)行依賴、打包、發(fā)布的時(shí)候,必須采用這種方式,例如:模塊A已經(jīng)開發(fā)完畢,模塊B正在開發(fā),但這個(gè)時(shí)候要發(fā)版本了,怎么辦呢?解決辦法就是依賴模塊B的上個(gè)版本,也就是上個(gè)版本的aar文件
方法三:
(3) 將第三方庫下載到本地,然后將代碼復(fù)制到自己的項(xiàng)目中,這種方法是在代碼級(jí)別上直接使用別人的代碼,優(yōu)點(diǎn)是再也不用依賴別人的庫,項(xiàng)目模塊少,庫與自己項(xiàng)目融為一體,缺點(diǎn)是復(fù)制的時(shí)候太辛苦了,不僅要復(fù)制代碼文件,還要復(fù)制資源文件,容易出錯(cuò),另外耦合比較嚴(yán)重,刪除這個(gè)庫的時(shí)候也非常麻煩,同時(shí)別人的代碼也破壞了自己的代碼風(fēng)格和命名規(guī)范
方法四:
(4) 推薦的方法是:盡量使用第三方庫的jar、aar文件導(dǎo)入自己的項(xiàng)目,或者將第三方庫下載到本地,然后當(dāng)做一個(gè)本地模塊導(dǎo)入自己的項(xiàng)目,不要再使用gradle中的maven依賴了
這樣就不用苦逼的去復(fù)制代碼,刪除的時(shí)候也很方便,只需刪除模塊即可,實(shí)現(xiàn)模塊即插即用,缺點(diǎn)是會(huì)導(dǎo)致項(xiàng)目的模塊太多,不美觀,以及很多eclipse寫的庫導(dǎo)入Android Studio后還要自己修改才能編譯通過,很多庫是Android工程,不是標(biāo)準(zhǔn)意義的Android library,
好在現(xiàn)在很多有名的庫都專門提供了library,直接導(dǎo)入即可,還有Android Studio已經(jīng)可以直接將eclipse工程當(dāng)做一個(gè)module導(dǎo)入了,所以這種方法還是很簡單的
這種方法也就是以前eclipse使用第三方庫的方法
4 直接引用aar文件的方法
Android Studio卡的主要原因是gradle去下載maven倉庫中的庫文件時(shí)速度太慢,那么我們直接去maven倉庫將第三方庫文件下載回來,引用到項(xiàng)目中就可以解決問題了。然而Github上很多項(xiàng)目只給出了maven依賴的使用方法,壓根沒有給出jar或aar文件的地址,我們以Android上比較有名的facebook的圖片加載框架fresco為例:
https://github.com/facebook/fresco
在fresco的Github主頁上只給出了下面這種使用方法:
compile 'com.facebook.fresco:fresco:0.9.0+'
1
怎么辦呢?難道只能使用maven依賴去慢慢下載嗎?如果你搭建過maven服務(wù)器或者發(fā)布過自己寫的框架,你就知道,其實(shí)我們最終使用的還是別人打包好的jar或aar文件,上面這行字符串只不過是指向這個(gè)aar文件而已,最終gradle還是要把a(bǔ)ar文件下載回來,那么問題來了,這個(gè)文件究竟在哪兒呢?下面我們就找出這個(gè)文件: (1) 百度”maven”倉庫
選擇第一個(gè),我們就進(jìn)入了maven中央倉庫,也就是下面的網(wǎng)址
maven中央倉庫:http://mvnrepository.com/
(2) 搜索fresco,一般關(guān)鍵字就是庫的名稱啦
對(duì)比一下maven依賴字符串com.facebook.fresco,所以選擇第一個(gè)
可以看到有很多版本,你會(huì)發(fā)現(xiàn)上面的maven字符串后面的版本號(hào)是不是和這里的版本號(hào)吻合了,其實(shí)maven依賴字符串就是告訴gradle怎么去找這個(gè)庫文件。點(diǎn)擊紅色框中最新版本0.9.0
在寫這篇文章的時(shí)候,最新版是0.9.0,后來這個(gè)網(wǎng)站改版了,aar文件下載方法有點(diǎn)變化,所以我更新了下面這一段,這個(gè)時(shí)候版本已經(jīng)到0.11.0了,后面的版本請(qǐng)你自己靈活的變通一下,下面我們來下載aar文件
點(diǎn)進(jìn)去之后會(huì)發(fā)現(xiàn)有很多文件,解釋一下,后綴為xxxx-javadoc.jar的文件是幫助文檔,xxxx-sources.jar的文件是源碼,這兩個(gè)都不是我們需要的,我們需要的是單純的xxx.jar文件,或者xxx.aar文件,如圖:
好了,找到啦,直接點(diǎn)擊fresco-0.11.0.aar就可以下載了,其實(shí)maven依賴字符串就是告訴gradle怎么去找到這個(gè)aar文件 那么怎么使用aar文件呢?
(3) 使用aar文件 aar文件和jar文件不同,jar文件只包含類文件,aar文件不僅包含類文件,好包含資源文件,例如:圖片,布局文件等。aar文件使用方法如下。 在app的build.gradle文件中加入如下代碼:
//本地倉庫,用于引用aar文件repositories { flatDir { dirs 'libs' }}dependencies { //facebook的圖片加載框架fresco compile(name: 'fresco-0.9.0', ext: 'aar') }
1
2
3
4
5
6
7
8
9
10
11
(4) 點(diǎn)擊sync按鈕同步代碼,如果還是找不到庫中的類,那么點(diǎn)擊運(yùn)行按鈕,即使運(yùn)行不起來,只要運(yùn)行一次就可以找到我們引入的庫中的類了。
(5) 好了,到這里就學(xué)會(huì)了跳過maven依賴,直接使用aar文件的方法,是不是很簡單呢。搞清楚了原理,gradle的maven依賴其實(shí)也就那么回事,用不好反而成了雞肋
5 其他一些注意事項(xiàng)
(1) 盡量刪除不用的module,因?yàn)槊看蝧ync的時(shí)候會(huì)去同步所有的gradle文件,即使我們的主工程不使用它也會(huì)去同步,sync是全局的
(2) 自己下載gradle到本地,然后在Android Studio指定gradle的位置,避免第一次創(chuàng)建項(xiàng)目時(shí)去下載gradle,那也是巨慢的一個(gè)過程
(3) 減少同步代碼的次數(shù),也就是沒事別點(diǎn)sync按鈕,每次同步代碼都是非常消耗資源的過程,次數(shù)多了也就卡了
6 總結(jié)
(1) 網(wǎng)上說的有關(guān)解決Android Studio卡頓的方法,諸如:給gradle開啟專門的守護(hù)線程,增大Android Studio的內(nèi)存,開啟gradle離線模式等,經(jīng)過實(shí)踐證明,并沒有什么卵用,因?yàn)樗麄儾]有找到Android Studio卡的真正原因是gradle同步代碼時(shí)網(wǎng)速太慢
7 說明
博主寫這篇文章,主要是因?yàn)橹霸谧鲰?xiàng)目時(shí),使用了十幾個(gè)maven依賴的第三方庫,結(jié)果每次打開Android Studio或者點(diǎn)擊sync按鈕同步代碼時(shí)都要超過十分鐘時(shí)間,十分鐘那是必須滴,同步一次都可以喝杯咖啡了,實(shí)在忍無可忍了,遂百度解決方法,然而發(fā)現(xiàn)網(wǎng)上那些方法并沒有什么卵用,于是自己摸索出了解決方法,將所有引入的第三方庫全部改為引用aar文件或者jar文件,不再使用maven依賴,哈,瞬間就快了
經(jīng)過博主實(shí)踐,使用這種方法,同步代碼從原來的十多分鐘縮短到了一分鐘之內(nèi),遂著此文以記之