1. .gradle 和.idea 這兩個目錄下放置的都是 Android Studio 自動生成的一些文件,我們無須關心,也不要去手 動編輯。
2. app 項目中的代碼、資源等內容幾乎都是放置在這個目錄下的,后面的開發工作也基本都是 在這個目錄下進行的。
3. build 這個目錄也不需要過多關心,它主要包含了一些在編譯時自動生成的文件。
4. gradle 這個目錄下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前將gradle 下載好,而是會自動根據本地的緩存情況決定是否需要聯網下載 gradle。Android Studio 默認沒有 啟用gradle wrapper的方式,如果需要打開,可以點擊Android Studio導航欄→File→Settings→Build, Execution, Deployment→Gradle,進行配置更改。
5. .gitignore 這個文件是用來將指定的目錄或文件排除在版本控制之外的.
6. build.gradle 這是項目全局的 gradle 構建腳本,通常這個文件中的內容是不需要修改的。
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 目錄之外,大多數的文件 和目錄都是自動生成的,我們並不需要進行修改。想必你已經猜到了,app 目錄下的內容才是我 們以后的工作重點,展開之后結構如圖 1.29 所示。
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 項目的配置文件,你在程序中定義的所有四大組件都需要在這個文件里 注冊,另外還可以在這個文件中給應用程序添加權限聲明。由於這個文件以后會經常用到,我們 用到的時候再做詳細說明。
7. test 此處是用來編寫 Unit Test 測試用例的,是對項目進行自動化測試的另一種方式。
8. .gitignore 這個文件用於將 app 模塊內的指定的目錄或文件排除在版本控制之外,作用和外層 的.gitignore 文件類似。
9. app.iml IntelliJ IDEA 項目自動生成的文件,我們不需要關心或修改這個文件中的內容。
10. build.gradle 這是 app 模塊的 gradle 構建腳本,這個文件中會指定很多項目構建相關的配置,我們稍后將 會詳細分析 gradle 構建腳本中的具體內容。
11. proguard-rules.pro 這個文件用於指定項目代碼的混淆規則,當代碼開發完成后打成安裝包文件,如果不希望代 碼被別人破解,通常會將代碼進行混淆,從而讓破解者難以閱讀
詳解項目中的資源
如果你展開 res 目錄看一下,其實里面的東西還是挺多的,很容易讓人看得眼花繚亂,如圖 1.30 所示
看到這么多的文件夾也不用害怕,其實歸納一下,res目錄就變得非常簡單了。所有以 drawable 開頭的文件夾都是用來放圖片的,所有以 mipmap 開頭的文件夾都是用來放應用圖標的,所有以 values 開頭的文件夾都是用來放字符串、樣式、顏色等配置的,layout 文件夾是用來放布局文件 的。怎么樣,是不是突然感覺清晰了很多?
之所以有這么多 mipmap 開頭的文件夾,其實主要是為了讓程序能夠更好地兼容各種設備。 drawable 文件夾也是相同的道理,雖然 Android Studio 沒有幫我們自動生成,但是我們應該自己創 建 drawable-hdpi、drawable-xhdpi、drawable-xxhdpi 等文件夾。在制作程序的時候最好能夠給同 一張圖片提供幾個不同分辨率的版本,分別放在這些文件夾下,然后當程序運行的時候,會自動 根據當前運行設備分辨率的高低選擇加載哪個文件夾下的圖片。當然這只是理想情況,更多的時 候美工只會提供給我們一份圖片,這時你就把所有圖片都放在 drawable-xxhdpi 文件夾下就好了。
知道了 res 目錄下每個文件夾的含義,我們再來看一下如何去使用這些資源吧。打開 res/ values/strings.xml 文件,內容如下所示:
HelloWorld 可以看到,這里定義了一個應用程序名的字符串,我們有以下兩種方式來引用它。
在代碼中通過 R.string.app_name 可以獲得該字符串的引用。
在 XML 中通過@string/app_name 可以獲得該字符串的引用。
基本的語法就是上面這兩種方式,其中 string 部分是可以替換的,如果是引用的圖片資源 就可以替換成 drawable,如果是引用的應用圖標就可以替換成 mipmap,如果是引用的布局文件 就可以替換成 layout,以此類推。
下面舉一個簡單的例子來幫助你理解,打開 AndroidManifest.xml 文件,找到如下代碼:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> ... </application>
... 其中,HelloWorld 項目的應用圖標就是通過 android:icon 屬性來指定的,應用的名稱則是 通過android:label屬性指定的。可以看到,這里對資源引用的方式正是我們剛剛學過的在XML 中引用資源的語法。 經過本小節的學習,如果你想修改應用的圖標或者名稱,相信已經知道該怎么辦了吧。
詳解 build.gradle 文件
不同於 Eclipse,Android Studio 是采用 Gradle 來構建項目的。Gradle 是一個非常先進的項目 構建工具,它使用了一種基於 Groovy 的領域特定語言(DSL)來聲明項目設置,摒棄了傳統基 於 XML(如 Ant 和 Maven)的各種煩瑣配置。
在 1.3.4 小節中我們已經看到,HelloWorld 項目中有兩個 build.gradle 文件,一個是在最外層 目錄下的,一個是在 app 目錄下的。這兩個文件對構建 Android Studio 項目都起到了至關重要的 作用,下面我們就來對這兩個文件中的內容進行詳細的分析
先來看一下最外層目錄下的 build.gradle 文件,代碼如下所示:
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.0' } } allprojects { repositories { jcenter() } } 這些代碼都是自動生成的,雖然語法結構看上去可能有點難以理解,但是如果我們忽略語法結構,只看最關鍵的部分,其實還是很好懂的。
首先,兩處 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。
這樣我們就將最外層目錄下的 build.gradle 文件分析完了,通常情況下你並不需要修改這個 文件中的內容,除非你想添加一些全局的項目構建配置。
下面我們再來看一下 app 目錄下的 build.gradle 文件,代碼如下所示: apply plugin: 'com.android.application' android { compileSdkVersion 24 buildToolsVersion "24.0.2" defaultConfig { applicationId "com.example.helloworld" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:24.2.1' testCompile 'junit:junit:4.12' }
這個文件中的內容就要相對復雜一些了,下面我們一行行地進行分析。首先第一行應用了一 個插件,一般有兩種值可選: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 是用於聲明測試用例庫的,這個我們暫時用不到,先忽略它就可以了。