Android項(xiàng)目中如何正確的引入第三方jar包(工程)
最近在學(xué)習(xí)一個Android技術(shù)點(diǎn)時,需要在工程項(xiàng)目中引入第三方jar包,遇到的問題是在編譯的時候能通過,但是在實(shí)際運(yùn)行的時候會出錯。后來經(jīng)過調(diào)研發(fā)現(xiàn),原來是在引入第三方jar包的時候出錯了,現(xiàn)在總結(jié)已經(jīng)成功的兩種方式。
一 使用Build Path中的Order and Export選項(xiàng)卡
1.將實(shí)例Android項(xiàng)目(project源碼)import到Eclipse中,這時由于第三方jar包路徑和原作者的存放路徑不一致,項(xiàng)目會提示紅叉叉,不能進(jìn)行編譯;
2.下載第三包jar包3rd.jar保存到本地,然后通過Build Path→Configure Build Path→Libraries→Add external JARS,將3rd.jar添加到項(xiàng)目的Build Path中去,這時該Android項(xiàng)目上的紅叉叉就會消失,項(xiàng)目能通過編譯;
```
```點(diǎn)擊“OK”
3.接著,我們到模擬器上Run下這個項(xiàng)目,模擬器啟動是在是太慢了,這個時候,我們可以喝點(diǎn)水,上個廁所,站起來走走。程序員,要對自己的身體好一點(diǎn)。我這次就不去廁所了,寫這篇文章呢。模擬器還崩潰了一次,悲劇,只得again......
結(jié)果:
到logcat中查錯唄:
4.重新配置Build Path:
繼續(xù)Build Path→Configure Build Path→Order and Export,將里面的3rd.jar勾選,點(diǎn)擊OK
再run一次:
還是報錯?!蝦米情況?。。?/span>
別急Project→clean一下當(dāng)前項(xiàng)目,再run一次就得到正確結(jié)果了。
Success!
思考:如果第三方jar包只有一個這樣做還好說,如果在項(xiàng)目中引入的jar包很多,這是可參考第二種方法。
二 創(chuàng)建自己的 Source Folder
1.Build Path→New Source Folder→給第三方jar的文件夾起個名字,例如3rd.jar→將所有的第三方jar包全部復(fù)制黏貼到這個包下面:
2.復(fù)制黏貼所有第三方j(luò)ar包:
3.這個時候,僅僅是將這個新建的Folder添加到Build Path中去,復(fù)制過來的3rd.jar還是沒有添加進(jìn)去的,這時,選中3rd jar文件下面的所有第三方jar包,右鍵→Add to Build Path:
```我們看看這里發(fā)生了什么變化:
為了區(qū)別之前的,我在這里clean一下。
結(jié)果:成功,success!
==================================================================================================================
總結(jié):
其實(shí)這個問題的核心是:有沒有將第三方jar包添加至新apk文件的Build Path中去。
什么是Build Path?其實(shí)在這里(Android Project最后構(gòu)建成apk文件)顧名思義,就是最后apk文件構(gòu)建的資源在該項(xiàng)目中存放的路徑。結(jié)合這里的實(shí)際情況,在正確的Order and Export選項(xiàng)卡里面,默認(rèn)勾選了3個路徑:src、gen和我們自定義的3rd jar,這就表示,我們的3rd jar包將會直接構(gòu)成最后的apk文件(部分還是全部?)。
我們結(jié)合Order and Export選項(xiàng)卡的注釋來看下:構(gòu)建class文件路徑的順序和導(dǎo)出條目,導(dǎo)出的條目對依賴的項(xiàng)目有效。
我們電腦上的Eclipse IDE開發(fā)環(huán)境是配置了本地的JDK環(huán)境的(環(huán)境變量classpath),我們將已經(jīng)為Eclipse配置好的JDK環(huán)境當(dāng)做第一方,我們?yōu)榈诙?,那?/span>3rd.jar就是第三方了。(不知道正確與否,我是這么理解的)
在Eclipse上開發(fā)當(dāng)前項(xiàng)目的時候,我們默認(rèn)依賴的是本地JDK環(huán)境里面的工程(這里的工程就是一個個的jar文件),如果要引入第三方(工程)jar的話,必須要添加額外的jar文件(工程文件),保證能通過編譯,也就是當(dāng)前項(xiàng)目沒有紅叉叉,允許你去run。
當(dāng)當(dāng)前項(xiàng)目構(gòu)建好(Build)apk文件(project)后,我們用模擬器去運(yùn)行。請注意這時候環(huán)境開始發(fā)生了微妙的變化,現(xiàn)在當(dāng)前的運(yùn)行環(huán)境是Android SDK的dalvikvm(而不是為Eclipse配置的本機(jī)JRE環(huán)境,那是一般的Java項(xiàng)目的運(yùn)行環(huán)境,我們現(xiàn)在是Android
Project)。對于dalvikvm來說,apk是它的一個project;同理,在Eclipse開發(fā)過程中,當(dāng)前項(xiàng)目明顯是它的一個project(Android Project),額外引用的3rd.jar包也是它的一個project。在項(xiàng)目的開發(fā)階段,我們自己的當(dāng)前項(xiàng)目依賴了3rd.jar,在項(xiàng)目構(gòu)建成apk文件(project)的時候,如果我們不將3rd.jar這個工程設(shè)為Exported(讓依賴當(dāng)前Android
Project的apk project也能依賴3rd.jar)。在apk文件運(yùn)行時,當(dāng)apk運(yùn)行到需要依賴3rd.jar流程的時候,dalvikvm環(huán)境無法訪問3rd.jar project中的class文件,自然就會報錯。
依賴關(guān)系分析:
在實(shí)際運(yùn)行的時候:apk project依賴我們開發(fā)的Android Project,而Android Project又依賴3rd.jar project,相當(dāng)于apk project間接依賴3rd.jar project,這種間接關(guān)系應(yīng)該是不能自動傳遞的,需要進(jìn)行手動設(shè)置,也就是在構(gòu)建apk project的時候,把3rd.jar project設(shè)為Exported,讓它可以被apk project間接依賴,當(dāng)然apk
project是直接依賴Android Project的。
第二種方法完全就是將3rd.jar project和Android project一起構(gòu)建(打包)成apk project,然后部署(安裝)在dalvikvm中運(yùn)行,其實(shí)也是相當(dāng)于在dalvikvm運(yùn)行環(huán)境中直接添加了一個3rd.jar。
通過文件的大小分析,我們發(fā)現(xiàn)第一種export的方式比第二種直接構(gòu)建的方式構(gòu)建成的正常apk文件要小一些。具體是:第一種方法正常情況下apk文件大小306KB;第二種方法下正常情況下apk文件大小334KB。apk異常情況時大小是295KB。3rd.jar的大小是33.7KB。我也不知道具體原因,猜測是進(jìn)行了“結(jié)合編譯”,也就是將Android Project和3rd.jar project在編譯的時候結(jié)合起來,比如去掉相同的地方,從而構(gòu)建成apk project;或者是“有效編譯”,也即是只將3rd.jar中有效有用的部分整合到Android Project中去,然后構(gòu)建成apk project。本人也只是菜鳥一只,只能這樣猜想一下,憑目前的知識水平,還不知道到底是怎么回事,也不知道如何去驗(yàn)證,如有高手能賜教一二的話,不勝感激。當(dāng)然由于本人的水平有限,本文中的語言和詞匯肯定有表述不當(dāng)?shù)牡胤?,大家自己辨別了,這只是我的個人理解。建議大家無論什么時候都不要盡心他人言,官方的文檔才是你最堅(jiān)實(shí)后盾。
我們假如官方文檔是100分,完美的;我們的原作者是一個技術(shù)大牛,能學(xué)到95分;然后在他的書或者文章中,由于翻譯寫作表述等因素限制,可能能將80分的內(nèi)容表述清楚;然后我們讀者在閱讀學(xué)習(xí)的時候,由于個人的理解能力和方式差別,能得到60分就很不錯了。在這個過程中,如果僅僅只是只是數(shù)量上的減少還可以接受,但是知識都是一環(huán)扣一環(huán)的,前面的理解不到位或者錯誤將會一直誤導(dǎo)后面的學(xué)習(xí)和理解。所以我還是建議大家盡量去看相對權(quán)威、準(zhǔn)確、規(guī)范的官方文檔,別人的二手甚至N手資料只能當(dāng)一個引導(dǎo)作用,切不可全信。