【踩坑速記】二次依賴?android studio編譯運行各種踩坑解決方案,杜絕彎路,總有你想要的~


這篇博客,只是把自己在開發中經常遇到的打包編譯問題以及解決方案給大家稍微分享一下,不求吸睛,但求有用。

1、大家都知道我們常常會遇到dex超出方法數的問題,所以很多人都會采用android.support-multidex進行解決,但是你也許會遇到下面這樣的錯誤,不由得讓你冥思苦想,這個出錯原因一般是引入了多個相同的包,但是你打開一開,libs下明明就只有一個包呀,讓人頭疼。

Error:Execution failed for task ':app:packageAllDebugClassesForMultiDex'.

> java.util.zip.ZipException: duplicate entry: android/support/multidex/MultiDex.class

解決方案如下:首先刪掉libs下面的jar包,並解除依賴,然后在gradle腳本中,加入compile 'com.android.support:multidex:1.0.1'


(當前最新版本是1.0.1),順利解決。

 

2、相信下面這個問題也比較常見,至少樓主遇到很多次了,前面沒做筆記,搞的每次都要重新去理解,所以這個問題必須總結一下,雜一看又是v4包重復了。

* What went wrong:
Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: android/support/annotation/ColorRes.class

具體解決方案為:由於很多第三方包都會用到v4支持包,這樣在你導入多個支持的時候難免會出現這樣的錯誤,只需在build.gradle里面添加上

configurations {

  all*.exclude group: 'com.android.support', module: 'support-v4'

}

然后clean一下工程再build就好。記住必須先clean,不然還是無法解決!!

 

3、如果重復的包你並不知道是哪里重復了怎么辦?比如這個:

Java.util.zip.ZipException: duplicate entry: com/nineoldandroids/animation/Animator$AnimatorListener.class

這個問題是由於添加的第三方項目依賴中,有多個項目同時依賴了nineoldandroids這個動畫庫的原因,多出現在as用項目構建工具gradle構建項目的時候。

最簡單的解決方法:

在as左側選擇project后,在左側項目列表中展開external libraries,這里面是gradle為你自動下載好的jar包,依次點擊展開依賴的項目,並在其中的classes.jar下找到重復的com.nineoldandroids包,手動delete即可,最后留下一個即可。

 

 

 

4、什么?這還不夠狠?給你來個更能節省找問題時間的。大家都知道我們在android開發過程中或多或少會引入module,不僅可以提高項目的開發進度,而且項目管理起來也會相當方便。

但是!!!!你可能會遇到在同一個項目中引入多個module,而這些module又因為引入了同一個jar包或者有沖突的jar包的時候,這樣你可能可以通過編譯,但是你打包apk會直接報錯有木有?如果你一個是module,一個是直接在app下的build.gradle添加的依賴,打包時候看到二次引入,你估計會想:什么?二次引入?你可能根本丈二的和尚摸不着頭腦,因為也許你依賴了很多三方的東西,而你竟然不知道哪個用了這個jar包導致了這個異常,的確讓人心力交瘁,藍瘦香菇。

 

在解決問題之前,我還是想在這里多說幾句,說下關於module的集中依賴的區別,如果想直接看解決方案的請跳:

1) compile:它是對所有的build type以及favlors都會參與編譯並且打包到最終的apk文件中。

2) provided:它是對所有的build type以及favlors只在編譯時使用,類似eclipse中的external-libs,只參與編譯,不打包到最終的apk。

3)   apk:只會打包到apk文件中,而不參與編譯,所以不能在代碼中直接調用jar中的類或者方法,否則編譯時報錯。

4) test compile:它僅僅是針對單元測試代碼的編譯以及最終打包測試apk時有效,而對正常的debug或者release apk包不起任何作用。

5) debug compile:它僅僅針對debug模式的編譯和最終的debug apk打包。

6) release compile:僅僅針對release模式的編譯和最終的release apk打包。

 

回歸正題,這樣的解決方案是什么:

