Dlaczego w projekcie Android Studio są dwa pliki build.gradle?

102

Po zaimportowaniu projektu Eclipse do Android Studio widzę dwa build.gradlepliki:

1 - <PROJECT_ROOT>\build.gradle
2 - <PROJECT_ROOT>\app\build.gradle

Pierwsza wersja jest krótsza, druga zawiera definicje compileSdkVersionitp.

Jaki jest cel posiadania dwóch oddzielnych plików? Czy istnieją oddzielne zadania kompilacji?

Sabuncu
źródło

Odpowiedzi:

72

<PROJECT_ROOT>\app\build.gradlejest specyficzny dla modułu aplikacji .

<PROJECT_ROOT>\build.gradleto „plik kompilacji najwyższego poziomu”, w którym można dodać opcje konfiguracji wspólne dla wszystkich podprojektów / modułów.

Jeśli używasz innego modułu w swoim projekcie, jako lokalna biblioteka miałbyś inny build.gradleplik: <PROJECT_ROOT>\module\build.gradle

Na przykład w pliku najwyższego poziomu możesz określić następujące wspólne właściwości:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
    }
}

ext {
    compileSdkVersion = 23
    buildToolsVersion = "23.0.1"
}

W Twoim app\build.gradle

apply plugin: 'com.android.application'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
}
Gabriele Mariotti
źródło
+1 Dziękuję, za chwilę przyjmie twoją odpowiedź. Czy build.gradleobecność pliku jest obowiązkowa, aby wyzwolić kompilację? Czy plik kompilacji najwyższego poziomu wywołuje pliki niższego poziomu? (Chociaż nie ma na to dowodów.)
Sabuncu,
Pliki build.gradle są obowiązkowe, jeśli chcesz zbudować projekt za pomocą gradle. Android Studio nie wymaga gradle, ale jest wysoce zalecane. Plik najwyższego poziomu nie wywołuje plików podrzędnych; gradle pracuje z zadaniami, ale trudno to wyjaśnić w komentarzu.
Gabriele Mariotti
Wielkie dzięki Gabriele, to pozwoli mi zacząć.
Sabuncu,
1
Szczególnie rootProject.ext.compileSdkVersionkonstrukcja jest bardzo pouczająca.
Sabuncu,
2
Czy ważne jest, aby skorzystać z objazdu za pomocą ext {...}, czy też powinniśmy bezpośrednio zastosować wtyczkę Androida i compileSdkVersion do pliku kompilacji najwyższego poziomu?
PhilLab
17

Z oficjalnej dokumentacji:

Projekty Android Studio zawierają plik kompilacji Gradle projektu najwyższego poziomu, który umożliwia dodawanie opcji konfiguracji wspólnych dla wszystkich modułów aplikacji w projekcie. Każdy moduł aplikacji ma również swój własny build.gradleplik ustawień kompilacji specyficznych dla tego modułu.

wprowadź opis obrazu tutaj

Plik kompilacji projektu

<PROJECT_ROOT>\build.gradlelub plik kompilacji projektu jest przeznaczony dla całego projektu, więc będzie używany do globalnych konfiguracji projektu. Typowy plik kompilacji projektu zawiera następujące elementy:

  • buildscript, który definiuje:
    • repozytoria i
    • zależności
  • Wersja wtyczki Gradle

Domyślnie plik Gradle na poziomie projektu używa skryptu buildscript do definiowania repozytoriów i zależności Gradle . Umożliwia to różnym projektom używanie różnych wersji Gradle. Obsługiwane repozytoria to JCenter, Maven Central lub Ivy. W tym przykładzie zadeklarowano, że skrypt kompilacji używa repozytorium JCenter i artefaktu zależności ścieżki klas, który zawiera wtyczkę systemu Android dla programu Gradle w wersji 1.0.1.


Plik kompilacji modułu

<PROJECT_ROOT>\app\build.gradlelub plik kompilacji modułu jest przeznaczony dla określonego modułu, więc będzie używany do określonych konfiguracji na poziomie modułu. Moduł kompilacji zawiera następujące elementy:

  • ustawienia Androida
    • compileSdkVersion
    • buildToolsVersion
  • defaultConfig i productFlavors
    • właściwości manifestu, takie jak applicationId, minSdkVersion, targetSdkVersion i informacje testowe
  • buildTypes
    • właściwości kompilacji, takie jak debugowalny, włączanie ProGuard, podpisywanie debugowania, sufiks nazwy wersji i informacje o testach
  • zależności

możesz przeczytać oficjalne dokumenty tutaj:

Ustawienia kompilacji projektów i modułów

SMR
źródło