JDK
JDK是java語言的軟件開發工具包,它包含了java的運行環境,工具集合,基礎類庫等內容
Android SDK
是谷歌提供的 Android 開發包,在開發Android 項目的時候 我們需要引入Android SDK 來使用Android 的相關API
Android Studio
在很早之前,Android項目都是用Eclipse來開發的,相信所有Java開發者都一定會對這個工具非常熟悉,它是Java開發神器,安裝ADT插件后就可以用來開發Android程序了。而在2013年的時候,谷歌推出了一款官方的IDE工具Android Studio,由於不再是以插件的形式存在,Android Studio在開發Android程序方面要遠比Eclipse強大和方便得多。不過由於Android Studio早期的測試版本並不是非常穩定,所以本書的第1版仍然選用的Eclipse來作用開發工具。而如今,Android Studio已經推出了2.2版本,穩定性完全不再是問題,普及程度方面也遠超Eclipse,沒有比現在更適合的時機來換用Android Studio了,因此本書中所有的代碼都將在Android Studio上進行開發。


分析你的第一個Android程序 根目錄
1 . gradle和.idea
這兩個目錄下放置的都是Android Studio自動生成的一些文件,我們無須關心,也不要去手動編輯。
2 . app
項目中的代碼、資源等內容幾乎都是放置在這個目錄下的,我們后面的開發工作也基本都是在這個目錄下進行的,待會兒還會對這個目錄單獨展開進行講解。
3 . build
這個目錄你也不需要過多關心,它主要包含了一些在編譯時自動生成的文件。
4 . gradle 類似php的composer
這個目錄下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前將gradle下載好,而是會自動根據本地的緩存情況決定是否需要聯網下載gradle。Android Studio默認沒有啟用gradle wrapper的方式,如果需要打開,可以點擊Android Studio導航欄→File→Settings→Build, Execution, Deployment→Gradle,進行配置更改。
5 . .gitignore
這個文件是用來將指定的目錄或文件排除在版本控制之外的,關於版本控制我們將在第5章中開始正式的學習。
6 . build.gradle
這是項目全局的gradle構建腳本,通常這個文件中的內容是不需要修改的。稍后我們將會詳細分析gradle構建腳本中的具體內容。


兩處repositories的閉包中都聲明了jcenter()這行配置,那么這個jcenter是什么意思呢?其實它是一個代碼托管倉庫,很多Android開源項目都會選擇將代碼托管到jcenter上,聲明了這行配置之后,我們就可以在項目中輕松引用任何jcenter上的開源項目了。
接下來,dependencies閉包中使用classpath聲明了一個Gradle插件。為什么要聲明這個插件呢?因為Gradle並不是專門為構建Android項目而開發的,Java、C++等很多種項目都可以使用Gradle來構建。因此如果我們要想使用它來構建Android項目,則需要聲明com.android. tools.build:gradle:2.2.0這個插件。其中,最后面的部分是插件的版本號,我在寫作本書時最新的插件版本是2.2.0。
7 . gradle.properties
這個文件是全局的gradle配置文件,在這里配置的屬性將會影響到項目中所有的gradle編譯腳本。
8 . gradlew和gradlew.bat
這兩個文件是用來在命令行界面中執行gradle命令的,其中gradlew是在Linux或Mac系統中使用的,gradlew.bat是在Windows系統中使用的。
9 . HelloWorld.iml
iml文件是所有IntelliJ IDEA項目都會自動生成的一個文件(Android Studio是基於IntelliJ IDEA開發的),用於標識這是一個IntelliJ IDEA項目,我們不需要修改這個文件中的任何內容。
10 . local.properties
這個文件用於指定本機中的Android SDK路徑,通常內容都是自動生成的,我們並不需要修改。除非你本機中的Android SDK位置發生了變化,那么就將這個文件中的路徑改成新的位置即可。
11 . settings.gradle
這個文件用於指定項目中所有引入的模塊。由於HelloWorld項目中就只有一個app模塊,因此該文件中也就只引入了app這一個模塊。通常情況下模塊的引入都是自動完成的,需要我們手動去修改這個文件的場景可能比較少。
app目錄
1 . build
這個目錄和外層的build目錄類似,主要也是包含了一些在編譯時自動生成的文件,不過它里面的內容會更多更雜,我們不需要過多關心。
2 . libs
如果你的項目中使用到了第三方jar包,就需要把這些jar包都放在libs目錄下,放在這個目錄下的jar包都會被自動添加到構建路徑里去。
3 . androidTest
此處是用來編寫Android Test測試用例的,可以對項目進行一些自動化測試。
4 . java
毫無疑問,java目錄是放置我們所有Java代碼的地方,展開該目錄,你將看到我們剛才創建的HelloWorldActivity文件就在里面。
5 . res
這個目錄下的內容就有點多了。簡單點說,就是你在項目中使用到的所有圖片、布局、字符串等資源都要存放在這個目錄下。當然這個目錄下還有很多子目錄,
圖片放在drawable目錄下,
布局放在layout目錄下,
字符串放在values目錄下,
所以你不用擔心會把整個res目錄弄得亂糟糟的。
6 . AndroidManifest.xml
這是你整個Android項目的配置文件,你在程序中定義的所有四大組件都需要在這個文件里注冊,另外還可以在這個文件中給應用程序添加權限聲明。由於這個文件以后會經常用到,我們用到的時候再做詳細說明。
<activity android:name=".HelloWorldActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
這段代碼表示對HelloWorldActivity這個活動進行注冊,沒有在AndroidManifest.xml里注冊的活動是不能使用的。其中intent-filter里的兩行代碼非常重要,和表示HelloWorldActivity是這個項目的主活動,在手機上點擊應用圖標,首先啟動的就是這個活動。
7 . test
此處是用來編寫Unit Test測試用例的,是對項目進行自動化測試的另一種方式。
8 . .gitignore
這個文件用於將app模塊內的指定的目錄或文件排除在版本控制之外,作用和外層的.gitignore文件類似。
9 . app.iml
IntelliJ IDEA項目自動生成的文件,我們不需要關心或修改這個文件中的內容。
10 . build.gradle
這是app模塊的gradle構建腳本,這個文件中會指定很多項目構建相關的配置,我們稍后將會詳細分析gradle構建腳本中的具體內容。


