? ? ? ?之前也處理過(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)目

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

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ò)了而已)

注釋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包).
以上