1. 程式人生 > >Android Studio Project目錄結構解疑

Android Studio Project目錄結構解疑

你完全瞭解你的Android studio project專案結構目錄起著什麼作用麼?帶著總結學習的目的,來一起去了解下Android Studio Project目錄和檔案的結構的作用:

一、Project目錄

在Android Studio中,Project目錄是一個完整的APP專案,由Application的Module和一些依賴的Module組成。

1、.gradle

作用:gradle專案產生資料夾(自動編譯工具產生的檔案)
釋義:gradle 執行時自動生成的目錄,一般情況不做修改,不需要納入專案原始碼管理中。

2、.idea

作用:IDEA專案資料夾(開發工具產生的檔案)
釋義:Intellij IDEA 執行時候生成的檔案目錄,一般情況不做修改,不需要納入專案原始碼管理中。 
拓展:.idea資料夾是自動生成的用於存放Android Studio配置檔案的目錄,主要包括版權、檢查配置、jar包資訊、專案名、編譯、編碼、gradle、模組等。
拓展:Intellij IDEA是JetBrains公司推出的Java整合開發環境,Android Studio是基於IDEA Commutity Edition開發的,Community 版本不僅是免費的而且是開源的。

3、app

作用:工程中的模組——Module
釋義:是一個可以單獨執行和除錯的application或公共庫,一個Project中可以有多個Module。
拓展:專案中的程式碼、資源等內容幾乎都是放置在這個目錄下的,開發工作也都是在這個目錄下進行的。

4、build

作用:構建時生成檔案的地方
釋義:工程編譯目錄,這個目錄你也不需要過多關心,它主要包含了一些在編譯時自動生成的檔案。
(我新建的工程裡如果沒有依賴工程時沒有這個資料夾,如果有有依賴工程時會出現這個資料夾,未知什麼原因)

5、gradle

作用:gradle構建目錄,gradle環境支援資料夾
釋義:這個目錄下包含了gradle wrapper的配置檔案,使用gradle wrapper的方式不需要提前將gradle下載好,而是會自動根據本地的快取情況決定是否需要聯網下載gradle。Android Studio預設沒有啟動gradle wrapper的方式,如果需要開啟,可以點選Android Studio導航欄 --> File --> Settings --> Build,Execution,Deployment --> Gradle,進行配置更改。
拓展:

gradle資料夾裡面wrapper目錄下有兩個檔案,裡面有一些專案對gradle的配置資訊,看下gradle-wrapper.properties裡的內容:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

可以看到裡面聲明瞭gradle的目錄與下載路徑以及當前專案使用的gradle版本

6、.gitignore

作用:git原始碼管理檔案,工程中的Git忽略配置檔案。
釋義:這個檔案是用來將指定的目錄或檔案排除在版本控制之外的。
拓展:git對專案檔案管理,可以在裡面新增你不希望納入git管理的檔案。來看一下里面的內容:

*.iml
.gradle
/local.properties
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
.DS_Store
/build
/captures
.externalNativeBuild

Android Studio已經自動幫我們添加了一些不需要的檔案,我們可以按照同樣的格式來加入自己的檔案。
例如:新增 /app/build/ 工程 Module中自動構建生成的build檔案忽略版本控制。

7、build.gradle

作用:gradle專案自動編譯的配置檔案
釋義:這是專案全域性的gradle構建指令碼,通常這個檔案中的內容是不需要修改的。但為方便在不同module中設定版本號等配置資訊,可以通過配置全域性變數來統一所有module的公共配置資訊,後期再看這塊的配置方式
拓展:先來看下里面的內容。

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

這裡是對Project的配置,是最頂層的配置,在module中同樣有一個build.gradle檔案,是對module的配置,如果module裡沒有進行配置,將使用這裡的配置資訊。一個是宣告倉庫的源,這裡可以看到是指明的jcenter(), jcenter可以理解成是一個新的中央遠端倉庫,相容maven中心倉庫,而且效能更優。另一個是聲明瞭android gradle plugin的版本。

