System kompilacji Androida kompiluje zasoby i kod źródłowy aplikacji, a następnie pakuje je w pliki APK lub pakiety Android App Bundle, które możesz testować, wdrażać, podpisywać i rozpowszechniać.
W sekcjach Omówienie kompilacji Gradle i Struktura kompilacji Androida omówiliśmy koncepcje kompilacji i strukturę aplikacji na Androida. Teraz nadszedł czas na skonfigurowanie kompilacji.
Glosariusz kompilacji Androida
Gradle i wtyczka Androida do obsługi Gradle pomagają skonfigurować te aspekty kompilacji:
- Typy kompilacji
-
Typy kompilacji definiują określone właściwości, których Gradle używa podczas kompilowania i pakowania aplikacji. Typy kompilacji są zwykle konfigurowane na różnych etapach cyklu życia programowania.
Na przykład typ kompilacji do debugowania włącza opcje debugowania i podpisuje aplikację kluczem debugowania, a typ kompilacji do publikacji może zmniejszyć i zaciemnić aplikację oraz podpisać ją kluczem wersji do dystrybucji.
Aby utworzyć aplikację, musisz zdefiniować co najmniej 1 typ kompilacji. Android Studio domyślnie tworzy typy kompilacji do debugowania i publikacji. Aby rozpocząć dostosowywanie ustawień pakowania aplikacji, dowiedz się, jak skonfigurować typy kompilacji.
- Warianty usługi
- Warianty usługi to różne wersje aplikacji, które możesz udostępniać użytkownikom, np. wersja bezpłatna i płatna. Możesz dostosować warianty usługi, aby używały różnych kodów i zasobów, jednocześnie udostępniając i ponownie wykorzystując części wspólne dla wszystkich wersji aplikacji. Warianty usługi są opcjonalne i musisz je utworzyć ręcznie. Aby zacząć tworzyć różne wersje aplikacji, dowiedz się, jak skonfigurować warianty usługi.
- Warianty kompilacji
- Wariant kompilacji to iloczyn kartezjański typu kompilacji i wariantu usługi. Jest to konfiguracja, której Gradle używa do kompilowania aplikacji. Za pomocą wariantów kompilacji możesz tworzyć wersje debugowania wariantów usługi podczas programowania oraz podpisane wersje do publikacji wariantów usługi na potrzeby dystrybucji. Chociaż nie konfigurujesz bezpośrednio wariantów kompilacji, konfigurujesz typy kompilacji i warianty usługi, które je tworzą. Utworzenie dodatkowych typów kompilacji lub wariantów usługi powoduje też utworzenie dodatkowych wariantów kompilacji. Aby dowiedzieć się, jak tworzyć warianty kompilacji i nimi zarządzać, przeczytaj omówienie Konfigurowanie wariantów kompilacji.
- Wpisy w pliku manifestu
- Wartości niektórych właściwości pliku manifestu możesz określić w konfiguracji wariantu kompilacji. Te wartości kompilacji zastępują istniejące wartości w pliku manifestu. Jest to przydatne, jeśli chcesz wygenerować wiele wariantów aplikacji z inną nazwą, minimalną wersją pakietu SDK lub docelową wersją pakietu SDK. Jeśli jest kilka plików manifestu, narzędzie łączące scala ich ustawienia.
- Zależności
- System kompilacji zarządza zależnościami projektu z lokalnego systemu plików i zdalnych repozytoriów. Oznacza to, że nie musisz ręcznie wyszukiwać, pobierać i kopiować pakietów binarnych zależności do katalogu projektu. Więcej informacji znajdziesz w artykule Dodawanie zależności kompilacji.
- Podpisywanie
- System kompilacji umożliwia określenie ustawień podpisywania w konfiguracji kompilacji i może automatycznie podpisywać aplikację podczas procesu kompilacji. System kompilacji podpisuje wersję debugowania domyślnym kluczem i certyfikatem, używając znanych danych logowania, aby uniknąć wyświetlania prośby o hasło podczas kompilacji. System kompilacji nie podpisuje wersji do publikacji, chyba że wyraźnie zdefiniujesz konfigurację podpisywania dla tej kompilacji. Jeśli nie masz klucza wersji, możesz go wygenerować zgodnie z opisem w artykule Podpisywanie aplikacji. Podpisane kompilacje do publikacji są wymagane do rozpowszechniania aplikacji w większości sklepów z aplikacjami.
- Zmniejszanie kodu i zasobów
- System kompilacji umożliwia określenie innego pliku reguł ProGuard dla każdego wariantu kompilacji. Podczas kompilowania aplikacji system kompilacji stosuje odpowiedni zestaw reguł, aby zmniejszyć kod i zasoby za pomocą wbudowanych narzędzi do zmniejszania, takich jak R8. Zmniejszenie kodu i zasobów może pomóc w zmniejszeniu rozmiaru pliku APK lub AAB.
- Obsługa wielu pakietów APK
- System kompilacji umożliwia automatyczne tworzenie różnych plików APK, z których każdy zawiera tylko kod i zasoby potrzebne do obsługi określonej gęstości ekranu lub interfejsu binarnego aplikacji (ABI). Więcej informacji znajdziesz w artykule o tworzeniu wielu plików APK. Zalecamy jednak opublikowanie jednego pakietu AAB, ponieważ umożliwia on podział według języka, gęstości ekranu i ABI, a jednocześnie eliminuje konieczność przesyłania wielu artefaktów do Google Play. Wszystkie nowe aplikacje przesłane po sierpniu 2021 r. muszą używać pakietów AAB.
Wersje Javy w kompilacjach Androida
Niezależnie od tego, czy kod źródłowy jest napisany w języku Java, Kotlin czy w obu tych językach, musisz wybrać JDK lub wersję języka Java dla kompilacji w kilku miejscach. Więcej informacji znajdziesz w artykule Wersje Javy w kompilacjach Androida.
Pliki konfiguracji kompilacji
Tworzenie niestandardowych konfiguracji kompilacji wymaga wprowadzenia zmian w co najmniej jednym pliku konfiguracji kompilacji. Te pliki tekstowe używają języka dziedzinowego (DSL) do opisywania logiki kompilacji i manipulowania nią za pomocą skryptu Kotlin, który jest odmianą języka Kotlin. Do konfigurowania kompilacji możesz też używać Groovy, który jest językiem dynamicznym dla maszyny wirtualnej Java (JVM).
Nie musisz znać skryptu Kotlin ani Groovy, aby rozpocząć konfigurowanie kompilacji, ponieważ wtyczka Androida do obsługi Gradle wprowadza większość potrzebnych elementów DSL. Więcej informacji o DSL wtyczki Androida do obsługi Gradle znajdziesz w dokumentacji referencyjnej DSL. Skrypt Kotlin opiera się też na Gradle Kotlin DSL.
Gdy rozpoczynasz nowy projekt, Android Studio automatycznie tworzy niektóre z tych plików i wypełnia je na podstawie odpowiednich wartości domyślnych. Omówienie utworzonych plików znajdziesz w artykule Struktura kompilacji Androida.
Plik Gradle Wrapper
Kod owijający Gradle (gradlew) to mała aplikacja dołączona do kodu źródłowego, która pobiera i uruchamia Gradle.
Dzięki temu kompilacja jest bardziej spójna. Deweloperzy pobierają źródło aplikacji i uruchamiają gradlew. Spowoduje to pobranie wymaganej dystrybucji Gradle i uruchomienie Gradle w celu utworzenia aplikacji.
Plik gradle/wrapper/gradle-wrapper.properties zawiera właściwość distributionUrl, która określa, która wersja Gradle jest używana do uruchamiania kompilacji.
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Plik ustawień Gradle
Plik settings.gradle.kts (w przypadku Kotlin DSL) lub settings.gradle (w przypadku Groovy DSL) znajduje się w głównym katalogu projektu. Ten plik ustawień definiuje ustawienia repozytorium na poziomie projektu i informuje Gradle, które moduły powinien uwzględnić podczas tworzenia aplikacji. W przypadku projektów wielomodułowych należy określić każdy moduł, który powinien znaleźć się w ostatecznej kompilacji.
W przypadku większości projektów plik domyślnie wygląda tak:
Kotlin
pluginManagement { /** * The pluginManagement.repositories block configures the * repositories Gradle uses to search or download the Gradle plugins and * their transitive dependencies. Gradle pre-configures support for remote * repositories such as JCenter, Maven Central, and Ivy. You can also use * local repositories or define your own remote repositories. Here we * define the Gradle Plugin Portal, Google's Maven repository, * and the Maven Central Repository as the repositories Gradle should use to look for its * dependencies. */ repositories { gradlePluginPortal() google() mavenCentral() } } dependencyResolutionManagement { /** * The dependencyResolutionManagement.repositories * block is where you configure the repositories and dependencies used by * all modules in your project, such as libraries that you are using to * create your application. However, you should configure module-specific * dependencies in each module-level build.gradle file. For new projects, * Android Studio includes Google's Maven repository and the Maven Central * Repository by default, but it does not configure any dependencies (unless * you select a template that requires some). */ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } } rootProject.name = "My Application" include(":app")
Dynamiczny
pluginManagement { /** * The pluginManagement.repositories block configures the * repositories Gradle uses to search or download the Gradle plugins and * their transitive dependencies. Gradle pre-configures support for remote * repositories such as JCenter, Maven Central, and Ivy. You can also use * local repositories or define your own remote repositories. Here we * define the Gradle Plugin Portal, Google's Maven repository, * and the Maven Central Repository as the repositories Gradle should use to look for its * dependencies. */ repositories { gradlePluginPortal() google() mavenCentral() } } dependencyResolutionManagement { /** * The dependencyResolutionManagement.repositories * block is where you configure the repositories and dependencies used by * all modules in your project, such as libraries that you are using to * create your application. However, you should configure module-specific * dependencies in each module-level build.gradle file. For new projects, * Android Studio includes Google's Maven repository and the Maven Central * Repository by default, but it does not configure any dependencies (unless * you select a template that requires some). */ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } } rootProject.name = "My Application" include ':app'
Plik kompilacji najwyższego poziomu
Plik najwyższego poziomu build.gradle.kts (w przypadku Kotlin DSL) lub build.gradle (w przypadku Groovy DSL) znajduje się w głównym katalogu projektu. Zwykle definiuje on typowe wersje wtyczek używanych przez moduły w projekcie.
Poniższy przykładowy kod opisuje ustawienia domyślne i elementy DSL w skrypcie kompilacji najwyższego poziomu po utworzeniu nowego projektu:
Kotlin
plugins { /** * Use `apply false` in the top-level build.gradle file to add a Gradle * plugin as a build dependency but not apply it to the current (root) * project. Don't use `apply false` in sub-projects. For more information, * see Applying external plugins with same version to subprojects. */ id("com.android.application") version "9.4.0" apply false id("com.android.library") version "9.4.0" apply false id("org.jetbrains.kotlin.android") version "2.4.10" apply false }
Dynamiczny
plugins { /** * Use `apply false` in the top-level build.gradle file to add a Gradle * plugin as a build dependency but not apply it to the current (root) * project. Don't use `apply false` in sub-projects. For more information, * see Applying external plugins with same version to subprojects. */ id 'com.android.application' version '9.4.0' apply false id 'com.android.library' version '9.4.0' apply false id 'org.jetbrains.kotlin.android' version '2.4.10' apply false }
Plik kompilacji na poziomie modułu
Plik build.gradle.kts (w przypadku DSL Kotlin) lub build.gradle (w przypadku DSL Groovy) na poziomie modułu znajduje się w każdym katalogu project/module/. Umożliwia skonfigurowanie ustawień kompilacji dla konkretnego modułu, w którym się znajduje. Skonfigurowanie tych ustawień kompilacji umożliwia udostępnianie niestandardowych opcji pakowania, takich jak dodatkowe typy kompilacji i warianty usługi, oraz zastępowanie ustawień w manifeście aplikacji main/ lub skrypcie kompilacji najwyższego poziomu.
Ustawienia pakietu Android SDK
Plik kompilacji na poziomie modułu aplikacji zawiera ustawienia, które wskazują wersje pakietu Android SDK używane podczas kompilowania, wybierania zachowań platformy i określania minimalnej wersji, na której działa aplikacja.
-
compileSdk -
compileSdkokreśla, które interfejsy API Androida i Javy są dostępne podczas kompilowania kodu źródłowego. Aby korzystać z najnowszych funkcji Androida, podczas kompilowania używaj najnowszego pakietu Android SDK.Niektóre interfejsy API platformy Androida mogą być niedostępne na starszych poziomach interfejsu API. Możesz warunkowo chronić korzystanie z nowszych funkcji lub używać bibliotek zgodności AndroidX, aby korzystać z nowszych funkcji na niższych poziomach interfejsu API Androida.
Każdy pakiet Android SDK udostępnia podzbiór interfejsów API Javy do użycia w aplikacji. Tabela w sekcji Których interfejsów API Javy mogę używać w kodzie źródłowym Javy lub Kotlina pokazuje, który poziom interfejsu API Javy jest dostępny w zależności od wersji pakietu Android SDK. Nowsze interfejsy API Javy są obsługiwane we wcześniejszych wersjach Androida dzięki odlukrzaniu, które musi być włączone w kompilacji.
Jeśli musisz skompilować kod pod kątem konkretnego poziomu API, użyj rozszerzonej składni bloku
compileSdki określminorApiLevel:Kotlin
android { compileSdk { version = release(36) { minorApiLevel = 1 } } }
Dynamiczny
android { compileSdk { version = release(36) { minorApiLevel = 1 } } }
Android Studio wyświetla ostrzeżenia, jeśli
compileSdkjest w konflikcie z bieżącą wersją Androida Studio, AGP lub wymaganiami dotyczącymi zależności biblioteki projektu. -
minSdk -
minSdkokreśla najniższą wersję Androida, którą ma obsługiwać Twoja aplikacja. UstawienieminSdkogranicza urządzenia, na których można zainstalować aplikację.Obsługa starszych wersji Androida może wymagać większej liczby kontroli warunkowych w kodzie lub częstszego korzystania z bibliotek zgodności AndroidX. Należy porównać koszty utrzymania starszych wersji z odsetkiem użytkowników, którzy nadal z nich korzystają. Aby sprawdzić aktualne wartości procentowe użycia wersji, zobacz tabelę wersji w kreatorze nowego projektu w Android Studio.
Podczas edytowania kodu w Android Studio lub przeprowadzania kontroli podczas kompilacji narzędzie lint ostrzeże Cię o używanych interfejsach API, które nie są dostępne w
minSdk. Aby rozwiązać te problemy, ustaw nowsze funkcje jako warunkowe lub użyjAppcompatw celu zapewnienia zgodności wstecznej. -
targetSdk -
targetSdkma 2 zastosowania:- Określa działanie aplikacji w czasie działania.
- Potwierdza, która wersja Androida została przetestowana.
Jeśli uruchomisz aplikację na urządzeniu z Androidem w wersji wyższej niż
targetSdk, Android uruchomi ją w trybie zgodności, który działa podobnie do niższej wersji wskazanej wtargetSdk. Na przykład gdy w interfejsie API 23 wprowadzono model uprawnień w czasie działania, nie wszystkie aplikacje były gotowe do natychmiastowego wdrożenia. UstawienietargetSdkna 22 pozwalało na uruchamianie tych aplikacji na urządzeniach z interfejsem API na poziomie 23 bez używania uprawnień w czasie działania i umożliwiało korzystanie z funkcji dostępnych w najnowszej wersjicompileSdk. Zasady dystrybucji w Google Play wymuszają dodatkowe zasady dotyczące docelowego poziomu interfejsu API.Wartość
targetSdknie jest powiązana z wartościącompileSdk. Możesz na przykład mieć wartośćtargetSdk, która jest wyższa, taka sama lub niższa niżcompileSdk.
Uwaga: wartości compileSdk i targetSdk nie muszą być takie same. Pamiętaj o tych podstawowych zasadach:
compileSdkzapewnia dostęp do nowych interfejsów APItargetSdkokreśla zachowanie aplikacji w czasie działania
Przykładowy skrypt kompilacji modułu aplikacji
Ten przykładowy skrypt kompilacji modułu aplikacji na Androida przedstawia niektóre podstawowe elementy i ustawienia DSL:
Kotlin
/** * The first section in the build configuration applies the Android Gradle plugin * to this build and makes the android block available to specify * Android-specific build options. */ plugins { id("com.android.application") } /** * Locate (and possibly download) a JDK used to build your kotlin * source code. This also acts as a default for sourceCompatibility, * targetCompatibility and jvmTarget. Note that this does not affect which JDK * is used to run the Gradle build itself, and does not need to take into * account the JDK version required by Gradle plugins (such as the * Android Gradle Plugin) */ kotlin { jvmToolchain(11) } /** * The android block is where you configure all your Android-specific * build options. */ android { /** * The app's namespace. Used primarily to access app resources. */ namespace = "com.example.myapp" /** * compileSdk specifies the Android API level Gradle should use to * compile your app. This means your app can use the API features included in * this API level and lower. */ compileSdk = 36 /** * The defaultConfig block encapsulates default settings and entries for all * build variants and can override some attributes in main/AndroidManifest.xml * dynamically from the build system. You can configure product flavors to override * these values for different versions of your app. */ defaultConfig { // Uniquely identifies the package for publishing. applicationId = "com.example.myapp" // Defines the minimum API level required to run the app. minSdk = 23 // Specifies the API level used to test the app. targetSdk = 36 // Defines the version number of your app. versionCode = 1 // Defines a user-friendly version name for your app. versionName = "1.0" } /** * The buildTypes block is where you can configure multiple build types. * By default, the build system defines two build types: debug and release. The * debug build type is not explicitly shown in the default build configuration, * but it includes debugging tools and is signed with the debug key. The release * build type applies ProGuard settings and is not signed by default. */ buildTypes { /** * By default, Android Studio configures the release build type to enable code * shrinking, using minifyEnabled, and specifies the default ProGuard rules file. */ getByName("release") { isMinifyEnabled = true // Enables code shrinking for the release build type. proguardFiles( getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" ) } } /** * The productFlavors block is where you can configure multiple product flavors. * This lets you create different versions of your app that can * override the defaultConfig block with their own settings. Product flavors * are optional, and the build system does not create them by default. * * This example creates a free and paid product flavor. Each product flavor * then specifies its own application ID, so that they can exist on the Google * Play Store or an Android device simultaneously. * * If you declare product flavors, you must also declare flavor dimensions * and assign each flavor to a flavor dimension. */ flavorDimensions += "tier" productFlavors { create("free") { dimension = "tier" applicationId = "com.example.myapp.free" } create("paid") { dimension = "tier" applicationId = "com.example.myapp.paid" } } /** * To override source and target compatibility (if different from the * toolchain JDK version), add the following. All of these * default to the same value as kotlin.jvmToolchain. If you're using the * same version for these values and kotlin.jvmToolchain, you can * remove these blocks. */ //compileOptions { // sourceCompatibility = JavaVersion.VERSION_11 // targetCompatibility = JavaVersion.VERSION_11 //} //kotlinOptions { // jvmTarget = "11" //} } /** * The dependencies block in the module-level build configuration file * specifies dependencies required to build only the module itself. * To learn more, go to Add build dependencies. */ dependencies { implementation(project(":lib")) implementation("androidx.appcompat:appcompat:1.8.0") implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) }
Dynamiczny
/** * The first line in the build configuration applies the Android Gradle plugin * to this build and makes the android block available to specify * Android-specific build options. */ plugins { id 'com.android.application' } /** * Locate (and possibly download) a JDK used to build your kotlin * source code. This also acts as a default for sourceCompatibility, * targetCompatibility and jvmTarget. Note that this does not affect which JDK * is used to run the Gradle build itself, and does not need to take into * account the JDK version required by Gradle plugins (such as the * Android Gradle Plugin) */ kotlin { jvmToolchain 11 } /** * The android block is where you configure all your Android-specific * build options. */ android { /** * The app's namespace. Used primarily to access app resources. */ namespace 'com.example.myapp' /** * compileSdk specifies the Android API level Gradle should use to * compile your app. This means your app can use the API features included in * this API level and lower. */ compileSdk 36 /** * The defaultConfig block encapsulates default settings and entries for all * build variants and can override some attributes in main/AndroidManifest.xml * dynamically from the build system. You can configure product flavors to override * these values for different versions of your app. */ defaultConfig { // Uniquely identifies the package for publishing. applicationId 'com.example.myapp' // Defines the minimum API level required to run the app. minSdk 23 // Specifies the API level used to test the app. targetSdk 36 // Defines the version number of your app. versionCode 1 // Defines a user-friendly version name for your app. versionName "1.0" } /** * The buildTypes block is where you can configure multiple build types. * By default, the build system defines two build types: debug and release. The * debug build type is not explicitly shown in the default build configuration, * but it includes debugging tools and is signed with the debug key. The release * build type applies ProGuard settings and is not signed by default. */ buildTypes { /** * By default, Android Studio configures the release build type to enable code * shrinking, using minifyEnabled, and specifies the default ProGuard rules file. */ release { minifyEnabled true // Enables code shrinking for the release build type. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } /** * The productFlavors block is where you can configure multiple product flavors. * This lets you create different versions of your app that can * override the defaultConfig block with their own settings. Product flavors * are optional, and the build system does not create them by default. * * This example creates a free and paid product flavor. Each product flavor * then specifies its own application ID, so that they can exist on the Google * Play Store or an Android device simultaneously. * * If you declare product flavors, you must also declare flavor dimensions * and assign each flavor to a flavor dimension. */ flavorDimensions "tier" productFlavors { free { dimension "tier" applicationId 'com.example.myapp.free' } paid { dimension "tier" applicationId 'com.example.myapp.paid' } } /** * To override source and target compatibility (if different from the * tool chain JDK version), add the following. All of these * default to the same value as kotlin.jvmToolchain. If you're using the * same version for these values and kotlin.jvmToolchain, you can * remove these blocks. */ //compileOptions { // sourceCompatibility JavaVersion.VERSION_11 // targetCompatibility JavaVersion.VERSION_11 //} //kotlinOptions { // jvmTarget = '11' //} } /** * The dependencies block in the module-level build configuration file * specifies dependencies required to build only the module itself. * To learn more, go to Add build dependencies. */ dependencies { implementation project(":lib") implementation 'androidx.appcompat:appcompat:1.8.0' implementation fileTree(dir: 'libs', include: ['*.jar']) }
Pliki właściwości Gradle
Gradle zawiera też 2 pliki właściwości, które znajdują się w głównym katalogu projektu i których możesz używać do określania ustawień samego zestawu narzędzi do kompilacji Gradle:
-
gradle.properties - W tym miejscu możesz skonfigurować ustawienia Gradle dla całego projektu, takie jak maksymalny rozmiar sterty demona Gradle. Więcej informacji znajdziesz w artykule Środowisko kompilacji.
-
local.properties -
Konfiguruje właściwości środowiska lokalnego dla systemu kompilacji, w tym:
ndk.dir– ścieżka do NDK. Ta właściwość została wycofana. Wszystkie pobrane wersje NDK są instalowane w katalogundkw katalogu Android SDK.sdk.dir– ścieżka do pakietu Android SDK.cmake.dir– ścieżka do CMake.ndk.symlinkdir– w Android Studio 3.5 i nowszych tworzy dowiązanie symboliczne do NDK, które może być krótsze niż ścieżka zainstalowanego NDK.
Zmapowanie NDK na krótszą ścieżkę (tylko w systemie Windows)
W systemie Windows narzędzia w zainstalowanym folderze NDK, takie jak ld.exe, mają długie ścieżki. Narzędzia nie obsługują dobrze długich ścieżek.
Aby utworzyć krótszą ścieżkę, w pliku local.properties ustaw właściwość ndk.symlinkdir, aby poprosić wtyczkę Androida do obsługi Gradle o utworzenie dowiązania symbolicznego do NDK. Ścieżka tego dowiązania symbolicznego może być krótsza niż istniejący folder NDK.
Na przykład ndk.symlinkdir = C:\ powoduje utworzenie tego dowiązania symbolicznego:
C:\ndk\19.0.5232133
Synchronizowanie projektu z plikami Gradle
Gdy wprowadzisz zmiany w plikach konfiguracji kompilacji w projekcie, Android Studio wymaga zsynchronizowania plików projektu, aby można było zaimportować zmiany w konfiguracji kompilacji i przeprowadzić pewne testy, które pozwolą upewnić się, że konfiguracja nie powoduje błędów kompilacji.
Aby zsynchronizować pliki projektu, kliknij Synchronizuj teraz na pasku powiadomień, który pojawia się po wprowadzeniu zmiany (jak na rysunku 2), lub kliknij Synchronizuj projekt
na pasku menu. Jeśli Android Studio znajdzie błędy w konfiguracji – na przykład kod źródłowy używa funkcji interfejsu API, które są dostępne tylko na poziomie interfejsu API wyższym niż compileSdkVersion – w oknie Wiadomości pojawi się opis problemu.
Zbiory źródeł
Android Studio logicznie grupuje kod źródłowy i zasoby każdego modułu w zbiory źródeł. Gdy tworzysz nowy moduł, Android Studio tworzy w nim zbiór źródeł main/. Zbiór źródeł main/ modułu zawiera kod i zasoby używane przez wszystkie jego warianty kompilacji.
Dodatkowe katalogi zbiorów źródeł są opcjonalne, a Android Studio nie tworzy ich automatycznie podczas konfigurowania nowych wariantów kompilacji. Jednak utworzenie zbiorów źródeł, podobnie jak w przypadku main/, pomaga uporządkować pliki i zasoby, których Gradle powinien używać tylko podczas kompilowania określonych wersji aplikacji:
-
src/main/ - Ten zbiór źródeł zawiera kod i zasoby wspólne dla wszystkich wariantów kompilacji.
-
src/buildType/ - Utwórz ten zbiór źródeł, aby uwzględnić kod i zasoby tylko dla określonego typu kompilacji.
-
src/productFlavor/ -
Utwórz ten zbiór źródeł, aby uwzględnić kod i zasoby tylko dla konkretnego wariantu usługi.
Uwaga: jeśli skonfigurujesz kompilację tak, aby łączyła wiele wariantów usługi, możesz utworzyć katalogi zbiorów źródeł dla każdej kombinacji wariantów usługi między wymiarami rodzajów:
src/productFlavor1ProductFlavor2/. -
src/productFlavorBuildType/ - Utwórz ten zbiór źródeł, aby uwzględnić kod i zasoby tylko dla konkretnego wariantu kompilacji.
Na przykład, aby wygenerować wersję „fullDebug” aplikacji, system kompilacji scala kod, ustawienia i zasoby z tych zbiorów źródeł:
-
src/fullDebug/(zbiór źródeł wariantu kompilacji) -
src/debug/(zbiór źródeł typu kompilacji) -
src/full/(zbiór źródeł wariantu usługi) -
src/main/(główny zbiór źródeł)
Uwaga: gdy tworzysz nowy plik lub katalog w Android Studio, użyj opcji menu Plik > Nowy, aby utworzyć go dla konkretnego zbioru źródeł. Zbiory źródeł, które możesz wybrać, zależą od konfiguracji kompilacji. Android Studio automatycznie tworzy wymagane katalogi, jeśli jeszcze nie istnieją.
Jeśli różne zbiory źródeł zawierają różne wersje tego samego pliku, Gradle używa tej kolejności priorytetów, aby zdecydować, którego pliku użyć. Zbiory źródeł po lewej stronie zastępują pliki i ustawienia zbiorów źródeł po prawej stronie:
wariant kompilacji > typ kompilacji > wariant usługi > główny zbiór źródeł > zależności biblioteki
Dzięki temu Gradle może używać plików, które są specyficzne dla wariantu kompilacji, który próbujesz utworzyć, a jednocześnie ponownie wykorzystywać aktywności, logikę aplikacji i zasoby, które są wspólne dla innych wersji aplikacji.
Podczas scalania wielu plików manifestu Gradle używa tej samej kolejności priorytetów, dzięki czemu każdy wariant kompilacji może definiować różne komponenty lub uprawnienia w ostatecznym pliku manifestu. Więcej informacji o tworzeniu niestandardowych zbiorów źródeł znajdziesz w artykule Tworzenie zbiorów źródeł.
Katalogi wersji
Jeśli kompilacja zawiera wiele modułów ze wspólnymi zależnościami lub masz wiele niezależnych projektów ze wspólnymi zależnościami, zalecamy użycie katalogu wersji lub zestawienia komponentów (BOM) do określenia wspólnych wersji.
Inne systemy kompilacji
Tworzenie aplikacji na Androida za pomocą Bazela jest możliwe, ale nie jest oficjalnie obsługiwane. Android Studio nie obsługuje oficjalnie projektów Bazel.
Aby dowiedzieć się więcej o obecnych ograniczeniach kompilowania za pomocą Bazela, zapoznaj się ze znanymi problemami.