從Eclipse到AndroidStudio(五)遷移一個eclipse工程到AndroidStudio有哪些坑

本文已授權微信公眾號:鴻洋(hongyangAndroid)在微信公眾號平臺原創(chuàng)首發(fā)。

我們還是以AndroidStudio 2.1.1為例來講侵状。

經(jīng)過前幾節(jié)的講述赞弥,我們已經(jīng)對AndroidStudio以及Gradle構(gòu)建有了基本的認識,于是趣兄,我決定把公司的項目從eclipse遷移到AndroidStudio绽左,正式開始我的AndroidStudio之旅,可誰知事情根本沒有我想的那么簡單艇潭,這期間遇到了N多坑拼窥,我想這些坑可能大家也有可能遇到莹痢,于是就決定寫出來揪漩,跟大家一起交流虫腋。

首先鱼鼓,我們來看一下把一個eclipse工程遷移到AndroidStudio有幾種方法:

方法1:直接導入一個eclipse工程滨彻;

方法2:在eclipse中利用ADT為工程生成一個Gradle文件阻星,AndroidStudio導入這個gradle工程盅惜;

方法3:在AndroidStudio中新建一個工程糙捺,把eclipse工程的代碼伐割、資源一點點拷過來候味;

一刃唤、采用哪種方法

先說結(jié)論:我采用了方法3,如果你對方法1和方法2的效果不感興趣白群,可以跳過這一部分尚胞。

方法1的好處是簡單,AndroidStudio的早期版本只能用方法2帜慢,現(xiàn)在的新版可以支持方法1笼裳,直接導入一個eclipse工程,我開始時也是試這種方法的粱玲,確實簡單躬柬,導進來不需要做任何設置居然就能運行,那么問題是什么呢抽减?問題是編譯運行一次那叫一個慢呀允青,比eclipse還慢N倍,而且異常消耗電腦資源卵沉,我們Macbook Pro配置不算低颠锉,買來一年多風扇從來沒響過,以至于我以為電腦根本沒有風扇史汗,這下是聽到風扇響了琼掠,響聲那叫一個大,說明這種構(gòu)建項目的方式極其耗內(nèi)存耗CPU停撞,并且由于沒有gradle文件瓷蛙,Gradle的所有特性全部用不上,我都懷疑這種編譯方式用的就是ant戈毒,根本沒用到gradle速挑。

綜上所述,方法1既沒有eclipse快副硅,也沒有AndroidStudio的好處,看來這種方法不可取翅萤。

再來看方法2恐疲,方法2是Google官方推薦的方式,操作步驟是:先在eclipse中的工程上點鼠標右鍵套么,在彈出的菜單中選擇Export...培己,然后在彈出的窗口中選擇Android標簽下的Generate Gradle build files,如下圖所示:

eclipse中為工程生成build.gradle文件

然后按提示操作就可以在工程目錄下生成一個build.gradle文件胚泌,之后我們就可以用AndroidStudio導入這個build.gradle文件了省咨,導入的過程中會連同這個工程一齊導入,之后玷室,就會看到導入后的工程了零蓉,如圖所示:

從eclipse導入的項目

看到了吧笤受,整個工程還是保持eclipse中的目錄結(jié)構(gòu)。右邊是eclipse自動生成的build.gradle文件的內(nèi)容敌蜂,跟代碼無關箩兽。并且只有一個build.gradle文件,沒有分全局的gradle和模塊的gradle章喉,使用了很舊的Gradle版本汗贫,并且使用已經(jīng)不建議的android插件,之所以工程目錄沒有使用AndroidStudio默認格式秸脱,而可以保持eclipse目錄結(jié)構(gòu)落包,都是因為gradle文件中的那一部分sourceSets下的配置,sourceSets的配置可以允許我們改變工程的目錄組織結(jié)構(gòu)摊唇,而不需要必須使用AndroidStudio的默認結(jié)構(gòu)咐蝇,而且build.gradle構(gòu)建一直不成功。遏片。嘹害。也是醉了。

由于存在這么多的疑問吮便,我擔心會給將來留坑笔呀,并且目錄結(jié)構(gòu)都不是AndroidStudio默認,我決定:放棄這種方法髓需,采用方法3:新建一個AndroidStudio工程许师,把代碼和資源一點一點拷過去,使用“純粹”的AndroidStudio開發(fā)方式僚匆。

二微渠、采用方法3把工程遷移到AndroidStudio

這種方法的過程也沒什么好講的,就是把java代碼和資源文件復制粘貼到新工程的目錄下就OK了咧擂,先來看一下效果逞盆,下圖是我遷移完的效果:

方法3遷移后的效果圖

怎么樣,是不是清爽了許多松申,目錄結(jié)構(gòu)完全是AndroidStudio的格式云芦,首先一個注意的問題就是公司以前的項目是沒有用到v7包的,所以在build.gradle中注釋掉這個maven引用贸桶,以免引起不必要的麻煩舅逸。

還有一點就是以前項目中是有jni代碼的,但是我們的jni代碼目錄組織結(jié)構(gòu)比較復雜皇筛,不是標準的jni目錄琉历,AndroidStudio又不是靠mk文件來配置C代碼,所以還沒搞定,暫時只是把so包拿過來用旗笔,C代碼的編譯還是在eclipse下進行彪置,將來搞定了我再回來給大家補充。下面把我的修改過程一一講述一下:

1换团、注釋掉build.gradle中v7包的引用悉稠,這個上面已經(jīng)說過了,因為項目中以前沒用到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配置伤靠,結(jié)果報了

Execution failed for task ':app:processDebugManifest'.

> Manifest merger failed with multiple errors, see logs

這個錯誤,如下圖所示

報Manifest merger failed錯誤

merger是合并的意思嘛啼染,開始覺得很奇怪醋界,我們工程又沒有Library引用,跟誰合并呢提完,后來想起來build.gradle中引用了v7包,但是把v7包的引用注釋掉還是不行丘侠,有網(wǎng)友說在manifest中使用tools:replace標簽徒欣,可能這種方式只適用于Library模塊引起的merger沖突,我的很顯然不是這種情況蜗字;還有網(wǎng)友說在build.gradle的android標簽下加入aaptOptions.cruncherEnabled false和aaptOptions.useNewCruncher false打肝,開始時管了點用脂新,后來多試幾次又不行,看來也不是這個問題粗梭。

后來用了一個笨辦法争便,一點一點注釋AndroidManifest.xml中的內(nèi)容,看看注釋掉哪一塊可以不報錯断医,結(jié)果發(fā)現(xiàn)是下圖中所示的原因:

intent-filter標簽是一個空標簽

上圖中滞乙,我的service下配置了intent-filter標簽,按理說intent-filter標簽下還應該有action子標簽鉴嗤,比如像下圖這樣的標準寫法:

百度定位SDK的寫法是標準寫法

所以斩启,我們要做的就是注釋掉AndroidManifest.xml中service標簽下的空的intent-filter標簽,至少我用這種方法處理后就不再報錯了醉锅,看來AndroidStudio完全是一套新的api兔簇,跟以前的開發(fā)方式都不一樣了;

此外硬耍,由于版本號等配置在build.gradle文件中已經(jīng)有了垄琐,所以我們在AndroidManifest.xml文件中要刪掉重復的配置;

4经柴、圖片資源引用問題

經(jīng)過以上幾步修改后狸窘,項目終于可以編譯運行了,但是悲劇也發(fā)生了口锭,一打開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建議用較新版本

還有的同學說這個錯誤是因為圖片資源不符合規(guī)范晶渠,有些本來是jpg圖片,只是把擴展名改成了png就拿來用燃观,其實這個問題會導致build同步失敗褒脯,根本就不可能讓應用跑起來,關于這個問題缆毁,建議批量修改圖片資源番川,把所有的圖片都改成png格式,網(wǎng)上有很多修改圖片的工具,但是mac操作系統(tǒng)下有一個現(xiàn)成的方法颁督,不需要安裝任何第三方軟件就可以批量改圖片格式践啄,具體操作方法如下:

5、圖片資源不規(guī)范導致同步gradle失敗的解決方法(Mac操作系統(tǒng))

(1)進入圖片目錄沉御,按command+A選中所有圖片屿讽,然后右鍵菜單選擇打開方式->選擇“預覽”這個應用程序,這個程序是Mac操作系統(tǒng)自帶的吠裆,如下圖所示:

用預覽打開圖片

(2)打開“預覽”之后伐谈,點左上角的“顯示”,勾選“縮略圖”硫痰,就可以在預覽窗口左側(cè)看到所有圖片的縮略圖了衩婚,如下圖所示:

勾選“縮略圖”

(3)在縮略圖區(qū)域的空白處點鼠標右鍵,勾選排序菜單中的“種類”效斑,按種類排序非春,如下圖所示:

所有圖片按種類排序

然后你就可以看到下圖所示的情景:

假的png圖片被找了出來

(4)將jpg圖片重新導出為png圖片,方法是在圖片上點鼠標右鍵(如果有多張圖片想批量導出的話按住command鍵點鼠標進行多選缓屠,或者直接按command+A全選所有圖片)奇昙,選擇“導出為...”, 在彈出的對話框中選擇PNG類型敌完,如下圖所示

