1. 程式人生 > >Android專案需要使用的各種檔案

Android專案需要使用的各種檔案

任何一個新建的專案都會預設使用Android模式的專案結構,但這並不是專案真實的目錄結構,而是被Android Studio轉換過的這個模式結構比較簡潔明瞭,適合進行快速開發,將其切換為Project模式就是專案的真實結構了。
一.首先就是.gradle和.idea這兩個目錄下放置的是Android Studio 自動生成的一些檔案,.gradle是 gradle 執行時自動生成的 gradle專案產生資料夾(自動編譯工具產生的檔案基本不需要納入專案原始碼管理中而.idea是  IDEA 執行時候生成的檔案IDEA專案資料夾(開發工具產生的檔案)也基本不需要納入專案原始碼管理中。 這個IDEA是java的整合開發環境,Android Studio就是根據IDEA Commutity Edition開發的。

二.然後是app檔案它是 module模組,專案中的程式碼、資源等內容幾乎都放在這個目錄下。 每一個module可看成在Eclipse中的一個Project,裡面的檔案結構與父類差不多。裡面也能包含build.gradle、gradle.properties、setting.gradle 等相關gradle檔案。
接下來是app 目錄下的檔案進行分析: 1.build:這個目錄和外層的build目錄類似,主要是包含了一些在編譯時自動生成的 中間檔案就在這裡 我們編譯最終生成的apk就在build/outputs/apk目錄下,裡面包含了app-debug.apk, app-debug-unaligned.apk,app-release-unaligned.apk三種apk, 另外app-release.apk是生成在module的根目錄下。


2.libs:如果在專案中使用了第三方的jar包,就 把需要的第三方庫jar檔案放到這裡,*.so也同樣放在這裡。可以在Project Structure中管理它的依賴關係,也可以在build.gradle中直接修改。 ,放在這個目錄下的jar包都會被自動新增到構建路徑下
3.androidTest:是用來編寫Android Test測試用的,可以對專案進行一些自動化測試。
4.java:是用來放置我們所有java程式碼的地方
5.res:這個目錄下的東西有些多,在專案使用到的所有圖片、佈局、字串等資源都要存放在這個目錄下,當然這個目錄下還有還有很多字目錄:
(1)drawable:用來放置圖片 (2)layout:用來設定佈局 (3)valuse:是用開存放字串、樣式、顏色等配置的。 (4)mipmap:有這個開頭的檔案都是用來存放應用圖示的,眾多的檔案是為了讓程式更好的適應不同的裝置
6.AndroidManifest.xml是整個Android專案的配置檔案,在程式中定義的所有的四大元件都需要在這個檔案裡盡行註冊沒有註冊的活動是不能使用的,還可以在這個檔案中更應用新增許可權宣告。
7.test是用來編寫Unit Test測試用例的,是對專案進行自動化測試的另一種方式
8. .gitignore這個檔案是用於將app模組內的指定的目錄或檔案排除在版本控制之外,作用和外層的.gitignore檔案類似
9.app.iml是IntelliJ IDEA專案自動生成的檔案, 同Project中的*.iml一樣。管理module的配
10.build.gradle 這是app模組的gradle構建指令碼,這個檔案中會指定很多的專案構建相關的配置 apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "eric.test" minSdkVersion 17 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile( 'proguard-android.txt' ), 'proguard-rules.pro' } }}dependencies { compile fileTree( dir : 'libs' , include: [ '*.jar' ]) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' } 其中 // 這句是gradle版本的寫法,宣告是這是一個Android程式,是一個應用的外掛一般有兩值可選:com.android.application表示這是一個應用程式模組,com.android.library表示這是一個庫模組,這兩個最大的區別是一個可以直接執行另一個只能作為程式碼庫依附其他的應用程式模組來執行。 apply plugin: 'com.android.application' 在下面是一個android的閉包是關於Android專案中的配置: // 編譯android的sdk版本 compileSdkVersion 23 // build tools的版本 buildToolsVersion "23.0.2" defaultConfig { // 應用的包名 applicationId "eric.test" // 允許的最少版本 minSdkVersion 17 // 目標版本 targetSdkVersion 23 // apk的版本 versionCode 1 // apk的顯示版本 versionName "1.0" } buildTypes { // 表明是在release版本中使用的配置 release { // 是否執行混淆 minifyEnabled false // 混淆的配置檔案路徑,預設給了我們兩個配置檔案。 // proguard-android.txt在<sdk目錄>/tools/proguard下面,裡面已經包含了基本的混淆宣告,有興趣的可以去看下。 // proguard-rules.pro是在module根目錄下面,我們可以根據專案去新增。 proguardFiles getDefaultProguardFile( 'proguard-android.txt' ), 'proguard-rules.pro' } } 依賴的配置: // 表明是依賴庫配置,可以指定當前專案的配置,通常專案有三種依賴關係:本地依賴、庫依賴、遠端依賴。本地依賴可以對本地jar包或目錄進行新增依賴關係,庫依賴可以對專案中的庫模組新增依賴關係,遠端依賴可以對本地的jcenter庫上的開源專案新增依賴關係, dependencies { // 表明依賴libs目錄下的所有jar包,是一個本地依賴宣告 compile fileTree( dir : 'libs' , include: [ '*.jar' ]) // 表明在編譯專案的測試程式碼時依賴 testCompile 'junit:junit:4.12' //是遠端依賴宣告,前面的域名部分用於和其他的公司的庫進行區別 compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' }
11.proguard—rules.pro這個檔案用於指定專案程式碼的混淆規則,當代碼開發完成後打成安裝包檔案,如果不希望被別人破解通常進行程式碼的混淆從而防止外人閱讀

