Android合并項目的一些坑
最近要把一些公司以前的項目(eclipse)作為module合并到一起
發現一些問題,寫下文檔來幫助自己記憶.也以便以后翻閱
先放一篇大神的總結:Android開發各類常見錯誤解決方案
坑一
多個Module依賴同一個jar的解決方法 :
將任意一個Module中的jar依賴為compile files('your jar name'),
其他需要依賴的地方改為provided files('your jar name')并且刪除compile fileTree(include: ['*.jar'], dir: 'libs) 即可。
「jar需要復制到需要用到的module libs文件夾下」
下面詳細介紹為什么這樣做以及案例
===============分割線===============
AndroidStudio中Module相當于Eclispe中的Library,
這里不做過多介紹 多個Module依賴同一個jar,
直接把jar放入對應需要的Module會導致編譯報類沖突
這里就要講一講AndroidStudio中的依賴的幾種方式
compile
是對所有的build type以及favlors都會參與編譯并且打包到最終的apk文件中。
Provided
是對所有的build type以及favlors只在編譯時使用,類似eclipse中的external-libs,只參與編譯,不打包到最終apk。
APK 只會打包到apk文件中,而不參與編譯,所以不能再代碼中直接調用jar中的類或方法,否則在編譯時會報錯
Test compile
僅僅是針對單元測試代碼的編譯編譯以及最終打包測試apk時有效,而對正常的debug或者release apk包不起作用。
Debug compile
僅僅針對debug模式的編譯和最終的debug apk打包
Release compile
僅僅針對Release 模式的編譯和最終的Release apk打包。
我們需要用的是Provided,這樣在寫代碼的時候可以在Module中正常使用jar中的類,
但是要有一個Module以compile的方式依賴這個jar,這樣編譯的時候只有一個jar編譯進apk。
注:使用Provided必須刪除compile fileTree(include: ['*.jar'], dir: 'libs') 不然lib下的jar均按照compile方式引入到Module
</br>
坑二</br>
報錯:Error:Execution failed for task ':ProjectName:mergeDebugResources'. > Crunching Cruncher some file or .9.PNG failed, see logs:
在build.gradle里添加以下兩句:
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
sample.png
用來關閉Android Studio的PNG合法性檢查的,直接不讓它檢查。
還是不行的話就把報錯那張圖片刪除重做吧
</br>
坑三
報錯:FATAL EXCEPTION: main
java.lang.NoSuchFieldError: No static field left_arrow of type I in class
Lcom/yourprojectname/R$id; or its superclasses (declaration of 'yourprojectname.R$id'
appears in /data/data/yourprojectname/files/instantrun/dex/slice-slice_9-classes.dex)
起因:文件名沖突,R文件存在多個同名id引發錯誤
解決方法:
其他module和APP module引用的xml布局文件同名,有可能導致后面的題庫module會引用報錯
所以盡可能把module的xml文件名改為與APP module的不一樣就解決了.
例如:一般都會有的activity_main,把module的activity_main改成activity_othername
</br>
坑四
一些方法過時,或者一些包已經不能用了
GOOGLE吧,然后把過時的方法修改回來,然后重新添加一些包
還有就是其他module的View 的點擊事件不能用try catch , 要注意了
</br>
坑五</br>
</br>
一些自定義的組件記得去布局文件里面修改包名哦~
</br>
坑六</br>
修改了Android項目的最小SDK版本之后出現很多stysle文件找不到
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.example.name"
minSdkVersion 14
targetSdkVersion 23
}
compileSdkVersion 是多少版本的
那么compile 'com.android.support:appcompat-v7:23.2.1’ 就是啥版本的。
</br>
坑七
Android studio 編譯問題:finished with non-zero exit value 2
報錯:Error:Execution failed for task ':androidShopNC2014Moblie:transformClassesWithDexForDebug'.
>
com.android.build.api.transform.TransformException:
com.android.ide.common.process.ProcessException:
java.util.concurrent.ExecutionException:
com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException:
Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java''
finished with non-zero exit value 2
解決方法:(這個錯誤在app的build.gradle里面添加下面這句就好了。)
android {
defaultConfig {
multiDexEnabled true
}
}
</br>
坑八
Error:Execution failed for task
':app:transformClassesWithJarMergingForDebug'.>
com.android.build.api.transform.TransformException:
java.util.zip.ZipException:
duplicate entry: org/apache/http/ConnectionClosedException.class
解決方法:
這個是在我們啟動的時候報錯的,而不是在編譯的時候,
原因是存在了相同庫或者庫中的類名沖突了
stackoverflow上有人也提了這樣的問題。
只需要刪除其中的一個就可以解決了。
</br>
坑九
打包APK的時候出現沖突的錯誤:
Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'
解決方法:
1 , 刪除相同包
2 , 請參考這個:stackoverflow上的一個回答
3 , 還有這個:AndroidStudio中包沖突問題(使用解析和Multidex重復條目 </br>