本文已授權微信公眾號:鴻洋(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,如下圖所示:
然后按提示操作就可以在工程目錄下生成一個build.gradle文件胚泌,之后我們就可以用AndroidStudio導入這個build.gradle文件了省咨,導入的過程中會連同這個工程一齊導入,之后玷室,就會看到導入后的工程了零蓉,如圖所示:
看到了吧笤受,整個工程還是保持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了咧擂,先來看一下效果逞盆,下圖是我遷移完的效果:
怎么樣,是不是清爽了許多松申,目錄結(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文件擺放不正確炊汤,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
這個錯誤,如下圖所示
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)是下圖中所示的原因:
上圖中滞乙,我的service下配置了intent-filter標簽,按理說intent-filter標簽下還應該有action子標簽鉴嗤,比如像下圖這樣的標準寫法:
所以斩启,我們要做的就是注釋掉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目錄下的圖片了椰拒,如下圖所示:
還有的同學說這個錯誤是因為圖片資源不符合規(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ū)域的空白處點鼠標右鍵,勾選排序菜單中的“種類”效斑,按種類排序非春,如下圖所示:
然后你就可以看到下圖所示的情景:
(4)將jpg圖片重新導出為png圖片,方法是在圖片上點鼠標右鍵(如果有多張圖片想批量導出的話按住command鍵點鼠標進行多選缓屠,或者直接按command+A全選所有圖片)奇昙,選擇“導出為...”, 在彈出的對話框中選擇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目錄下,如圖所示:
然后就可以了剔宪,因為在新建工程的時候拂铡,系統(tǒng)已經(jīng)在build.gradle中自動為我們配置了jar包的位置戈锻,如圖所示:
所以我們不需要再配了,直接把jar包拷在libs目錄下就可以用和媳;
(2)言歸正轉(zhuǎn),so包應該放在哪呢哈街?AndroidStudio默認的so存放位置是模塊下的src/main/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é)到這里了,可能沒辦法涵蓋所有的問題驶悟,但是希望有遇到跟我一樣的問題的時候可以幫助大伙少走彎路胡野。^_^