三.build目錄主要是 構建時生成檔案的地方不需要納入專案原始碼管理中。
四. gradle目錄(gradle環境支援資料夾)這個目錄下包含了gradle wrapper的配置檔案,使用gradel wrapper的方式不需要提前將gradle下載好,而是自動根據本地的快取情況決定是否聯網下載gradle wrapper目錄下有兩個檔案,裡面有一些專案對gradle的配置資訊,來看下其中一個gradle-wrapper.properties裡的內容,可以看到裡面聲明瞭gradle的目錄與下載路徑以及當前專案使用的gradle版本。 #Wed Oct 21 11:34:03 PDT 2015 distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distszipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
五. .gitignore檔案是用來將指定的目錄或檔案排除在版本控制之外的,即 git對專案檔案進行管理,使用者可以在裡面新增你不希望納入git管理的檔案。裡面的內容是: * .iml .gradle /local .properties / .idea /workspace .xml / .idea /libraries .DS _Store/build/captures
六. build.gradle是專案全域性的gradle構建指令碼,是由 gradle專案自動編譯的配置檔案 ,這個檔案是 專案的編譯環境配置,可以說是Gradle最主要的配置檔案。以下是是對Project的配置,是最頂層的配置,在module中同樣有一個build.gradle檔案,是對module的配置,如果module裡沒有進行配置,將使用這裡的配置資訊。一個是宣告倉庫的源,這裡可以看到是指明的jcenter(), jcenter可以理解成是一個新的中央遠端倉庫,相容maven中心倉庫,而且效能更優,聲明瞭這個配置之後就可以在專案中輕鬆的引用任何jcenter上的開源專案了。另一個是聲明瞭android gradle plugin的版本,這是一個外掛,因為Gradle並不是單獨為Android而開發的,所以想使用它來構建專案需要宣告這個外掛。 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.0.0-alpha2'//前面的是 // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}allprojects { repositories { jcenter() }}task clean(type: Delete) { delete rootProject.buildDir}
七. gradle.properties是全域性的gradle配置檔案,在這裡配置的屬性將會影響到專案中所有的gradle編譯指令碼, 比如配置gradle執行模式,執行時jvm虛擬機器的大小。在建立的專案中,暫時是沒有內容的。
八. gradlew和gradlew.bat這兩個檔案是用來在命令介面中執行Gradle命令的, 分別是linux下的shell指令碼和windows下的批處理檔案,它們的作用是根據gradle-wrapper.properties檔案中的distributionUrl下載對應的gradle版本。這樣就可以保證在不同的環境下構建時都是使用的統一版本的gradle,即使該環境沒有安裝gradle也可以,因為gradle wrapper會自動下載對應的gradle版本。 其中gradlew是在Linux或Mac系統中使用的而gradlew.bat是在windows系統上使用的。
九. Test.iml是所有Intellij IDEA專案都會自動生成的一個檔案, 編譯專案時生成的檔案,其名為‘專案名.iml’, 用於標示這是一個Android專案
十. local.properties這個檔案用於指定本機的Android SDK路徑,通常是自動生成不需要修改,除非本機的Android SDK位置發生了變化,那麼就將這個檔案中的路徑改成新的位置即可。這個檔案也就是 配置android NDK,SDK的地方,也就是說在非android專案可能沒有這個檔案。
十一. setting.gradle這個檔案用於指定專案中所有引入的模組,通常情況下模組的引入都是自動完成,需要手動修改的情況比較少。 聲明當前專案中含有什麼module。如果有多個module會以‘,’分開,如:include ‘:app’, ‘:app2’。

