Eclipse迁移到Studio遇到的那些坑
为啥要迁移
话说Android studio出来已经很长一段时间了,也知道用起来很爽,但是就是懒,不想对公司的项目做很大的变动。可是后来发现,继续用Eclipse真的很不方便,studio有很多的优势所在,下面列举出一二:
- Android studio是Goggle官方专门为android打造的一款编辑器,其中内置了很多的插件,比如svn,git等等。
- 编写布局文件的可视化,极大的方便我们的开发。如果选择PreView All Screen Size,编译器将会展现所有Nexus系列不同屏幕大小的手机。简化了我们的适配工作。
- 编码的会比Eclipse快捷很多,智能提醒功能,自动补全功能,都能极大的提高我们平时的开发效率。
- 清晰的界面显示,让我们体验着编写代码的快感。
- 当然最重要的一点,国外很多大牛都已经迁移到studio的阵营中去了,很多开源的框架下载下来总是要做一些处理,很不方便。所以使用studio间接的提高了我们的学习效率。
最主要的是android studio已经是大势所趋,很多优秀的android开发者已经投入到这个大平台了,如果你继续使用eclipse,感觉就像和大环境分离了一样,很难提升自己的技术层次。
痛苦的迁移经历
刚开始的时候,我并不是通过export project,生成build.gradle文件的。我是将Eclipse中的代码,布局文件,资源文件一点一点的复制的。因为之前从github中下载一些库的时候,也是将studio中的文件复制下来的,搞多了就习惯了,也很快。但是公司的项目并不像demo,里面有很多的业务逻辑,搞了我一天,终于将所有文件都复制过来了。其中的依赖库也很简单,直接studio中添加一个Module就行了,然后file->Project Structure->Dependencies->再点旁边的+号,再点Module dependency就行了。
但事实并不是这么简单。要知道android studio的目录结构和Eclipse的目录结构不一样,特别是后来,图片文件专门用mipmap文件夹来盛放,真的是很恶心啊。项目里面的所有动态设置图片的代码都将运行不了。而且,Gradle编译一直出错,找不到R文件,问题就是资源布局出现了问题。所以就放弃这种方式了。最后我在好好的在网上找了很多篇博客,看了下。再通过Eclipse export的方式最终成功的迁移了。
遇到的一些坑
通过eclipse导出build.gradle文件的方式来导出,确实还是有优点的,前提是并不破坏,eclipse原有的目录结构,然后android studio也可以运行,这就意味着,同一个项目组的成员,既可以选择Eclipse也可以选择studio作为他们的开发工具。但是也不是一番如意的。下面就列举我遇到的一些问题和坑,希望能够帮助遇到这些情况的同行们:
1.生成build.gradle文件的时候要同时选中依赖库项目,这样,eclipse会同时为他们生成.gradle文件和所需要的一些配置文件。
首先,右键点击项目选择Export导出项目
点击Generate Gradle build files,然后会出来一大段长的英文不用管他,直接点确定就好。
接下来一定要选中自己的项目和依赖库。底下的选择框说的是,如果已经存在的build.gradle文件,将会复写一次,勾选就行了。最后finish,项目里面就会有build.gradle文件了。
2.在导入之前,还有一些工作要做的。不然的话到直接导入失败。首先要明确的是,我们在Android Studio导入的是原来Eclipse的工作区间,而不是我们的项目。然后,在我们的区间中,找到gradle文件夹。workspace->gradle->wrapper->gradle-wrapper.properties中修改下。
把gradle版本更改成你所下载的版本。至于,怎么知道,可以通过之前的Andriod studio工作区间里面去查看。然后,到项目里面把build.gradle中的buildToolsVersion 更改成自己电脑下载最新的”23.0.2”,这个是我本地的版本号。还有个地方是workspace中的build.gradle文件也要修改下。
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath ‘com.android.tools.build:gradle:1.3.0’
}
}
关于这个版本号,你应该设置为多少也很简单,自己新建一个工作区间,然后点击工作区间的build.gradle的这个这个版本号就行了,因为这些属性都是你本地的设置。之前导出的是Eclipse的设置,两者是不一样的。这么多设置好了之后,就可以导入了。
注意的是,studio导入的是已经存在的studio项目。
导入之后,gradle会提醒你要求的版本是1.10.而你本地的是2.4.0.(比如),我们选择2.4.0本地的,因为是我们刚才设置的。如果底下的运行按钮是亮着的,那么恭喜你,已经导入成功了,接下来我们进入第三步…
3.到了这步,已经完成了百分之五十了。刚导入进来,肯定会包R文件缺失,这是正常的。如果没出现那就不正常的。至于R文件为什么会缺失,是因为gradle未能成功编译,大多情况下都是资源文件出错导致。因为是eclipse项目导入的,所以没有mipmap目录结构,所以布局文件中不可能是引用不到图片而出错。很多情况都是图片资源出错,相信你看到这里的时候一定遇到这个错误吧:libpng warning: iCCP: Not recognizing known sRGB profile that has been edited。这个异常出现的原因是我们错误的将.jpg文件格式的文件写成了.png。那你可能好奇,为什么eclipse不报错了。因为eclipse有容错机制,而android studio对着方面要求很严格。还有错,我没有记录下来,就是.9图片的错,我们一般重新弄下就好了,出错的原因是没有按照他们官方的来绘制,一般左边和上面控制了拉伸区域就应该没多大问题了。
等你把所有不合格的图片都修复了之后,再用gradle编译下,可能出现这个错。Error:(26, 9) Attribute application@icon value=(@drawable/logo) from AndroidManifest.xml:26:9
Error:(28, 9) Attribute application@theme value=(@style/ThemeActionBar) from AndroidManifest.xml:28:9
is also present at XXXX-trunk:XXXXLib:unspecified:15:9 value=(@style/AppTheme)
Suggestion: add ‘tools:replace=”android:theme”‘ to element at AndroidManifest.xml:24:5 to override
Error:Execution failed for task ‘:XXXX:processDebugManifest’.
Manifest merger failed with multiple errors, see logs
很多这种类似的错,我没有完全记录下来,很明显看到mutiple这个字眼就是清单文件标签重复的问题,看到网上很多的解决方案,都没有奏效。其实出现这个错的原因是库文件的某些设置和我们的项目设置冲突了,所以把库文件中的清单文件的标签全删了,甚至把清单文件给删了都没事。还有什么权限重复啊等等,根据gradle提示去一一排除修复即可,那些都是很简单的错误。
接下来有个错,是我的jar文件的问题,不知道什么原因我的httpmime.jar和jdom.jar会报如下错误:Duplicate files copied in APK META-INF/DEPENDENCIES File 1: httpmime-4.3.2.jar File 2: jdom.jar,说这两个文件重复了,但是我并没有在依赖库中添加这两个jar包。后来查阅了很多博客,有的说是google自己的问题,有的说没有遵守META-INF的协议,最终添加了以下代码就正常编译了,(更多的解决方式可以点击这篇文章):
最后一个坑就是Jar包和.so文件和依赖库的导入问题。你可以通过我之前提过的,通过Project Structure进行添加,也可以自己在build.gradle文件中写,很简单的:
dependencies {
//添加libs文件夹下的所有jar包
compile fileTree(dir: 'libs', include: '*.jar')
//添加libs文件夹下的所有.so文件
compile fileTree(dir: 'libs', include:'*.so')
//添加依赖库
compile project(':xxxxxxx')
}
到这里终于我们的项目编译通过了,当项目在运行起来的时候也是一种欣慰啊。最后希望能够帮助到有需要帮助的人。