Eclipse中使用multidex解決分包

? ? ? ?之前也處理過(guò)android方法數(shù)超出65536的問(wèn)題,不過(guò)當(dāng)時(shí)著急,沒(méi)有采用分包的解決方式,直接在需要使用到j(luò)ar包的時(shí)候,動(dòng)態(tài)加載,原理主要是DexClassLoader。這次這個(gè)問(wèn)題又報(bào)出來(lái)了,沒(méi)辦法,正好時(shí)間充裕,就研究研究這個(gè)分包。

? ? ? ? android官方有分包的方案,即android-support-multidex.jar,本文,主要講的是怎么在Eclipse上面使用這個(gè)jar。

? ? ? ? 網(wǎng)上有太多文章了,可是,我看了絕大多數(shù)的,都并沒(méi)有讓我的Eclipse成功產(chǎn)生一個(gè)包。整個(gè)過(guò)程分為下面幾步:

1,安裝Gradle

2,Eclipse安裝Gradle插件

3,Eclipse導(dǎo)出Gradle項(xiàng)目(會(huì)生成build.gradle等文件)

4,Config項(xiàng)目(Eclipse右擊,如果已經(jīng)是gradle項(xiàng)目,就沒(méi)有這個(gè)Config)

5,配置gradle

6,配置multidex

7,遇到的問(wèn)題

詳細(xì)內(nèi)容如下:

1,安裝Gradle

? ? ? ? 我本來(lái)以為安裝軟件嘛,肯定得新的,新的肯定解決了舊版本不少bug,所以興沖沖的下載了3.4,結(jié)果,maven里面還沒(méi)到這個(gè)版本,導(dǎo)致,后面的Config步驟走不通。最終,我在下載了五個(gè)版本的gradle后,發(fā)現(xiàn)2.14.1版本,能夠解決問(wèn)題(選擇版本很重要,安裝過(guò)程很無(wú)腦)

2,Eclipse安裝插件

? ? ? ? ?我記得我下載的地址是:http://download.eclipse.org/buildship/updates/e46/releases/1.0

Eclipse里面->Help->Install New SoftWare,輸入這個(gè)地址,就可以下載啦(插件不難,需要翻墻)

3,Eclipse導(dǎo)出Gradle項(xiàng)目

? ? ? ? ?安裝完插件后,我們重啟下eclipse就可以看到,原先的項(xiàng)目,右擊,Export,里面會(huì)多一個(gè)選項(xiàng):Generate Gradle build files.然后一直繼續(xù),有一個(gè)地方,需要你Force overriding of existing files。然后你的項(xiàng)目里面,就多出來(lái)一些文件build.gradle等文件(零要點(diǎn))

4,Config項(xiàng)目


Configure

如果這個(gè)時(shí)候直接config(上圖就是我說(shuō)的config),eclipse會(huì)去下載一些gradle-all的包比如:


Eclipse正在下載

eclipse里面下載的速度,不知道為啥,特別慢,而且這個(gè)包的版本,和我們的也不是很符合,需要我們先把項(xiàng)目里面的gradle文件夾下面的wrapper文件夾下面的gradle-wrapper.properties里面的distributionUrl修改下改成2.14.1-all。然后config,會(huì)很慢,或者你現(xiàn)在可以去我們的Gradle安裝目錄下面E:\gradle-2.14.1\wrapper\dists

可以看到eclipse正在下載這個(gè)版本的內(nèi)容,我的eclipse速度慢,我就直接把這個(gè)all.zip在瀏覽器中下載,然后直接拷貝到這個(gè)文件夾(E:\gradle-2.14.1\wrapper\dists\gradle-2.14.1-all\9ossqmv60fyibylheubs4isy9)里面去,然后解壓。再去config,就不需要下載了。

這個(gè)時(shí)候,我這邊會(huì)出現(xiàn)一個(gè)問(wèn)題,提示版本不匹配,原因是,我的項(xiàng)目里面的build.gradle里面的classpath'com.android.tools.build:gradle:0.12.+'或者比這個(gè)大

我改成classpath'com.android.tools.build:gradle:2.1.+'就好了。修改完后,重新config會(huì)在E:\gradle-2.14.1\caches目錄下,創(chuàng)建一個(gè)modules-2文件夾,里面會(huì)下載很多東西,這個(gè)過(guò)程很漫長(zhǎng)。(小插曲)

