? ? ? ?之前也處理過android方法數(shù)超出65536的問題鄙皇,不過當(dāng)時著急播玖,沒有采用分包的解決方式,直接在需要使用到j(luò)ar包的時候咖耘,動態(tài)加載翘簇,原理主要是DexClassLoader。這次這個問題又報出來了儿倒,沒辦法版保,正好時間充裕,就研究研究這個分包夫否。
? ? ? ? android官方有分包的方案彻犁,即android-support-multidex.jar,本文凰慈,主要講的是怎么在Eclipse上面使用這個jar汞幢。
? ? ? ? 網(wǎng)上有太多文章了,可是微谓,我看了絕大多數(shù)的森篷,都并沒有讓我的Eclipse成功產(chǎn)生一個包。整個過程分為下面幾步:
1豺型,安裝Gradle
2仲智,Eclipse安裝Gradle插件
3,Eclipse導(dǎo)出Gradle項(xiàng)目(會生成build.gradle等文件)
4姻氨,Config項(xiàng)目(Eclipse右擊钓辆,如果已經(jīng)是gradle項(xiàng)目,就沒有這個Config)
5,配置gradle
6前联,配置multidex
7功戚,遇到的問題
詳細(xì)內(nèi)容如下:
1,安裝Gradle
? ? ? ? 我本來以為安裝軟件嘛蛀恩,肯定得新的疫铜,新的肯定解決了舊版本不少bug,所以興沖沖的下載了3.4双谆,結(jié)果壳咕,maven里面還沒到這個版本,導(dǎo)致顽馋,后面的Config步驟走不通谓厘。最終,我在下載了五個版本的gradle后寸谜,發(fā)現(xiàn)2.14.1版本竟稳,能夠解決問題(選擇版本很重要,安裝過程很無腦)
2熊痴,Eclipse安裝插件
? ? ? ? ?我記得我下載的地址是:http://download.eclipse.org/buildship/updates/e46/releases/1.0
Eclipse里面->Help->Install New SoftWare他爸,輸入這個地址,就可以下載啦(插件不難果善,需要翻墻)
3诊笤,Eclipse導(dǎo)出Gradle項(xiàng)目
? ? ? ? ?安裝完插件后,我們重啟下eclipse就可以看到巾陕,原先的項(xiàng)目讨跟,右擊,Export鄙煤,里面會多一個選項(xiàng):Generate Gradle build files.然后一直繼續(xù)晾匠,有一個地方,需要你Force overriding of existing files梯刚。然后你的項(xiàng)目里面凉馆,就多出來一些文件build.gradle等文件(零要點(diǎn))
4,Config項(xiàng)目
如果這個時候直接config(上圖就是我說的config)亡资,eclipse會去下載一些gradle-all的包比如:
eclipse里面下載的速度澜共,不知道為啥,特別慢沟于,而且這個包的版本,和我們的也不是很符合植康,需要我們先把項(xiàng)目里面的gradle文件夾下面的wrapper文件夾下面的gradle-wrapper.properties里面的distributionUrl修改下改成2.14.1-all旷太。然后config,會很慢,或者你現(xiàn)在可以去我們的Gradle安裝目錄下面E:\gradle-2.14.1\wrapper\dists
可以看到eclipse正在下載這個版本的內(nèi)容供璧,我的eclipse速度慢存崖,我就直接把這個all.zip在瀏覽器中下載,然后直接拷貝到這個文件夾(E:\gradle-2.14.1\wrapper\dists\gradle-2.14.1-all\9ossqmv60fyibylheubs4isy9)里面去睡毒,然后解壓来惧。再去config,就不需要下載了演顾。
這個時候供搀,我這邊會出現(xiàn)一個問題,提示版本不匹配钠至,原因是葛虐,我的項(xiàng)目里面的build.gradle里面的classpath'com.android.tools.build:gradle:0.12.+'或者比這個大
我改成classpath'com.android.tools.build:gradle:2.1.+'就好了。修改完后棉钧,重新config會在E:\gradle-2.14.1\caches目錄下屿脐,創(chuàng)建一個modules-2文件夾,里面會下載很多東西宪卿,這個過程很漫長的诵。(小插曲)
這樣完了以后,我們的項(xiàng)目就變成gradle項(xiàng)目了佑钾,經(jīng)過我的嘗試西疤,這個時候,如果報次绘,這個項(xiàng)目不是主項(xiàng)目錯誤瘪阁,那么就把目前的項(xiàng)目都關(guān)閉掉,然后重新import 項(xiàng)目(gradle項(xiàng)目)邮偎,我在這個時候管跺,出現(xiàn)了原先的項(xiàng)目全部變成了java項(xiàng)目這樣的問題,別著急禾进,關(guān)閉項(xiàng)目豁跑,再import一次android 項(xiàng)目,就全部正常了泻云。(這兒的問題又多又煩)
5艇拍,我曾經(jīng)天真的以為,這樣以后宠纯,就可以直接run項(xiàng)目了卸夕,我的分包問題就解決了。婆瓜。快集。圖樣贡羔!
你這個是使用eclipse的run as Android Application和我們沒有安裝插件,是一樣的个初。
得使用另外一種run的方式蒂培,在你的Eclipse->Window找到GradleTasks里面找到你的項(xiàng)目
右擊你的項(xiàng)目Open Gradle run Configurations
會進(jìn)入一個配置頁面
Gradle Task里面輸入一個命令:clean (或者再加一個assemble)然后點(diǎn)擊ok就可以了
然后在你的eclipse的項(xiàng)目里面右擊項(xiàng)目 Run as->run configurations,
找到我們的項(xiàng)目(上圖中呜象,clean(清理) 后面可以接一個assemble(打包)),直接run。如果一切正常缴渊,那么钞速,就會在我們項(xiàng)目目錄下面產(chǎn)生一個build文件夾僧免,build\outputs\apk這個路徑下面禽额,會多三個包xxx-debug.apk就是我們運(yùn)行的包。
當(dāng)然弄息,我是遇到了問題的痊班,run后,報這個錯誤:
Could not find tools.jar. Please check that C:\Program Files\Java\jre1.8.0_45 contains a valid JDK installation.
這個時候就需要我們在run之前做一個配置摹量,上圖中涤伐,的JAVA HOME
我改成這樣,再運(yùn)行就成功了缨称。
如果我們大家的項(xiàng)目能這么簡單的搞定凝果,就沒有必要寫這個文章了。(有司機(jī)睦尽,這段路不崎嶇)
6器净,配置分包
關(guān)于這個配置,網(wǎng)上太多了当凡,我也拷貝了一份山害,如果你已經(jīng)配置好,就直接跳過吧
(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://這個地方如果是20.0.0,就會報下面的錯誤
? ? ? ? configurations{
? ? ? ? ? ? ? ?all*.exclude group: 'com.android.support', module: 'multidex'
? ? ? ? ?}
? ? ? ? defaultConfig {
? ? ? ? ? ? ? ? ? minSdkVersion 9
? ? ? ? ? ? ? ? ? targetSdkVersion 19
? ? ? ? ? ? ? ? ? multiDexEnabled true
? ? ? ? }
? ? ? ?dexOptions {
? ? ? ? ? ? ? ?preDexLibraries = false
? ? ? ? ? ? ? ?javaMaxHeapSize "2g"http://(后面會解釋這行的意義)注釋1
? ? ? ? }
? ? ? ? lintOptions {
? ? ? ? ? ? ? ?checkReleaseBuilds false
? ? ? ? ? ? ? abortOnError false//(后面會解釋這行的意義)注釋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的時候,會內(nèi)存溢出乌妒,你看到的現(xiàn)象是汹想,項(xiàng)目在不停的反復(fù)的沒完的Launching delegate,最終導(dǎo)致內(nèi)存溢出(加大為2g后撤蚊。古掏。。不會報錯了而已)
注釋2:assemble項(xiàng)目過程中侦啸,遇到的一些lint錯誤槽唾,就會中斷打包席镀,加上這個,就可以了夏漱,直到打包完成
其實(shí)到這里,項(xiàng)目使用Android Studio打開顶捷,已經(jīng)可以run了挂绰,可是,Eclipse不行服赎,他有他的任性葵蒂。
7,遇到的問題
我們來講講Eclipse的support-v4重虑,太煩人
我們的項(xiàng)目践付,會引用一些開源框架,比如說silding_menu_library缺厉,這個開源項(xiàng)目里面永高,就包含了support-v4的jar包,然后我們主項(xiàng)目提针,也有這樣的jar包命爬,或者,還有別的需要引用的辐脖,也包含這個jar饲宛。那么問題來了。當(dāng)我們assemble的時候嗜价,會報包沖突艇抠。部分截圖如下
意思就是,你那么多項(xiàng)目久锥,都有這個jar包家淤,我打包的時候,沖突了重復(fù)了奴拦。
然后媒鼓,我就去百度,發(fā)現(xiàn)好多人啊错妖,好多人遇到這個問題绿鸣。解決方案缺很單一,無非是exclude例如all*.exclude group: 'com.android.support', module: 'support-v4'
我沒有去Android Studio上面去測試了暂氯,我只是在Eclipse上面測試潮模,發(fā)現(xiàn),并沒有什么用痴施。
該沖突還是沖突擎厢。最終(真累究流,好幾次想要放棄,畢竟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")
含義就是編譯的時候厘惦,編譯support-v4包偷仿,但是打包的時候,不要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包).
以上