在上面反覆的提到了gradle,那麼現在就介紹一下和gradle有關的知識。
首先Android Studio是採用Gradle來構建專案的,是一個非常先進的專案工具使用了 Groovy 的領域特定語言(DSL)來宣告專案設定 新建專案成功後會下載Gradle,貌似這個過程不翻牆也是可以下載,但是訪問特別慢,建議翻牆下載。那麼下載的Gradle到什麼地方呢?
  • Mac上會預設下載到 **/Users/<使用者名稱>/.gradle/wrapper/dists** 目錄
  • Win平臺會預設下載到 C:\Documents and Settings<使用者名稱>.gradle\wrapper\dists 目錄
你會看到這個目錄下有個 gradle-x.xx-all 的資料夾, 如果下載實在太慢,但是又不想翻牆的話,可以自己手動到Gradle官網 下載對應的版本,然後將下載的.zip檔案(也可以解壓)複製到上述的gradle-x.xx-all 資料夾下,不過還是建議讓它直接下載的好。
Gradle的核心是一個豐富的可擴充套件的基於Groovy的領域特定語言(DSL)。Gradle通過提供說明性語言元素將說明性構建推到下一層。這些元素也提供build-by-convention支援Java、Groovy、OSGi、Web和Scala專案。另外這個說明性語言是可擴充套件的。新增自己的新語言元素或提高現有的,從而提供簡潔、易於維護和理解構建。 總的來說Gradle是一種構建工具而Android Studio使用它來構建你的Android專案。主要任務是 依賴管理和任務執行 剛才說到Gradle的核心是Groovy,它是用於JVM的一種敏捷動態語言既可以面向物件也可以作為指令碼語言。這種語言比較有特點,它和Java一樣,也運行於Java虛擬機器中。可以理解為Groovy擴充套件了Java語言。比如,Groovy對自己的定義就是:Groovy是在 java平臺上的、 具有像Python, Ruby 和 Smalltalk 語言特性的靈活動態語言, Groovy保證了這些特性像 Java語法一樣被 Java開發者使用。除了語言和Java相通外,Groovy有時候又像一種指令碼語言。前文也提到過,當我執行Groovy指令碼時,Groovy會先將其編譯成Java類位元組碼,然後通過Jvm來執行這個Java類。實際上,由於Groovy Code在真正執行的時候已經變成了Java位元組碼,所以JVM根本不知道自己執行的是Groovy程式碼。 Gradle專案構框架使用groovy語言實現。 Gradle不單單是一個配置指令碼,它的背後是幾門語言,如果硬讓我說,我認為是三門語言。
  • Groovy Language
  • Gradle DSL
  • Android DSL

在Android Studio中的關鍵則是它更好的支援DSL,DSL是領域特定語言, 再直接點,其實就是這個語言不通用,只能用於特定的某個領域。 它是為了解決系統(包括硬體系統和軟體系統)構建初期,使用者和構建者的語言模型不一致導致需求收集的困難。  在需求收集的過程中,如果要成功構建模型,則需要一種領域專家和構建者(也就是通常的領域分析師/業務分析師)都能理解的“共同語言”。但是這種共同語言的建立過程沒有保證,不能夠保證在收集過程中得到的資訊完整的描述了領域活動中所有的業務規則和活動。如果能夠讓領域專家通過簡單的程式設計方式描述領域中的所有活動和規則,那麼就能在一定程度上保證描述 的完整性。DSL 就是為了解決這個問題而提出的。