Android合并項目的一些坑

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>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容