8、gradle.properties

作用:gradle執行環境配置檔案
釋義:這個檔案是全域性的gradle配置檔案,在這裡配置的屬性將會影響到專案中所有的gradle編譯指令碼。比如配置gradle執行模式,執行時jvm虛擬機器的大小。具體配置可以參考如下連結:
https://docs.gradle.org/current/userguide/build_environment.html
https://docs.gradle.org/current/userguide/multi_project_builds.html#sec:decoupled_projects

9、gradlew & gradlew.bat

作用:
gradlew:自動完成 gradle 環境的linux mac 指令碼,配合gradle 資料夾使用
gradlew.bat:自動完成 gradle 環境的windows 指令碼,配合gradle 資料夾使用
釋義:它們分別是linux下的shell指令碼和windows下的批處理檔案,它們的作用是根據gradle-wrapper.properties檔案中的distributionUrl下載對應的gradle版本。這樣就可以保證在不同的環境下構建時都是使用的統一版本的gradle,即使該環境沒有安裝gradle也可以,因為gradle wrapper會自動下載對應的gradle版本。更多內容可以看下下面的連結,: 
http://blog.csdn.net/maserkinger/article/details/36011235

10、local.properties

作用:本地屬性配置檔案(key設定、androidsdk位置等屬性),Android SDK NDK 環境路徑配置
釋義:配置android NDK,SDK的地方,非android專案可能沒有這個檔案,這個路徑根據不同想電腦不同,一般也不會納入原始碼管理之中。
例如:sdk.dir=E\:\android_studio\android_studio\AndroidSDK

11、recyleview.iml

作用:IDEA 專案檔案
釋義:編譯專案時生成的檔案,其名為‘專案名.iml’,iml檔案是Android Studio識別專案的配置檔案,跟Eclipse裡面的.project檔案作用類似。

iml檔案是所有IntelliJ IDEA專案都會自動生成的一個檔案(Android Studio是基於IntelliJ IDEA開發的),用於標識這是一個IntelliJ IDEA專案,我們不需要修改這個檔案中的任何內容。

<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="recyleview" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
  <component name="FacetManager">
    <facet type="java-gradle" name="Java-Gradle">
      <configuration>
        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
        <option name="BUILDABLE" value="false" />
      </configuration>
    </facet>
  </component>
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>
12、setting.gradle

作用:全域性配置檔案,gradle 專案的子專案包含檔案
釋義:這個檔案用於指定專案中所有引入的模組。由於專案中就只有一個app模組,因此該檔案中也就只引入了app這一個模組。通常情況下模組的引入都是自動完成的,需要我們手動去修改這個檔案的場景可能比較少。聲明當前專案中含有什麼module。如果有多個module會以‘,’分開,例如:include ‘:app’, ‘:app2’

13、External Libraries

專案中使用到的依賴庫存放目錄,主要有Android SDK版本和存放路徑、JDK版本和存放路徑、其他各種依賴庫。

二、Module目錄(app目錄)

實質上除了app目錄之外,大多數的檔案和目錄都是自動生成的,我們並不需要進行修改。app目錄下的內容才是我們以後的工作重點,展開之後結構如下:

1、build

作用:module編譯時所生成檔案的目錄
釋義:這個目錄和外層的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包都放在libs目錄下,放在這個目錄下的jar包都會被自動新增到構建路徑裡去。我們可以把需要的第三方庫jar檔案放到這裡,*.so也同樣放在這裡。可以在Project Structure中管理它的依賴關係,也可以在build.gradle中直接修改。

3、src/androidTest

作用:android Studio生成的測試模組,可刪除
釋義:此處是用來編寫Android Test測試用例的,可以對專案進行一些自動化測試。

4、src/main/java

java目錄是放置我們所有java程式碼的地方,該目錄等同於Eclipse裡面的src目錄

5、src/main/res