這樣完了以后,我們的項(xiàng)目就變成gradle項(xiàng)目了,經(jīng)過(guò)我的嘗試,這個(gè)時(shí)候,如果報(bào),這個(gè)項(xiàng)目不是主項(xiàng)目錯(cuò)誤,那么就把目前的項(xiàng)目都關(guān)閉掉,然后重新import 項(xiàng)目(gradle項(xiàng)目),我在這個(gè)時(shí)候,出現(xiàn)了原先的項(xiàng)目全部變成了java項(xiàng)目這樣的問(wèn)題,別著急,關(guān)閉項(xiàng)目,再import一次android 項(xiàng)目,就全部正常了。(這兒的問(wèn)題又多又煩)

5,我曾經(jīng)天真的以為,這樣以后,就可以直接run項(xiàng)目了,我的分包問(wèn)題就解決了。。。圖樣!

你這個(gè)是使用eclipse的run as Android Application和我們沒(méi)有安裝插件,是一樣的。

得使用另外一種run的方式,在你的Eclipse->Window找到GradleTasks里面找到你的項(xiàng)目

右擊你的項(xiàng)目Open Gradle run Configurations


會(huì)進(jìn)入一個(gè)配置頁(yè)面


Gradle Task里面輸入一個(gè)命令:clean (或者再加一個(gè)assemble)然后點(diǎn)擊ok就可以了

然后在你的eclipse的項(xiàng)目里面右擊項(xiàng)目 Run as->run configurations,


找到我們的項(xiàng)目(上圖中,clean(清理) 后面可以接一個(gè)assemble(打包)),直接run。如果一切正常,那么,就會(huì)在我們項(xiàng)目目錄下面產(chǎn)生一個(gè)build文件夾,build\outputs\apk這個(gè)路徑下面,會(huì)多三個(gè)包xxx-debug.apk就是我們運(yùn)行的包。

當(dāng)然,我是遇到了問(wèn)題的,run后,報(bào)這個(gè)錯(cuò)誤:

Could not find tools.jar. Please check that C:\Program Files\Java\jre1.8.0_45 contains a valid JDK installation.

這個(gè)時(shí)候就需要我們?cè)趓un之前做一個(gè)配置,上圖中,的JAVA HOME


我改成這樣,再運(yùn)行就成功了。

如果我們大家的項(xiàng)目能這么簡(jiǎn)單的搞定,就沒(méi)有必要寫(xiě)這個(gè)文章了。(有司機(jī),這段路不崎嶇)

6,配置分包

關(guān)于這個(gè)配置,網(wǎng)上太多了,我也拷貝了一份,如果你已經(jīng)配置好,就直接跳過(guò)吧

(1)我們自定義的Application需要繼承MultiDexApplication,或者在oncreate里面調(diào)用MultiDex.install(this)。

(2)需要添加的內(nèi)容如下:

dependencies {

? ? ? ? compile 'com.android.support:multidex:1.0.0'

}

android {

? ? ? ? compileSdkVersion 20

? ? ? ? buildToolsVersion "23.0.1"http://這個(gè)地方如果是20.0.0,就會(huì)報(bào)下面的錯(cuò)誤


? ? ? ? configurations{

? ? ? ? ? ? ? ?all*.exclude group: 'com.android.support', module: 'multidex'

? ? ? ? ?}

? ? ? ? defaultConfig {

? ? ? ? ? ? ? ? ? minSdkVersion 9

? ? ? ? ? ? ? ? ? targetSdkVersion 19

? ? ? ? ? ? ? ? ? multiDexEnabled true

? ? ? ? }

? ? ? ?dexOptions {

? ? ? ? ? ? ? ?preDexLibraries = false

? ? ? ? ? ? ? ?javaMaxHeapSize "2g"http://(后面會(huì)解釋這行的意義)注釋1

? ? ? ? }

? ? ? ? lintOptions {

? ? ? ? ? ? ? ?checkReleaseBuilds false

? ? ? ? ? ? ? abortOnError false//(后面會(huì)解釋這行的意義)注釋2

? ? ? ? ? }

? ? ? ? ?afterEvaluate{

? ? ? ? ? ? ?tasks.matching{

? ? ? ? ? ? ? ? ? ? ? ?it.name.startsWith('dex')

? ? ? ? ? ? ?}.each{dx->

? ? ? ? ? ? ? ? ? ? ? ?if(dx.additionalParameters == null) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? dx.additionalParameters= ['--multi-dex']

? ? ? ? ? ? ? ? ? ? ? ?}else{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?dx.additionalParameters+= '--multi-dex'

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ?}

? ? ? }

}(網(wǎng)上一堆堆)