直接看打包的錯誤打印,找到module中這個二次引入的jar包,把compile更改為provided,這樣在寫代碼的時候可以在所屬的module中正常使用jar包中的類,而生成的apk不會包含該jar包。這樣在編譯的時候由於只有一個jar包編譯進apk,便不會發生上面所說的二次引入的沖突錯誤了。

 

【注】使用provided必須刪除compile fileTree(include: ['*.jar'], dir: 'libs') 不然lib下的jar均按照compile方式引入到Module。

 

還是來個例子:我在項目中用了一堆堆的compile,而由於集成了環信的easeui,又因為其使用了glide的jar包,所以導致我在release的時候,glide發生了沖突,所以我采用了上面的解決方案,得到了成功解決。下面是easeui的build文件。我把glide換成了provided。

 

今天就先講到這里,后面會持續更新,幫大家踩坑,持續關注吧~

 

————————————————————————————————————————————————————————————

2016/12/07補充

今天遇到一個導入一個新庫的時候出現異常

java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader[DexPathList[[dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-support-annotations-25.0.1_90941a77b2b94e164136c426d140cfe0713579d1-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_1-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_0-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-rxjava-1.2.0_870337658ae259b4e95c589b707604c2e552ee88-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-retrofit-2.1.0_02cdaa5f093e78b272a8b951b62057cb62740b8d-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-picasso-2.5.2_2428dbd5eabf65ae69bc01abd6e4b72d08e545aa-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-parse-android-1.13.0_4515c5f93c9f181f78d21e114c731820c9c0999c-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-org.apache.http.legacy_e4a662e38e87ba9aba584fba71c26d677575fa22-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-okio-1.9.0_db0545b090bbd931e1cf6e43202e038727277a7d-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-okhttp-3.4.1_a3a718343956c6e4d917a53a4fdd4a4dc134cda5-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-mobAPI-1.0.6_52db92710d9ddfc179b67c21c9dd1fd75c5359b0-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-me.zhanghai.android.materialprogressbar-library-1.3.0_d3d39d36af179081bbaa70f93cbbf294916d6a68-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-me.xiaopan-assemblyadapter-2.2.0_73b132544aaa40f14e5060f665680f347bb97de3-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-me.wangyuwei-ParticleView-1.0.5_4ae89dcc85783878dcc540643b6bdee7b4a10901-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-library-2.4.0_dd460f45d27a359687729c3c169358b1eda3100b-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-leakcanary-watcher-1.5_34a203fec755c3a4cf8b68e6158267ab4379fd5b-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-leakcanary-analyzer-1.5_1c9538df116ffddb5272c7355d65a1d2955ff7ca-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-jp.wasabeef-recyclerview-animators-2.2.3_15d3f8b560ea0845185068ede8fc16fcf2bcb304-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-io.reactivex-rxandroid-1.2.1_ce5cad2fcff3d5d6d5783b67c7bce0a6f3cd5e8c-classes.dex", dex file "/data/data/com.example.nanchen.

經過多番核查,此類錯誤一般是jniLibs庫加載的時候出現了問題,檢查發現新庫的jniLibs目錄下只有armeabi-v7a一個包,而之前項目中依賴的環信有四個包

這樣的情況解決方法兩種:因為armeabi和armeabi-v7a在一定意義上是可以直接copy的,所以第一種方法是讓新庫提供方提供支持are64-v8a和x86的so文件;另外一種就是直接刪掉之前的arm64-v8a和x86包,不過這樣有風險,一旦遇上這樣的手機會很難受~

 

 

————————————————————————————————————————————————————————————

2017/01/13補充

下面這個錯誤也經常被我們遇到

Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed with multiple errors, see logs

原因是導入的庫在build.gradle中的minSdkVersion與你的應用的minSdkVersion不匹配導致的(app要求應用最小系統版本和庫要求系統最小版本不一致),改成一樣的就行targetSdkVersion

也最好改為一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM