隨着android 5.0 的發布,android 開發已經進入了一個全新的時代,eclipse開發安卓已經有點不合時宜了,在github上80%的android項目都采用android studio開發,而且android studio的中文教程越來越多,還有什么理由不固守這eclipse 呢。
下面這篇文章對了解android studio 很有幫助,原文如下:
Google在2013的I/O開發者大會上引入的該開發工具。現在已經更新到了0.5.8版本。
現在github的很多項目都使用了Android Studio開發,所以如果你還用Eclipse,就需要把整個項目拆分,
然后在工程中include依賴包,是非常費事的,有時候弄了半天還不一定能成功導入。而且Android開發者工具的未來的趨勢一定也是轉向Android Studio。
介於種種原因,不得不學習使用Android Studio,Android Studio的項目管理使用了Gradle,所以你需要對Gradle進行簡單的理解,可以到官網去看下。
Gradle官網
http://www.gradle.org
因為Android 是在IntelliJ IDEA的基礎上開發的,所以可以參考
IntelliJ IDEA 的官方幫助地址
http://www.jetbrains.com/idea/webhelp/getting-help.html簡單引入一些概念:(有些是來自個人的官方翻譯有些是copy過來的)
Android Studio
建立系統工具包你用來生成,測試,運行您的應用程序和軟件包。構建系統是獨立於Android的工作室,所以你可以調用它的Android的工作室或從命令行。在你寫你的應用程序,你可以使用編譯系統的特點:定制,配置,和擴展的建立過程。
為您的應用程序使用同一項目的不同特點,創建多個應用程序。重用代碼和資源。
AndroidStudio構建系統由Gradle構成。Gradle是一種高級的構建工具,用於管理依賴性,允許你定義自定義構建邏輯。Android插件工具並不依賴於Android Studio,雖然Android Studio由它完全集成。
Gradle的配置包含以下方面
構建變量
構建系統可以根據不同的配置為同一個項目生成多個APK。當你想建立不同版本的應用程序,而不必為每個人單獨的項目,這是很有用的。
依賴關系
構建系統管理項目的依賴,並從本地文件系統和遠程存儲庫支持的依賴。這可以防止你不必搜索,下載和復制二進制包為你的依賴到你的項目目錄。
清單條目
構建系統使您可以指定的值在生成配置清單文件中的某些元素。這些新的值將覆蓋在manifest文件中的現有值。如果你想生成多個的
APK為您的項目中,他們每個人都有不同的包名,最小的SDK版本,或目標SDK版本,這是很有用的。
簽名
構建系統使您可以指定生成配置簽名設置,它可以在生成過程中簽署您的APK。
ProGuard
構建系統使您可以指定一個不同的 ProGuard的規則文件的每個版本變量。構建系統可以運行ProGuard的生成過程來混淆你的類。
測試
構建系統生成的項目中的測試源測試APK,所以你不必創建一個單獨的測試項目。構建系統可以在生成過程中運行測試
Gradle構建文件使用Groovy的語法。Groovy是一種動態語言,你可以用它來 定義自定義生成邏輯,並與Android的插件Gradle提供了Android特有的元素進行交互。
按照慣例建立
Android Studio生成系統假定合理的默認值的項目結構和其他編譯選項。
如果您的項目符合這些約定,你的Gradle構建文件是很簡單的。當一些這些公約並不適用於你的項目,使您可以配置生成過程的幾乎每一個方面。
例如,如果您的項目的源位於比默認值不同的目錄,你可以在構建文件中指定此位置。
項目和模塊
一個項目代表一個完整的Android應用程序。Android Studio項目包含一個或多個module 。一個module 是您的應用程序的獨立組件,你可以構建,測試或調試。module 包含您的應用程序的源代碼和資源。Android的Studio項目包含三種模塊:
Java庫模塊
包含可重用的代碼。構建系統生成一個JAR包的Java庫模塊。 Android庫模塊
包含可重復使用的Android特有的代碼和資源。構建系統產生AAR(安卓歸檔)包庫模塊。
Android應用程序模塊
包含應用程序代碼,並可能依賴於庫模塊,雖然很多Android應用程序只包含一個應用程序的模塊。構建系統生成APK包,為應用模塊。
Dependencies 依賴關系
Android Studio生成系統管理項目的依賴和支持模塊依賴關系,局部二進制依賴,以及遠程二進制依賴。
模塊依賴關系一個項目模塊可以在構建文件中包括的其它模塊的列表它依賴於。當你建立這個模塊,構建系統組裝,包括所需要的模塊。
本地依賴性如果你有二進制存檔在你的本地文件系統中的一個模塊依賴於,例如JAR文件,你可以在構建文件中該模塊聲明這些依賴關系。
遠程依賴性
當你的一些依賴關系都可以在一個遠程存儲庫,您不必下載它們,並將它們復制到您的項目。而Android工作室打造的系統支持遠程的Maven的依賴關系。的Maven是一個受歡迎的軟件項目管理工具,可幫助使用庫組織項目的依賴關系。
許
多流行的軟件庫和工具都可以在公共Maven倉庫。對於這些依賴項,您只需要指定自己的Maven坐標,它唯一標識一個遠程存儲庫中的每個元素。在構建系
統中使用的Maven坐標的格式是組:名稱:版本。例如,Maven的坐標為谷歌番石榴庫16.0.1版本是
com.google.guava:番石榴:16.0.1。
在Maven的中央存儲庫,廣泛用於分發很多庫和工具。
Build Tasks
Android Studio生成系統定義了一系列分層的構建任務:
頂級任務:用於產生必要的結果的任務。
構建系統提供項目任務:構建您的應用程序和模塊的任務,以建立獨立的模塊。
Gradle Wrapper
Android Studio項目包含的Gradle Wrapper由以下構成:
A JAR file
A properties file
A shell script for Windows platforms
A shell script for Mac and Linux platforms
Note: 你應該提交以上所有的文件到資源控制系統。
使用Gradle wrapper(而不是本地Gradle安裝),確保您始終運行的Gradle在屬性文件中定義的版本。要配置您的項目使用Gradle較新版本,
編輯屬性文件並指定新的版本。
Android Studio 會從Gradle Wrapper目錄下讀取你的配置文件,然后運行改wrapper,因此你可以根據不同版本的Gradle無縫的處理多個項目Android Studio 不支持Shell腳本,因此你應該在Gradle文件中定義自定義的邏輯來替代。
下面簡單的總結構建工程時遇到的問題
問題1. 如何引入第三方lib ?
http://stackoverflow.com/questions/20744692/android-studio-0-4-0-absherlock-gradle-without-import-module
a copy lib 工程到項目下,setting.gradle配置include ‘: yourlib’ ,否則會提示在你的項目下找不到該lib工程。b 到整個項目下的build.gradle配置include ‘:actionbarsherlock’
c 在你的Moudle下,而不是整個Project的build.gradle中添加
dependencies {
compile project(‘:yourlib’)
}
在網上查的資料,右鍵,選擇add as library,我的是0.5.8的,沒有發現。如果沒有作為lib引入,在Sync project with gradle files的時候 .
就會發現,default config 不支持.這是因為你的lib工程沒有build.gradle文件,可以拷貝一個簡單的build.gradle,到你添加的lib project 目錄下。
這樣就可以正常編譯了。當然如果你的lib 項目還引用了一些三方jar包,你需要在dependencies中進行配置。
文件如下
apply plugin: 'android-library' dependencies { compile fileTree(dir: 'libs', include: '*.jar') } android { compileSdkVersion 17 buildToolsVersion "19.0.3" sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } // Move the tests to tests/java, tests/res, etc... instrumentTest.setRoot('tests') // Move the build types to build-types/<type> // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... // This moves them out of them default location under src/<type>/... which would // conflict with src/ being used by the main source set. // Adding new build types or product flavors should be accompanied // by a similar customization. debug.setRoot('build-types/debug') release.setRoot('build-types/release') } }
問題2 gradle的配置
在第一次的時候,由於下載比較慢,你可以到gradle官方下載最新版本,解壓到android studio 的gradle的路徑下。這個不固定,跟SDK配置一樣,只要在gradle setting中指定好路徑即可。然后配置gradle到path,gradle -v 驗證是否成功配置
注意:gradle的配置是在整個Project項目下面的build.gradle文件中。
編譯器報錯:僅支持0.9+的gradle版本。解決方案:可以在build.gradle 里面配置 0.9+,或者在點擊提示,gradle setting中選擇以下選項之一
use default gradle wrapper (官方推薦,很少出問題)
會自動下載gradle,確保你的項目使用精確的gradle版本
另外,如果該選項不可選,灰色,請從其他項目中copy一個gradle文件夾到你的工程中
Use customizable gradle warpper (1.7版本以上支持)
這選項總是核對更新你指定的gradle版本,你只需要改變gradle的版本號即可。
Use local gradle distribution (不建議使用,經常出各種問題,可能個人還不夠熟悉)
會使用本地的gradle去build項目,但是請確保你已經安裝並在path中正確配置了該gradle。在命令行中,gradle -v可以驗證。
問
題3:sync project時長時間停留在 resolve dependencies ‘:classpath’狀態 或者 Error:(1,
0) Cause: org/gradle/api/artifacts/result/ResolvedComponentResult
原因 :可能gradle配置不正確或者沒有連接代理,無法訪問到服務器。
請確保你的其它lib project中也擁有build.gradle
請檢查gradle/wrapper/gradle-wrapper.properties:
gradle wrapper distributionUrl=http\://services.gradle.org/distributions/gradle-1.11-bin.zip或者更高,當時我下載的工程比較早,所以指向了gradle-0.9
所以這里建議從github上clone項目,或者下載最新的。防止舊的配置出問題。
如下:
1
2
|
|
建議:從github上clone項目,或者下載最新的。防止以前的工程配置出問題。
通常希望使用offline的狀態,不去連接外網,所以使用local gradle的配置,但是經常會出現各種問題,比如:
Error:No
cached version of com.android.tools.build:gradle:0.9.+ available for
offline mode.Disable Gradle ‘offline mode’ and sync project
特別是剛開始對gradle比較模糊的時候,你也不清楚它啥時候需要一些依賴lib,啥時候需要去網站下載。
建議:
選擇 use default gradle wrapper 該配置,也很少出現問題(請確保代理成功連接,可以在Http Proxy中check connection),以后慢慢的積累了多了,
使用起來比較熟了,可以再試試。
問題4 work offline 模式
如果你使用了該模式,但是其dependency 的lib project 沒有在本地,那么還是需要聯網的,否則會報錯。
http://stackoverflow.com/questions/20746071/failed-to-build-android-hello-world-application-in-offline-mode
每
次啟動都會有聯網檢測依賴的各種文件是否是最新版本,導致每次都相當慢。如果確定了你的工程中的jar包或者依賴工程都齊全,也不想去更新最新的,就可以
在gradle setting中勾選offline,這樣就不會去更新了。但是提一下,如果這種情況下出問題,也不要驚訝,請連接代理。重新sync
project,因為很多情況你可能並不清楚build工程所依賴的一些插件等是否已經有了。
另外提一下,如果你使用了0.9+這樣的配置方式(帶+號),那么無論你是否選擇了offline,都會去檢測,而且,如果你沒有網絡連接的話,編譯會報錯的。
0.9+,這種配置方式必須聯網。
所以如果你選擇了offline,那么請檢測自己的gradle的版本配置,可以直接寫成你的gradle的版本,比如我下載並配置好的gradle1.2.
在有可連接到服務器的網絡連接的情況下下面的配置,還是比較建議的。
dependencies {
classpath ‘com.android.tools.build:gradle:0.9.+’
}
問題5. com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice
原因:support v4包多次導入,或者是在不同的build.gradle文件中的dependencies 中無意compile了兩次,比如在你的actionbarsherlock中使用了
dependencies {
compile fileTree(dir: ‘libs’, include: ‘*.jar’)}
表明編譯所有的libs目錄下的jar包,已經編譯了support v4.jar包,而在項目下的build.gradle中又進行了編譯:
dependencies {
compile ‘com.android.support:support-v4:18.0.+’
}
所以應把項目下的compile ‘com.android.support:support-v4:18.0.+’ 給干掉另外提一點,不僅是support v4包,各種lib甚至各種布局的屬性,style,color,都不允許在不用的文件中重復定義,在sync project 的時候會報錯,你只需保留一份即可
問題6. AndroidMainfest.xml問題
前提:當時我的activity的label中使用的是中文,activity的label中使用的是中文,
情景1
Fatal error when parsing: AndroidManifest.xml . Failed to parse XML
file: org.xml.sax.SAXParseException: Element type “activity” must be
followed by either attribute specifications, “>” or “/>”.
情景2 unexpected end of block data
以上兩種情景的解決方案:
把中文label Extr 為String即可
不過我在編譯的時候有一些activity的label是中文的,一個一個activity的排錯是比較惡心的。還是建議所有的label都抽取到String.xml文件中。
我是這么修改的,大家可以試試。
還有一種情況出現:unexpected end of block data
在Sync project with gradle files 的時候
解決方案:
http://stackoverflow.com/questions/23045022/unexpected-end-of-block-data-in-gradle-sync
如果你使用的是 buildToolsVersion “19.0.0”,那么改成 buildToolsVersion “19.0.3”,重新Sync project即可
問題7 不同的lib 項目中的AndroidMainfest.xml文件中的targetSDK版本不一致
這個簡單,只需要全部改成一致的即可。
問題8. plugin with id ‘android’ not found
http://stackoverflow.com/questions/18153739/android-studio-plugin-with-id-android-library-not-found
在Project的build.gradle中,添加下面代碼
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
問題9 使用NDK時,NDK not configured
http://stackoverflow.com/questions/20674650/how-to-configure-ndk-with-android-gradle-plugin-0-7 在NDK lib工程下的 build.gradle中添加
productFlavors {
arm { ndk { abiFilters "armeabi", "armeabi-v7a" } } x86 { ndk { abiFilter "x86" } } }
或者
buildTypes {
debug {
ndk {
abiFilters "armeabi", "armeabi-v7a"
}
}
}
本人用的是第一種,在build photup項目的時候出現的問題
簡單總結下:
使用的時候最好有代理連接。很多時候需要下載一些插件或者依賴項目,除非你在本地完全擁有所有的依賴工程。但是在剛開始使用的時候,還是建議有代理,因為
在剛使用Android Studio,需要去下載一些東西,比如,maven repository等,
gradle配置要准確,保持都是最新的,盡量clone並在使用的時候更新項目,或者下載最新的工程,由於個人以前download 了很多的zip,跑demo用,后來直接導入,有些
插件已經更新了,但是配置文件還沒有更新。所以可能導致resolve dependency classpath長時間停留。
offline work不可信,請盡量保持gradle的代理連接,很可能需要去下載一些依賴工程,或者其它配置。也許是個人哪里處理的不夠好。
請使用官方推薦的Gradle配置選項:use default gradle wrapper
Android Studio快捷鍵
提示
Ctrl+P
方法參數提示
Ctrl+空格
代碼提示
Ctrl+Shift+Space
在很多時候都能夠給出Smart提示
Ctrl+Alt+Space
類名或接口名提示
查看
Alt+1
快速打開或隱藏工程面板
Ctrl+H
查看類結構圖
Ctrl+F12
查看當前文件的結構
Ctrl+Q
查看注釋文檔
Ctrl+P
查看參數信息
Alt+Q
查看當前方法的聲明
Ctrl+Q
查看JavaDoc
Ctrl+W
選中單詞繼而語句繼而行繼而函數
查找
Alt + F1
查找代碼所在位置
Ctrl + F7
查找當前元素在當前文件中的引用,然后按F3可以選擇
Alt + F3
快速查找
Ctrl + Shift + F7
可以高亮當前元素在當前文件中的使用
Ctrl + Shift+N
查找文件
Ctrl + Shift+Alt+N
查找類中的方法或變量
Ctrl + B
查找打開光標處的類或方法
Ctrl + N
快速查找類
Ctrl + F
查找文本
Alt+F1
可以將正在編輯的元素在各個面板中定位 Ctrl+Shift+Alt+N
可以快速打開符號 快速打開類/文件/符號時,可以使用通配符,也可以使用縮寫
Ctrl+Alt+Up /Ctrl+Alt+Down
可以快速跳轉搜索結果
修復
Shift+F6
重構-重命名
Ctrl+X
刪除行 Ctrl+D
復制行
Ctrl+/ 或 Ctrl+Shift+/ 注釋(// 或者/*…*/ )
Alt+Insert
可以生成構造器/Getter/Setter等
Ctrl+Alt+L
格式化代碼
Ctrl+R
替換文本
Alt+Enter
導入包,自動修正
Ctrl+Alt+O
優化導入的類和包
Ctrl+J
自動代碼
Ctrl+Shift+Space
自動補全代碼
Ctrl+Alt+Space
類名自動完成
Ctrl+Shift+Insert
可以選擇剪貼板內容並插入
Ctrl+Shift+J
可以整合兩行
Ctrl+Alt+T
可以把代碼包在一塊內,例如try/catch
Ctrl+Alt+V
可以引入變量。例如把括號內的SQL賦成一個變量
Alt+F8
計算變量值
Ctrl+O
可以選擇父類的方法進行重寫
最近相關
Ctrl+E
最近打開的文件 ———-
Ctrl+Shift+Backspace
可以跳轉到上次編輯的地方
Ctrl+Alt+ left/right
返回至上次瀏覽的位置
Ctrl+E或者Alt+Shift+C 最近更改的代碼
Alt+Shift+C
對比最近修改的代碼
移動
Ctrl+Shift+Up/Down
代碼向上/下移動。 —————
F2 或Shift+F2
高亮錯誤或警告快速定位 ————
Ctrl+Up/Down
光標跳轉到第一行或最后一行下
Ctrl+[或]
可以跳到大括號的開頭結尾
Ctrl+Shift+up/down
移動方法
Ctrl+P
方法參數提示
Ctrl+空格
代碼提示
Ctrl+Shift+Space
在很多時候都能夠給出Smart提示
Ctrl+Alt+Space
類名或接口名提示
轉自:
http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1108/1935.html