问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

迁移一个eclipse工程到AndroidStudio有哪些坑

发布网友 发布时间:2022-04-22 21:48

我来回答

2个回答

热心网友 时间:2023-07-19 08:07

首先,我们来看一下把一个eclipse工程迁移到AndroidStudio有几种方法:
方法1:直接导入一个eclipse工程;
方法2:在eclipse中利用ADT为工程生成一个Gradle文件,AndroidStudio导入这个gradle工程;
方法3:在AndroidStudio中新建一个工程,把eclipse工程的代码、资源一点点拷过来;
1
采用哪种方法
先说结论:我采用了方法3,如果你对方法1和方法2的效果不感兴趣,可以跳过这一部分。
方法1的好处是简单,AndroidStudio的早期版本只能用方法2,现在的新版可以支持方法1,直接导入一个eclipse工程,我开始时也是试这种方法的,确实简单,导进来不需要做任何设置居然就能运行,那么问题是什么呢?问题是编译运行一次那叫一个慢呀,比eclipse还慢N倍,而且异常消耗电脑资源,我们Macbook Pro配置不算低,买来一年多风扇从来没响过,以至于我以为电脑根本没有风扇,这下是听到风扇响了,响声那叫一个大,说明这种构建项目的方式极其耗内存耗CPU,并且由于没有gradle文件,Gradle的所有特性全部用不上,我都怀疑这种编译方式用的就是ant,根本没用到gradle。
综上所述,方法1既没有eclipse快,也没有AndroidStudio的好处,看来这种方法不可取。
再来看方法2,方法2是Google官方推荐的方式,操作步骤是:先在eclipse中的工程上点鼠标右键,在弹出的菜单中选择Export...,然后在弹出的窗口中选择Android标签下的Generate Gradle build files,如下图所示:

然后按提示操作就可以在工程目录下生成一个build.gradle文件,之后我们就可以用AndroidStudio导入这个build.gradle文件了,导入的过程中会连同这个工程一齐导入,之后,就会看到导入后的工程了,如图所示:

看到了吧,整个工程还是保持eclipse中的目录结构。
右边是eclipse自动生成的build.gradle文件的内容,跟代码无关。并且只有一个build.gradle文件,没有分全局的gradle和模块的gradle,使用了很旧的Gradle版本,并且使用已经不建议的android插件,之所以工程目录没有使用AndroidStudio默认格式,而可以保持eclipse目录结构,都是因为gradle文件中的那一部分sourceSets下的配置,sourceSets的配置可以允许我们改变工程的目录组织结构,而不需要必须使用AndroidStudio的默认结构,而且build.gradle构建一直不成功。。。也是醉了。
由于存在这么多的疑问,我担心会给将来留坑,并且目录结构都不是AndroidStudio默认,我决定:放弃这种方法,采用方法3:新建一个AndroidStudio工程,把代码和资源一点一点拷过去,使用“纯粹”的AndroidStudio开发方式。
2

采用方法3把工程迁移到AndroidStudio

这种方法的过程也没什么好讲的,就是把java代码和资源文件复制粘贴到新工程的目录下就OK了,先来看一下效果,下图是我迁移完的效果:

怎么样,是不是清爽了许多,目录结构完全是AndroidStudio的格式,首先一个注意的问题就是公司以前的项目是没有用到v7包的,所以在build.gradle中注释掉这个maven引用,以免引起不必要的麻烦。
还有一点就是以前项目中是有jni代码的,但是我们的jni代码目录组织结构比较复杂,不是标准的jni目录,AndroidStudio又不是靠mk文件来配置C代码,所以还没搞定,暂时只是把so包拿过来用,C代码的编译还是在eclipse下进行,将来搞定了我再回来给大家补充。下面把我的修改过程一一讲述一下:
1、注释掉build.gradle中v7包的引用。
这个上面已经说过了,因为项目中以前没用到v7包;
2、迁移AIDL文件。
如果你的项目中没有用到AIDL,那你可以跳过这部分。在eclipse中,aidl文件是跟java文件放在同一个包下的,但是AndroidStudio要求aidl文件默认放在模块下的src/main/aidl文件夹下,并且包名要与以前在java包下的包名、路径相同。
比如以前aidl文件在com.example.mycode包下边,那么你也要在aidl文件夹下建这样一个同名的包,把aidl文件移过去,如果没有aidl文件夹,那就点右键新建一个,效果如下图所示:

--aidl目录没有就新建一个--