注釋1:如果不加,大一點(diǎn)的項(xiàng)目,assemble的時(shí)候,會(huì)內(nèi)存溢出,你看到的現(xiàn)象是,項(xiàng)目在不停的反復(fù)的沒(méi)完的Launching delegate,最終導(dǎo)致內(nèi)存溢出(加大為2g后。。。不會(huì)報(bào)錯(cuò)了而已)


Launching delegate

注釋2:assemble項(xiàng)目過(guò)程中,遇到的一些lint錯(cuò)誤,就會(huì)中斷打包,加上這個(gè),就可以了,直到打包完成


其實(shí)到這里,項(xiàng)目使用Android Studio打開(kāi),已經(jīng)可以run了,可是,Eclipse不行,他有他的任性。

7,遇到的問(wèn)題

我們來(lái)講講Eclipse的support-v4,太煩人

我們的項(xiàng)目,會(huì)引用一些開(kāi)源框架,比如說(shuō)silding_menu_library,這個(gè)開(kāi)源項(xiàng)目里面,就包含了support-v4的jar包,然后我們主項(xiàng)目,也有這樣的jar包,或者,還有別的需要引用的,也包含這個(gè)jar。那么問(wèn)題來(lái)了。當(dāng)我們assemble的時(shí)候,會(huì)報(bào)包沖突。部分截圖如下


意思就是,你那么多項(xiàng)目,都有這個(gè)jar包,我打包的時(shí)候,沖突了重復(fù)了。

然后,我就去百度,發(fā)現(xiàn)好多人啊,好多人遇到這個(gè)問(wèn)題。解決方案缺很單一,無(wú)非是exclude例如all*.exclude group: 'com.android.support', module: 'support-v4'

我沒(méi)有去Android Studio上面去測(cè)試了,我只是在Eclipse上面測(cè)試,發(fā)現(xiàn),并沒(méi)有什么用。

該沖突還是沖突。最終(真累,好幾次想要放棄,畢竟Android Studio已經(jīng)可以運(yùn)行了),解決方案是,改用provided,如下:

silding_menu_library里面的build.gradle這樣配置dependencies

compile fileTree(dir: 'libs', exclude: ['android-support*.jar'], include: '*.jar')

provided files("libs/android-support-v4.jar")

含義就是編譯的時(shí)候,編譯support-v4包,但是打包的時(shí)候,不要support-v4。

至此,我的大一點(diǎn)的項(xiàng)目,也可以assemble了。從安裝gradle到最終assemble,花了3天。(這一段,是重點(diǎn))

補(bǔ)充:1,failed to find Build Tools revision 21.0.0 修改buildToolsVersion "21.0.0"

2,cannot resolve external dependency com.android.support:mutidex,將extra里面下載一下(保證sdk\extras\android\support\multidex\library\libs目錄下,有android-support-multidex.jar包).

以上

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,753評(píng)論 25 709
  • Android Studio正式版早已經(jīng)發(fā)布了,默認(rèn)使用Gradle構(gòu)建,GitHub上80%的Android項(xiàng)目...
    流哲羽閱讀 3,020評(píng)論 1 13
  • 時(shí)間不緊不慢的流逝,你到這個(gè)世界已經(jīng)21天了。 每天都會(huì)給我們帶新的驚喜。 你逐漸的適應(yīng)著這小小的房子,小小的床。...
    mao眼閱讀 231評(píng)論 0 2
  • 一起當(dāng)過(guò)兵的叫戰(zhàn)友,一起跳舞的叫舞友,一起打麻將的當(dāng)然叫麻友啰! 因?yàn)槠綍r(shí)工作之余喜歡搓二把,所以我的麻友還真不少...
    梅勝雪閱讀 1,065評(píng)論 16 11
  • 人生本是一場(chǎng)修行,旅行是修行之路的眼,讓你看到世界的另一面,有人說(shuō):當(dāng)你去過(guò)的地方越多,懷著虔誠(chéng)之心去看,你就發(fā)現(xiàn)...
    一月木水閱讀 982評(píng)論 0 0

友情鏈接更多精彩內(nèi)容