現(xiàn)在做開(kāi)發(fā)的已經(jīng)很少有人會(huì)直接從底層開(kāi)發(fā)了,除非有些東西目前還沒(méi)有開(kāi)發(fā)人員發(fā)布出來(lái)或者做的比較好的吟吝。目前的趨勢(shì)是我這個(gè)軟件需要什么功能,我就從網(wǎng)上找一些開(kāi)源的框架剑逃、第三方庫(kù)引入項(xiàng)目中進(jìn)行輔助開(kāi)發(fā),從而避免了一些麻煩的步驟蛹磺。既然已經(jīng)有人把這個(gè)功能實(shí)現(xiàn)了,那我何必要從新去寫一遍萤捆,這樣學(xué)習(xí)成本和時(shí)間成本還是很高的裙品,作為開(kāi)發(fā)人員俗或,我們應(yīng)該考慮的是怎么才能做到低成本高回報(bào)——我認(rèn)為使用開(kāi)源框架等做二次開(kāi)發(fā)是最佳的答案。下面我來(lái)介紹一下開(kāi)源框架的使用辛慰。
在GitHub 、開(kāi)源中國(guó)等代碼托管平臺(tái)經(jīng)常有開(kāi)發(fā)人員分享自己的開(kāi)源項(xiàng)目帅腌、Demo等麻汰,但是他們寫的東西我們?cè)趺磳?dǎo)入到我們的項(xiàng)目中并加以使用呢?如果你能直接得到一個(gè)包的話那是最好的情況五鲫,將其導(dǎo)入到(左邊文件管理視圖切換為Project)app/libs/下,這只是將庫(kù)導(dǎo)入到本地項(xiàng)目中而已已球,但是我們還得告訴這個(gè)程序“你要去使用它”,因此這里我們要添加項(xiàng)目依賴智亮,在build.gradle中添加如下:
上面的代碼塊是存儲(chǔ)倉(cāng)庫(kù)点待,指定你導(dǎo)入的庫(kù)的最深層目錄,下面的依賴只需要添加箭頭指的那句代碼就行癞埠,name表示所要引用庫(kù)的名稱,ext表示其擴(kuò)展名苗踪,其他的代碼都是由系統(tǒng)生成的無(wú)需改動(dòng)。現(xiàn)在就可以直接使用庫(kù)中的東西啦通铲。
Tip:Android2.x版本是上面那張圖毕莱,但是Android3.x版本被官方修改掉了颅夺,上圖的compile要替換為implementation,不然就無(wú)法成功添加項(xiàng)目依賴吧黄。
下面介紹如何將開(kāi)源代碼打包并導(dǎo)入項(xiàng)目:
首先我們需要新建一個(gè)項(xiàng)目(說(shuō)是項(xiàng)目Project,其實(shí)就相當(dāng)于一個(gè)工作空間Workspace)拗慨,然后點(diǎn)擊File—New—New Module...(現(xiàn)在是創(chuàng)建一個(gè)模塊,也就是一個(gè)項(xiàng)目)赵抢,然后選擇Android Library(用于建庫(kù))。現(xiàn)在你的任務(wù)是把拿到的代碼昌讲,資源(圖片等)放到庫(kù)中的相應(yīng)位置,然后打開(kāi)庫(kù)中的build.gradle文件(這其實(shí)是一個(gè)在編譯期加載的文件)短绸,在該文件中配置如下:
把這段代碼加上去车吹,然后在Android Studio命令行(Terminal)中輸入指令:gradlew makeJar然后回車(如果在這之前你是第一次使用這種方式打包的話,系統(tǒng)會(huì)下載相應(yīng)的組件窄驹,時(shí)間會(huì)比較長(zhǎng),但以后就可以直接打包了)乐埠,打包成功后你所打包的庫(kù)在這個(gè)位置:
aar這個(gè)包就是了,和jar相比的話我覺(jué)得aar的使用更方便吧丈咐,我自己是這么覺(jué)得,如果你使用jar包的話棵逊,最多只能將類,項(xiàng)目配置文件打包辆影;如果你使用aar包的話徒像,不僅可以打包類锯蛀、項(xiàng)目配置文件,就連一些例如圖片之類的資源都可以打成一個(gè)包次慢,在某種意義上比jar更方便,至少后期的資源你不需要自己再去導(dǎo)一遍了经备。上面的aar文件有兩個(gè),一個(gè)是debug的侵蒙,一個(gè)是release的。-debug文件主要是用于調(diào)試用的纷闺,可以設(shè)置一些斷點(diǎn)什么的算凿,這個(gè)包是沒(méi)有任何優(yōu)化的氓轰,只是單純提供給開(kāi)發(fā)人員做調(diào)試用的;-release主要是在發(fā)布項(xiàng)目的時(shí)候用的浸卦,它比前者更輕量級(jí),因?yàn)樗拇a量更小,速度更優(yōu)靴庆,并且作為發(fā)布版本是不允許用戶進(jìn)行調(diào)試的,故發(fā)布的話選擇第二種炉抒。在這里你選擇哪個(gè)都行,然后將其導(dǎo)入到你所需要的項(xiàng)目中焰薄,接下來(lái)的步驟跟文章開(kāi)頭一樣,這里不再贅述塞茅。
至此,開(kāi)源代碼的打包及庫(kù)的導(dǎo)入都介紹完畢了凡桥,今天花了一天的時(shí)間在研究這個(gè)蟀伸。我是通過(guò)一個(gè)TextView波浪下沉的Demo來(lái)試驗(yàn)的缅刽,一開(kāi)始不熟悉老是出現(xiàn)一些問(wèn)題衰猛,比如打包編譯不通過(guò),還沒(méi)有將第三方庫(kù)導(dǎo)入本地項(xiàng)目就添加項(xiàng)目依賴刹孔,這些問(wèn)題都會(huì)導(dǎo)致運(yùn)行期錯(cuò)誤。如果你的項(xiàng)目和所建的庫(kù)在同一個(gè)Project(也就是工作空間)下髓霞,切記不能在代碼打包的同時(shí)給你需要應(yīng)用的項(xiàng)目添加項(xiàng)目依賴,因?yàn)?.你的庫(kù)還沒(méi)建好(即包都還沒(méi)打呢)2.你還沒(méi)有將庫(kù)導(dǎo)入到本地項(xiàng)目中方库,你的運(yùn)行期肯定要出錯(cuò)的。所以如果不太熟悉的話還是不建議在同一個(gè)Project中操作纵潦,我是單獨(dú)創(chuàng)建一個(gè)Project出來(lái)專門用來(lái)建庫(kù)(或者說(shuō)打包代碼),然后再新建一個(gè)我所要做開(kāi)發(fā)的項(xiàng)目邀层,再把庫(kù)導(dǎo)入到本地項(xiàng)目中返敬。
對(duì)了寥院,這個(gè)波浪下沉的Demo里面其實(shí)自定義了一個(gè)TextView 的子類,但是現(xiàn)在由于android版本的問(wèn)題已經(jīng)不能再在TextView下創(chuàng)建子類了,會(huì)報(bào)錯(cuò)霹肝,它會(huì)讓你用AppCompatTextView說(shuō)什么兼容性會(huì)更好,總之TextView之下已經(jīng)不能創(chuàng)建子類了预厌,但是在網(wǎng)上找的開(kāi)源項(xiàng)目卻一如既往的可以正常跑,這點(diǎn)實(shí)在令我費(fèi)解轧叽。如果使用了AppCompatTextView的話,你的MativityActivity就得繼承自AppCompatActivity炭晒,這樣在使用findViewById才不會(huì)出錯(cuò),或者有其他的解決方案也行网严,我最后是通過(guò)繼承APpCompatActivity解決編譯錯(cuò)誤問(wèn)題的识樱,然后坑爹的地方來(lái)了震束,明明所有的代碼完全一樣除了TextView類換成AppCompatTextView,Activity換成AppCompatActivity垢村,運(yùn)行起來(lái)效果居然令人無(wú)法直視,使用前者的類嘉栓,也就是網(wǎng)上提供的框架運(yùn)行起來(lái)毫無(wú)違和感,改成后面的據(jù)說(shuō)是具有更好兼容性的類侵佃,儼然成為了一個(gè)幀動(dòng)畫,看起來(lái)屬實(shí)讓人覺(jué)得惡心馋辈,話說(shuō)為啥要取消對(duì)TextView的繼承呢抚芦,你對(duì)這個(gè)類再加以封裝改進(jìn)一下也好啊首有。
好了,對(duì)Android開(kāi)源框架的使用就寫到這里井联。如哪里有問(wèn)題或講的不對(duì),歡迎指出烙常。