將圖片導出為PNG格式

這樣就可以將不符合規(guī)范的圖片規(guī)范化了储耐。

這里之所以用Mac來講是因為Windows下圖片轉(zhuǎn)換的工具有很多,一抓一大把滨溉,但是Mac中這類工具卻相對較少什湘,為了讓大家少走彎路,分享一下Mac的圖片轉(zhuǎn)換方法晦攒,其實我也是在百度上找的闽撤,忘記哪個網(wǎng)站了,感謝那位朋友的無私分享脯颜。

6哟旗、jar包和so包應該放在哪?

在eclipse中栋操,so包和jar都是放在lib目錄下的闸餐,那么在AndroidStudio中是不是這樣呢?當然不是的矾芙。

(1)首先看jar應該放在哪舍沙?jar包應該放在模塊下的libs目錄下,如圖所示:

jar包的位置

然后就可以了剔宪,因為在新建工程的時候拂铡,系統(tǒng)已經(jīng)在build.gradle中自動為我們配置了jar包的位置戈锻,如圖所示:

build.gradle中關于jar包位置的默認配置

所以我們不需要再配了,直接把jar包拷在libs目錄下就可以用和媳;

(2)言歸正轉(zhuǎn),so包應該放在哪呢哈街?AndroidStudio默認的so存放位置是模塊下的src/main/jniLibs目錄留瞳,如圖所示:

so包應該放在jniLibs目錄下

如圖所示,so包不能像在eclipse中那樣跟jar包放在一起(默認情況下)骚秦,如果沒有jniLibs目錄就自己建一個她倘。

其實無論是aidl文件的存放位置,還是so包的存放位置作箍,都是可以通過build.gradle文件修改的硬梁,這個不是今天的重點,大家有興趣可以自行搜索相關資料胞得,我們盡量遵循AndroidStudio的默認方式荧止,以便讓別人看到我們的項目時不至于一頭霧水。

7阶剑、最后就是jni源碼的存放位置以及如何配置了跃巡,這個我始終沒搞明白,我知道常規(guī)的jni源碼應該放在模塊下的main/jni目錄牧愁,跟java目錄以及aidl目錄并列素邪,但是公司的這個項目有點特殊,jni目錄下又包含了兩個子目錄猪半,兩個子目錄又各自有各自的mk文件兔朦,我直接復制過來的話會報C語言中#include進來的頭文件找不到,沒辦法我只能是在eclipse中編譯好so文件之后再拷進來磨确,但是這樣一來就無法在AndroidStudio中調(diào)試C代碼了沽甥,好悲摧~~~這個問題有點像是mk文件配置的問題,那么對應的build.gradle文件應該怎么配俐填?還需不需要mk文件安接?如果有大神知道的話希望能夠指點迷津,感激不盡英融。

至此盏檐,我在遷移項目中遇到一些坑大概就總結(jié)到這里了,可能沒辦法涵蓋所有的問題驶悟,但是希望有遇到跟我一樣的問題的時候可以幫助大伙少走彎路胡野。^_^

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市痕鳍,隨后出現(xiàn)的幾起案子硫豆,更是在濱河造成了極大的恐慌龙巨,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熊响,死亡現(xiàn)場離奇詭異旨别,居然都是意外死亡,警方通過查閱死者的電腦和手機汗茄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門秸弛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洪碳,你說我怎么就攤上這事递览。” “怎么了瞳腌?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵绞铃,是天一觀的道長。 經(jīng)常有香客問我嫂侍,道長儿捧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任吵冒,我火速辦了婚禮纯命,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痹栖。我一直安慰自己亿汞,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布揪阿。 她就那樣靜靜地躺著疗我,像睡著了一般。 火紅的嫁衣襯著肌膚如雪南捂。 梳的紋絲不亂的頭發(fā)上吴裤,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音溺健,去河邊找鬼麦牺。 笑死,一個胖子當著我的面吹牛鞭缭,可吹牛的內(nèi)容都是我干的剖膳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼岭辣,長吁一口氣:“原來是場噩夢啊……” “哼吱晒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沦童,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仑濒,失蹤者是張志新(化名)和其女友劉穎叹话,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墩瞳,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡驼壶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喉酌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辅柴。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瞭吃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涣旨,我是刑警寧澤歪架,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站霹陡,受9級特大地震影響和蚪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烹棉,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一攒霹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浆洗,春花似錦催束、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摘昌,卻和暖如春速妖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聪黎。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工罕容, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稿饰。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓锦秒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親湘纵。 傳聞我的和親對象是個殘疾皇子脂崔,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容