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
用来关闭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>