--aidl文件的位置摆放--
如果aidl文件摆放不正确,java中引用service的类就会报错,aidl文件默认是放在这里的,当然也可以通过配置build.gradle文件来使它们跟java代码混在一起,但是不建议这样做,我们尽量按照 AndroidStudio的默认配置来做;
3、修改AndroidManifest.xml文件
我在进行完以上步骤后尝试同步gradle配置,结果报了
Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed with multiple errors, see logs
这个错误,如下图所示

--报Manifest merger failed错误--
merger是合并的意思嘛,开始觉得很奇怪,我们工程又没有Library引用,跟谁合并呢,后来想起来build.gradle中引用了v7包,但是把v7包的引用注释掉还是不行,有网友说在manifest中使用tools:replace标签,可能这种方式只适用于Library模块引起的merger冲突,我的很显然不是这种情况;还有网友说在build.gradle的android标签下加入aaptOptions.cruncherEnabled false和aaptOptions.useNewCruncher false,开始时管了点用,后来多试几次又不行,看来也不是这个问题。
后来用了一个笨办法,一点一点注释AndroidManifest.xml中的内容,看看注释掉哪一块可以不报错,结果发现是下图中所示的原因:

--intent-filter标签是一个空标签--
上图中,我的service下配置了intent-filter标签,按理说intent-filter标签下还应该有action子标签,比如像下图这样的标准写法:

--百度定位SDK的写法是标准写法--
所以,我们要做的就是注释掉AndroidManifest.xml中service标签下的空的intent-filter标签,至少我用这种方法处理后就不再报错了,看来AndroidStudio完全是一套新的api,跟以前的开发方式都不一样了;
此外,由于版本号等配置在build.gradle文件中已经有了,所以我们在AndroidManifest.xml文件中要删掉重复的配置;
4、图片资源引用问题
经过以上几步修改后,项目终于可以编译运行了,但是悲剧也发生了,一打开app立马闪退,报的错误是:
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.xxxxx.xx/com.xxxxx.xx.xxxxx.MainActivity}:
android.view.InflateException: Binary XML file line #2: Error
inflating class android.widget.RelativeLayout

报错的地方就在Activity的onCreate方法中的setConentView方法处,什么原因呢?
原因是我们在build.gradle中buildToolsVersion配置的版本过低,我一直在用19.1.0,在这个版本下,要求所有图片必须放在mipmap目录下才能在布局文件中引用,否则就会引起上述Activity闪退,当我把buildToolsVersion的版本改成23.0.2之后就可以引入放在drawable目录下的图片了,如下图所示:

--buildToolsVersion建议用较新版本--
还有的同学说这个错误是因为图片资源不符合规范,有些本来是jpg图片,只是把扩展名改成了png就拿来用,其实这个问题会导致build同步失败,根本就不可能让应用跑起来,关于这个问题,建议批量修改图片资源,把所有的图片都改成png格式,网上有很多修改图片的工具,但是mac操作系统下有一个现成的方法,不需要安装任何第三方软件就可以批量改图片格式,具体操作方法如下:
5、图片资源不规范导致同步gradle失败的解决方法(Mac操作系统)
(1)进入图片目录,按command+A选中所有图片,然后右键菜单选择打开方式->选择“预览”这个应用程序,这个程序是Mac操作系统自带的,如下图所
示:

--用预览打开图片--
(2)打开“预览”之后,点左上角的“显示”,勾选“缩略图”,就可以在预览窗口左侧看到所有图片的缩略图了,如下图所示:

--勾选“缩略图”--
(3)在缩略图区域的空白处点鼠标右键,勾选排序菜单中的“种类”,按种类排序,如下图所示:

--所有图片按种类排序--
然后你就可以看到下图所示的情景:

--假的png图片被找了出来--
(4)将jpg图片重新导出为png图片,方法是在图片上点鼠标右键(如果有多张图片想批量导出的话按住command键点鼠标进行多选,或者直接按command+A全选所有图片),选择“导出为...”, 在弹出的对话框中选择PNG类型,如下图所示

--将图片导出为PNG格式--
这样就可以将不符合规范的图片规范化了。
这里之所以用Mac来讲是因为Windows下图片转换的工具有很多,一抓一大把,但是Mac中这类工具却相对较少,为了让大家少走弯路,分享一下Mac的图片转换方法,其实我也是在百度上找的,忘记哪个网站了,感谢那位朋友的无私分享。
6、jar包和so包应该放在哪?
在eclipse中,so包和jar都是放在lib目录下的,那么在AndroidStudio中是不是这样呢?当然不是的。
(1)首先看jar应该放在哪?jar包应该放在模块下的libs目录下,如图所示:

--jar包的位置--
然后就可以了,因为在新建工程的时候,系统已经在build.gradle中自动为我们配置了jar包的位置,如图所示:

--build.gradle中关于jar包位置的默认配置--
所以我们不需要再配了,直接把jar包拷在libs目录下就可以用;
(2)言归正转,so包应该放在哪呢?AndroidStudio默认的so存放位置是模块下的src/main/jniLibs目录,如图所示:

--so包应该放在jniLibs目录下--
如图所示,so包不能像在eclipse中那样跟jar包放在一起(默认情况下),如果没有jniLibs目录就自己建一个。
其实无论是aidl文件的存放位置,还是so包的存放位置,都是可以通过build.gradle文件修改的,这个不是今天的重点,大家有兴趣可以自行搜索相关资料,我们尽量遵循AndroidStudio的默认方式,以便让别人看到我们的项目时不至于一头雾水。
7、最后就是jni源码的存放位置以及如何配置了。

热心网友 时间:2023-07-19 08:07

官方文档MigratingFromEclipse1.从Eclipse中导出1.1.升级EclipseADT插件到版本22或更高1.2.在Eclipse里,File(文件)--Export(导出)1.3.在弹出的窗口,选择Android--GenerateGradleBuildFiles1.4.选择你要导出的项目,点击Finish(完成)在项目的目录下,产生了一个build.gradle的文件。2.导入到AndroidStudio上2.1.在Androidstudio上,选择File--Import2.2.在弹出的窗口选择项目的路径2.3.选择Createprojectfromexistingsource,然后下一步2.4.搞定。注意:官方文档说了,即使不产生build.gradle文件,也可以直接导入到AndroidStudio上,但是Google还是强烈建议这样子做。However,inordertotakeadvantageofbuildvariantsandotheradvancedfeaturesinthefuture,westronglysuggestthatyougenerateaGradlebuildfileusingtheADTpluginorwriteyourownGradlebuildfileforusewithAndroidStudio.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
卡耐基的智慧大全集内容简介 会说话赢天下内容简介 卡耐基演讲与口才内容简介 商务口才训练内容简介 卡耐基金牌口才作者简介 卡耐基商务口才 作者简介 爱因斯坦的更多故事 杨柯叶谨言是什么电视 房贷和消费贷利率差别不大,但是还款金额差别挺大,都是怎么计算的... ...11月18号提现1500元、,11月25号还款1515,请问我还需要还 现在用androidstudio进行NDK开发成熟吗 android studio 怎么生成so android jni abifilters为什么没产生文件 帮了一两次小忙,同学老是要请客吃饭怎么办? 应不应该拒绝 android bionic 在ndk中吗 同学请我帮陪客人吃饭我应怎么做? android studio中怎么打包.so库文件 如何处理同学间互相请客吃饭的问题? 如何更新android studio中的ndk 同学请客吃饭就我没去,我要怎么办 为什么android studio 打包的程序进程不识别 同学请客吃饭的时候,我如果每次大家都去了就我不去的话会怎样呢? android 怎么把多个so文件编译成jar 同学请我吃饭的时候我如果每次都不去的话会怎样呢? build gradle中ndk怎么创建多个modulename 同学请客吃饭不去应该怎么回答? android studio nd开发到底要不要自己配置.mk文件 同学请客吃饭提议应该说些什么 android jni cmake和 mk的不同 同学请客我该怎么办? Android studio 编译的时候gc overhead limit exceeded 如何引用android ndk自带的iconv Android Studio 为什么老是加载不起.so文件? 华为手机CPU构架32位的如何运行只支持64位的游戏? 请问为什么vivoz5x充电的时候现在变成了普通充电而不是闪充呢???_百度... 手机浏览器下载的缓存视频,怎么导出 vivo z5的充电口是什么接口? 我vivoz5手机充三小时才充满 才买了三周就 要充这么久是怎么回事?_百 ... vivoz5快充协议 怎样可以让vivoZ5手机充电变得很快? 手机里缓存的那些视频,怎样放到本地? VIVOz5是什么充电接口? 安卓手机的uc浏览器里的缓存视频,导出到电脑里,该怎么做? vivoz5可不可以用55w的充电器? 如何将手机里缓存的B站视频导出到电脑? vivoz5怎么快充? vivoz5能不能用z6的充电器? 黄瓜怎样切成条形? 刚买的vivo手机如何充电? 怎样把黄瓜切成一小块一小块菱形状的?