第一行應用了一個插件,一般有兩種值可選:com.android.application表示這是一個應用程序模塊,com.android.library表示這是一個庫模塊。應用程序模塊和庫模塊的最大區別在於,一個是可以直接運行的,一個只能作為代碼庫依附於別的應用程序模塊來運行。
接下來是一個大的android閉包,在這個閉包中我們可以配置項目構建的各種屬性。其中,
compileSdkVersion
用於指定項目的編譯版本,這里指定成24表示使用Android 7.0系統的SDK編譯。
buildToolsVersion
用於指定項目構建工具的版本,目前最新的版本就是24.0.2,
如果有更新的版本時,Android Studio會進行提示。
然后我們看到,這里在android閉包中又嵌套了一個defaultConfig閉包,defaultConfig閉包中可以對項目的更多細節進行配置。其中,applicationId用於指定項目的包名,前面我們在創建項目的時候其實已經指定過包名了,如果你想在后面對其進行修改,那么就是在這里修改的。minSdkVersion用於指定項目最低兼容的Android系統版本,這里指定成15表示最低兼容到Android 4.0系統。targetSdkVersion指定的值表示你在該目標版本上已經做過了充分的測試,系統將會為你的應用程序啟用一些最新的功能和特性。比如說Android 6.0系統中引入了運行時權限這個功能,如果你將targetSdkVersion指定成23或者更高,那么系統就會為你的程序啟用運行時權限功能,而如果你將targetSdkVersion指定成22,那么就說明你的程序最高只在Android 5.1系統上做過充分的測試,Android 6.0系統中引入的新功能自然就不會啟用了。剩下的兩個屬性都比較簡單,versionCode用於指定項目的版本號,versionName用於指定項目的版本名,這兩個屬性在生成安裝文件的時候非常重要,我們在后面都會學到。
分析完了defaultConfig閉包,接下來我們看一下buildTypes閉包。buildTypes閉包中用於指定生成安裝文件的相關配置,通常只會有兩個子閉包,一個是debug,一個是release。debug閉包用於指定生成測試版安裝文件的配置,release閉包用於指定生成正式版安裝文件的配置。另外,debug閉包是可以忽略不寫的,因此我們看到上面的代碼中就只有一個release閉包。下面來看一下release閉包中的具體內容吧,minifyEnabled用於指定是否對項目的代碼進行混淆,true表示混淆,false表示不混淆。proguardFiles用於指定混淆時使用的規則文件,這里指定了兩個文件,第一個proguard-android.txt是在Android SDK目錄下的,里面是所有項目通用的混淆規則,第二個proguard-rules.pro是在當前項目的根目錄下的,里面可以編寫當前項目特有的混淆規則。需要注意的是,通過Android Studio直接運行項目生成的都是測試版安裝文件
這樣整個android閉包中的內容就都分析完了,接下來還剩一個dependencies閉包。這個閉包的功能非常強大,它可以指定當前項目所有的依賴關系。通常Android Studio項目一共有3種依賴方式:本地依賴、庫依賴和遠程依賴。本地依賴可以對本地的Jar包或目錄添加依賴關系,庫依賴可以對項目中的庫模塊添加依賴關系,遠程依賴則可以對jcenter庫上的開源項目添加依賴關系。觀察一下dependencies閉包中的配置,第一行的compile fileTree就是一個本地依賴聲明,它表示將libs目錄下所有.jar后綴的文件都添加到項目的構建路徑當中。而第二行的compile則是遠程依賴聲明,com.android.support:appcompat-v7:24.2.1就是一個標准的遠程依賴庫格式,其中com.android.support是域名部分,用於和其他公司的庫做區分;appcompat-v7是組名稱,用於和同一個公司中不同的庫做區分;24.2.1是版本號,用於和同一個庫不同的版本做區分。加上這句聲明后,Gradle在構建項目時會首先檢查一下本地是否已經有這個庫的緩存,如果沒有的話則會去自動聯網下載,然后再添加到項目的構建路徑當中。至於庫依賴聲明這里沒有用到,它的基本格式是compile project后面加上要依賴的庫名稱,比如說有一個庫模塊的名字叫helper,那么添加這個庫的依賴關系只需要加入compile project(':helper')這句聲明即可。另外剩下的一句testCompile是用於聲明測試用例庫的,這個我們暫時用不到,先忽略它就可以了。
11 . proguard-rules.pro
這個文件用於指定項目代碼的混淆規則,當代碼開發完成后打成安裝包文件,如果不希望代碼被別人破解,通常會將代碼進行混淆,從而讓破解者難以閱讀。