資原始檔存放目錄,這個目錄下的內容就有點多了。簡單點說,就是你在專案中使用到的所有圖片,佈局,字串等資源都要存放在這個目錄下。當然這個目錄下還有很多子目錄,圖片放在drawable目錄下,佈局放在layout目錄下,字串放在values目錄下,所以你不用擔心會把整個res目錄弄得亂糟糟的。

6、AndroidManifest.xml

這是你整個Android專案的配置檔案,你在程式中定義的所以四大元件都需要在這個檔案裡註冊,另外還可以在這個檔案中給應用程式新增許可權宣告。

7、test

作用:單元測試模組,可刪除
釋義:此處是用來編寫Unit Test測試用例的,是對專案進行自動化測試的另一種方式。

8、.gitignore

作用:module中的git管理檔案
釋義: module模組的git管理檔案,可對module單獨管理。這個檔案用於將app模組內的指定的目錄或檔案排除在版本控制之外,作用和外層的.gitignore檔案類似。

9、app.iml

作用:module中的IDEA 專案檔案
釋義:IntelliJ IDEA專案自動生成的檔案,我們不需要關心或修改這個檔案中的內容。同Project中的*.iml一樣。管理module的配置。

10、build.gradle

作用:module自動編譯的配置檔案
釋義:這個檔案是Module的gradle配置檔案,也可以算是整個專案最主要的gradle配置檔案。這是app模組的gradle構建指令碼,這個檔案中會指定很多專案構建相關的配置。

/*
    apply plugin:應用了一個外掛,一般有兩種值可選:
    1、com.android.application 表示這是一個應用程式模組
    2、com.android.library 表示這是一顆庫模組
    兩個最大的區別是:一個可以之間執行,一個只能作為程式碼庫依附於別的應用程式模組來執行。
*/

apply plugin: 'com.android.application'

android {//在這個android閉包中我們可以配置專案構建的各種屬性。
    compileSdkVersion 27//用於指定專案的編譯版本
    buildToolsVersion "27.0.3"  //用於指定專案構建工具的版本
    defaultConfig {//在這個defaultConfig閉包中可以對專案的更多細節進行配置。
        //用於指定專案的包名,在後面修改時在這裡修改
        applicationId "com.materialdesign.heiyl.recyleview"
        //用於指定專案最低相容的android系統版本
        minSdkVersion 14
        //指定的值表示你在該目標版本上已經做過了充分的測試,系統將會為你的應用程式啟用一些最新的功能和特性
        targetSdkVersion 27
        //用於指定專案的版本號
        versionCode 1
        //用於指定專案的版本名
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
    }
    //在這buildTypes閉包中用於指定生成安裝檔案的相關配置,通常只會有兩個子閉包,一個debug,一個是release
    //1.debug閉包用於指定生成測試版安裝檔案的配置(這個閉包可以忽略不寫)
    //2.release閉包用於指定生成正式版安裝檔案的配置
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets { main { res.srcDirs = ['src/main/res''src/main/res/menu'] } }
}

/**
 這個dependencies閉包可以指定當前專案所有的依賴關係。
 通常android studio 專案共有3種依賴方式1.本地依賴 2.庫依賴 3.遠端依賴
 1.本地依賴可以對本地的jar包或目錄新增依賴關係
 2.庫依賴可以對專案中的庫模組新增依賴關係
 3.遠端依賴則可以對jcenter庫上的開源專案新增依賴關係
 */

dependencies {
    //這是一個本地依賴宣告,它表示將libs目錄下所有.jar字尾的檔案都新增到專案的構建路徑當中
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:support-vector-drawable:27.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.android.support:recyclerview-v7:27.1.1'
}
11、proguard-rules.pro

proguard-rules.pro檔案用於指定專案程式碼的混淆規則,當代碼開發完成後打成安裝包檔案,如果不希望程式碼被別人破解,通常會將程式碼混淆,從而讓破解者難以閱讀。