OSTRZEŻENIE: Interfejs API „variant.getJavaCompile ()” jest przestarzały i został zastąpiony przez „variant.getJavaCompileProvider ()”

199

Nagle podczas synchronizacji Gradle pojawia się ten błąd:

OSTRZEŻENIE: Interfejs API „variant.getJavaCompile ()” jest przestarzały i został zastąpiony przez „variant.getJavaCompileProvider ()”. Zostanie usunięty pod koniec 2019 roku. Aby uzyskać więcej informacji, zobacz https://d.android.com/r/tools/task-configuration-avoidance Dotknięte moduły: aplikacja

Mam to build.gradledla modułu aplikacji:

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'
apply plugin: 'com.google.gms.google-services'

apply plugin: 'io.fabric'

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.2"
    defaultConfig {
        applicationId "..."
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "..."
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        versionNameSuffix = version_suffix

        [...]
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

            [...]
        }
        debug {
            [...]
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.61"
    implementation 'androidx.appcompat:appcompat:1.0.0-rc02'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation "com.android.support:preference-v7:28.0.0"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'
    implementation 'com.google.android.material:material:1.0.0-rc02'

    [...]
}

Mogę poprawnie skompilować aplikację, ale trochę mnie to niepokoi, a jak widzę, coś przestanie działać pod koniec 2019 roku. Jakieś pomysły na to, co to jest i jak to rozwiązać?

Arnyminer Z
źródło
Ostrzeżenie to nie błąd. Nawet z ostrzeżeniem kod powinien się kompilować w ten sam sposób, podczas gdy błąd spowodowałby niepowodzenie kompilacji. Jest tylko zaawansowana informacja, że ​​obecny sposób robienia rzeczy może nie działać w przyszłości i prawdopodobnie zostanie naprawiony dzięki aktualizacjom wtyczek. Czy poświęciłeś również czas na przeczytanie strony, do której link zawiera błąd ?
Michael Dodd,
2
Osobiście uważam, że jest to spowodowane wtyczką, która nie została zaktualizowana do używania nowego interfejsu API Gradle, który powinien naprawić się z czasem.
Michael Dodd,
Spójrz na tę odpowiedź. stackoverflow.com/questions/52412023/…
Rahul Kushwaha
Spróbuj tego. stackoverflow.com/a/55193824/3806413
0xAliHn

Odpowiedzi:

81

Ten problem został rozwiązany teraz dzięki aktualizacji Fabric Gradle w wersji 1.30.0:

Aktualizacja wydania: 19 marca 2019 r

Proszę zobaczyć ten link: https://docs.fabric.io/android/changelog.html#march-15-2019

Zaktualizuj swoją zależność od ścieżki klas na poziomie projektu Stopień:

buildscript {
    // ... repositories, etc. ...

    dependencies {
        // ...other dependencies ...
        classpath 'io.fabric.tools:gradle:1.30.0'
    }
}
M.Noman
źródło
2
Jest to również poprawna odpowiedź, łatwy sposób na rozwiązanie problemu.
M.Noman
5
Mam teraz classpath 'io.fabric.tools:gradle:1.29.0'. Co powinienem zrobić?
Faizan Mubasher
7
@FaizanMubasher spróbuj obniżyć usługę Google do wersji 4.2
Infinite Loops
4
Wydaje się, że @InfiniteLoops sugeruje obniżenie wersji do 4.2.
HondaGuy,
1
Uaktualniono tkaninę do wersji 1.31.0 i
obniżono jakość
94

Ten problem występuje po aktualizacji do wersji 3.3.0

Jeśli nie robisz tego, co wskazuje na błąd w pliku stopniowym, przyczyną może być pewna wtyczka, która nie zaktualizowała się do nowszego interfejsu API. Aby dowiedzieć się, która wtyczka, wykonaj następujące czynności (jak wyjaśniono w „Lepszych informacjach debugowania przy użyciu przestarzałego interfejsu API” ogłoszenia 3.3.0 ):

  • Dodaj „android.debug.obsoleteApi = true” do pliku gradle.properties , który będzie rejestrować błąd z większą ilością szczegółów
  • Spróbuj ponownie i przeczytaj szczegóły dziennika. Pojawi się ślad „problematycznej” wtyczki
  • Kiedy się zidentyfikujesz, spróbuj go wyłączyć i sprawdź, czy problem zniknął, tylko dla pewności
  • wejdź na stronę github wtyczki i stwórz problem, który będzie zawierał szczegółowy dziennik i jasny opis, abyś mógł pomóc programistom naprawić to dla wszystkich szybciej
  • bądź cierpliwy, dopóki to naprawią, albo naprawisz i stworzysz PR dla programistów

Mam nadzieję, że pomaga innym

Ewoks
źródło
4
Moim zdaniem jest to najbardziej ogólna, użyteczna odpowiedź. W moim przypadku to ostrzeżenie jest emitowane z powodu użycia wtyczki Groovy-Android (do testów Spock).
AutonomousApps
2
To jest właściwa odpowiedź. Kto głosował za aktualizacją wersji stopniowej?
Pier Betos
To również działało dla mnie, czy jest coś nowego w tej sprawie? Tymczasem nie ma nic, co moglibyśmy zrobić, prawda?
Billyjoker,
1
Naprawdę pomocny. W moim przypadku była to wtyczka Hugo.
AlvaroSantisteban
6
po dodaniu android.debug.obsoleteApi=trueAby przeczytać zarejestrowane dane: Przejdź do zakładki Kompilacja u dołu iw oknie „Kompiluj wyjście” kliknij „Przełącz widok”. Kiedy klikniesz, że ładne, kolory znikają, przewiń na górę tam, gdzie jest napisane WARNING: API 'variant.getAssemble()' is obsolete. Potem poniżej pokazuje, że REASON: Called from: ... w moim przypadku było to spowodowane przez medium.com/@xabaras/...
Someone Somewhere
62

W moim przypadku było to spowodowane usługami gms 4.3.0. Więc musiałem to zmienić na:

com.google.gms:google-services:4.2.0

Znalazłem to, uruchamiając:

gradlew sync -Pandroid.debug.obsoleteApi=true

w terminalu. Przejdź do widoku -> okna narzędzi -> Terminal w Android Studio.

Numan Karaaslan
źródło
w Ubuntu, nie można uruchomić tego polecenia, jak mogę to zrobić w Ubuntu. z prośbą o zainstalowanie pakietu, a ja instaluję ten pakiet nadal nie mogę uruchomić. czy jest jakiś inny sposób?
Vasudev Vyas
3
Właśnie zmieniłem moją usługę Google GMS na 4.2 i ostrzeżenie zniknęło dzięki.
Infinite Loops
2
@VasudevVyas, jeśli w Android Studio, po prostu dodaj ./przed poleceniem, to znaczy, jeśli terminal jest ustawiony na katalog główny projektu Android. W przeciwnym razie będziesz musiał wykonać cd do katalogu głównego projektu.
Racu
3
Dlaczego powinienem obniżyć zależność usług Google. To nie jest rozwiązanie.
Ahamadullah Saikat,
4
@AhamadullahSaikat prawdopodobnie zostanie to naprawione w przyszłych wydaniach. Następnie możesz go ponownie zaktualizować. Jest to obejście, dopóki nie zostanie naprawione przez Google.
Numan Karaaslan
34

To tylko ostrzeżenie i prawdopodobnie zostanie naprawione przed 2019 r. Dzięki aktualizacjom wtyczek, więc nie martw się o to. Polecam korzystanie z kompatybilnych wersji wtyczek i gradle.

Tutaj możesz sprawdzić wersję wtyczki i wersję stopniową, aby uzyskać lepsze wrażenia i wydajność.

https://developer.android.com/studio/releases/gradle-plugin

Spróbuj użyć stabilnych wersji, aby uzyskać płynny kod bez ostrzeżeń / błędów.

Harshil Shah
źródło
24
W rzeczywistości jest bardziej podstępny niż tylko ostrzeżenie - działa na edytorze kodu i uniemożliwia wyszukiwanie odniesień do klas.
IgorGanapolsky
dzieje się tak nie tylko w wersjach deweloperskich / kanaryjskich, ale także w stabilnych, ale wydaje mi się, że jest to ostrzeżenie, że przy nowszych aktualizacjach zostaną naprawione.
Marlon López
1
@HarshilShah nie ma gwarancji, że problematyczna wtyczka zostanie kiedykolwiek zaktualizowana. Programiści mogą nawet nie wiedzieć o tym problemie. Z tego powodu najlepsze, co możemy zrobić, to: stackoverflow.com/a/54213973/304270
Ewoks
25

Zetknąłem się również z tym samym problemem. Po pewnym czasie doszedłem do wniosku, że pojawiło się ostrzeżenie z powodu użycia najnowszej wersji google-serviceswtyczki (wersja 4.3.0). Nawiasem mówiąc, używałem tej wtyczki do funkcjonalności Firebase w mojej aplikacji. Wszystko, co zrobiłem, to obniżyć wersję mojej google-serviceswtyczki w buildscript w pliku poziomu build.gradle (Projekt) w następujący sposób:

buildscript{
    dependencies {
       // From =>
       classpath 'com.google.gms:google-services:4.3.0'
       // To =>
       classpath 'com.google.gms:google-services:4.2.0'
    }
}
Fahad Javed
źródło
1
Zrobiłem to rozwiązanie i błąd zniknął. Dziękuję
wesley franks
1
Pracujący! Dzięki
Сергей
3
Uaktualniłem do 4.3.2 bez powrotu tego ostrzeżenia.
tagy22
10

Zmień wersję usług Google z build.gradle:

dependencies {
  classpath 'com.google.gms:google-services:4.2.0'
}
Bahman Omidipour
źródło
1
Korzystam z wersji 4.3.0 i problem nadal występuje.
wesley franks
@wesleyfranks to samo. Ale jeśli
przejdę
Jestem na wersji 4.3.1 i problem nadal istnieje
palkle
8

Jest to ostrzeżenie wyrzucone przez narzędzia do budowania z dwóch powodów.
1. Jedna z wtyczek korzysta z Task zamiast TaskProvider, nic nie możemy zrobić.
2. Skonfigurowałeś użycie zadania, o ile obsługuje ono TaskProvider.

WARNING: API 'variant.getGenerateBuildConfig()' is obsolete and has been replaced with 'variant.getGenerateBuildConfigProvider()'.
It will be removed at the end of 2019.
For more information, see https://d.android.com/r/tools/task-configuration-avoidance

WARNING: API 'variant.getJavaCompile()' is obsolete and has been replaced with 'variant.getJavaCompileProvider()'.
It will be removed at the end of 2019.
For more information, see https://d.android.com/r/tools/task-configuration-avoidance

WARNING: API 'variant.getMergeResources()' is obsolete and has been replaced with 'variant.getMergeResourcesProvider()'.
It will be removed at the end of 2019.
For more information, see https://d.android.com/r/tools/task-configuration-avoidance

Uważaj na fragmenty jak poniżej i aktualizuj.

android {
    <library|application>Variants.all { variant ->
        /* Disable Generating Build config */
        // variant.generateBuildConfig.enabled = true // <- Deprecated
        variant.generateBuildConfigProvider.configure {
            it.enabled = true // Replacement
        }
    }
}

Podobnie znaleźć zwyczaje 'variant.getJavaCompile()'albo 'variant.javaCompile', 'variant.getMergeResources()'albo 'variant.mergeResources'. Wymień jak wyżej.

Więcej informacji na stronie Unikanie konfiguracji zadania

VenomVendor
źródło
1
Dzieje się tak w każdym projekcie Android Studio. Nie ma nic wspólnego z fragmentami, o których wspominałeś ...
IgorGanapolsky,
2
@IgorGanapolsky, Stałoby się to również w terminalu. Spróbuj wykonać ./gradlew. To nie ma nic wspólnego z AS, jest w narzędziach do kompilacji. Uaktualnij / obniż do com.android.tools.build:gradle:3.2.0i wykonaj ./gradlew. To nie nadejdzie.
VenomVendor
Nie znalazłem variant.generateBuildConfig.enabledw moim projekcie. Nadal
pojawia się
Nie znalazłem variant.generateBuildConfig.enabledw moim projekcie. Nadal
pojawia się
@VenomVendor To jest najbardziej użyteczna odpowiedź na mój problem. Czy nadal możesz pomóc z tym fragmentem kodu? codehare.io/G6ogzk
Raghav Satyadev
5

Obniżenie wersji Gradle działało dla mnie:

classpath 'com.android.tools.build:gradle:3.2.0'
Naimish Verma
źródło
4
obniżenie standardu nigdy nie jest opcją
Roshana Pitigala
To jest odpowiedź, czego chcę. Dziękuję!
anKotliner
obniżenie
oceny
5

1) Dodaj android.debug.obsoleteApi=truedo swojego gradle.properties. Pokaże, na które moduły ma wpływ dziennik ostrzegawczy.

2) Zaktualizuj te przestarzałe funkcje.

  • variant.javaCompile do variant.javaCompileProvider

  • variant.javaCompile.destinationDir do variant.javaCompileProvider.get().destinationDir

Morgan Koh
źródło
5

Aktualizacja wersji Kotlin ( wtyczki i stdLib ) do 1.3.1 rozwiązała to ostrzeżenie w moim przypadku. Zaktualizuj wersję Kotlin w całym projekcie, zastępując istniejącą wersję Kotlin:

ext.kotlin_version = '1.3.50'
erluxman
źródło
ext.kotlin_version = „1.3.10” lub „1.3.50”
Pushkin
to był mój problem. wcześniej był ext.kotlin_version = '1.2.71'… Zmieniłem to na powyższą odpowiedź i działało dobrze! - /android/iosflutter create .ext.kotlin_version = '1.2.71'build.gradle
usunąłem
4

Wróć ze ścieżki klasy „com.android.tools.build:gradle:3.3.0-alpha13” do ścieżki klasy „com.android.tools.build:gradle:3.2.0”

to działało dla mnie

Eben Watts
źródło
6
to tylko tymczasowe obejście, ponieważ nie możesz wiecznie pozostać przy wersji 3.2.0, szczególnie gdy wersja 3.3.0 jest już dostępna
Ewoks
wersja obniżona nie jest opcją! .
Jorgesys,
4

Zaktualizuj wtyczkę do najnowszej wersji pliku Gradle na poziomie projektu (nie na poziomie aplikacji). W moim przypadku ta linia rozwiązała problem

classpath 'io.fabric.tools:gradle:1.25.4'

do

classpath 'io.fabric.tools:gradle:1.29.0'
Bibaswann Bandyopadhyay
źródło
3

W moim przypadku

build.gradle(Project)

był

ext.kotlin_version = '1.2.71'

zaktualizowano do

ext.kotlin_version = '1.3.0'

wygląda na to, że problem już minął

Sam
źródło
2

W moim przypadku musiałem skomentować com.google.firebase.firebase-crashwtyczkę:

apply plugin: 'com.android.application'
// apply plugin: 'com.google.firebase.firebase-crash' <== this plugin causes the error

Jest to błąd, ponieważ Android Studio 3.3.0

Anggrayudi H.
źródło
2
Dla mnie dzieje się tak, ponieważ używamoss-licenses-plugin
Michaił
2

Aktualizacja od poziomu do stopnia: 3.3.0

Domyślne zadanie „montuje” dotyczy tylko normalnych wariantów. Dodaj również warianty testowe.

android.testVariants.all { variant ->
    tasks.getByName('assemble').dependsOn variant.getAssembleProvider()
}

również komentarz zastosować tkaninę

//apply plugin: 'io.fabric'
Krste Moskov
źródło
1
Jakie są „normalne” warianty? Do czego służy kod android.testVariants.all {...} (jaki jest jego cel)? Skąd pochodzi ten cytowany tekst? Czy możesz zaktualizować odpowiedź?
Ewoks
Zmieniłem ścieżkę manifestu dla chrashlytyków crashlytics { manifestPath = "$buildDir/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml" }
ANRI
1
@Ewoks normalne warianty to warianty kompilacji (debugowanie / wydanie), które używają określonego zestawu reguł. Możesz ustawić wiele różnych wariantów (smaków). Dodatkowo możesz tworzyć testowe zestawy źródłowe, które są ukierunkowane na określone warianty kompilacji.
Krste Moskov
Wiem o smakach, ale nie jestem pewien, czy dotyczy to tutaj i jak jest to powiązane. Właśnie dlatego zapytałem, czy możesz zaktualizować odpowiedź, wyjaśniając, jakie źródło zacytowałeś i naprawić formatowanie (chyba mieszane formatowanie kodu z komentarzem)
Ewoks
1
Nie ma gwarancji, że materiał był w ogóle źródłem problemu. W rzeczywistości z tym „rozwiązaniem” nie mamy pojęcia, gdzie był problem. Ponadto nie ma wyjaśnienia, dlaczego robić cokolwiek z testVariants i jaki to ma związek?!? Dlatego oryginalna odpowiedź @KrsteMoskov jest myląca i dotyczy tylko konkretnego przypadku użycia, jeśli w ogóle coś rozwiązuje. Aby pomóc Ci wejść na pokład, sformatowałem twoją odpowiedź poprawnie i zostawiłem treść tak, jak ją napisałeś, aby inni mogli zdecydować, czy jest to dla nich przydatne
Ewoks
2

Gdy wtyczka wykryje, że używasz interfejsu API, który nie jest już obsługiwany, może teraz dostarczyć bardziej szczegółowych informacji, które pomogą ci określić, gdzie ten interfejs API jest używany. Aby zobaczyć dodatkowe informacje, musisz dołączyć następujące elementy do pliku gradle.properties swojego projektu:

android.debug.obsoleteApi=true
Hamed Safari
źródło
gdzie build, grad lub app.gradle
Jithish PN
po prostu wyszukaj plik gradle.properties w swoim projekcie
Hamed safari
2

jeśli usunę ten wiersz z application gradle:

apply plugin: 'io.fabric'

błąd już się nie pojawi.

Link referencyjny github

Muhammad Waleed
źródło
1
NIE RÓB TO, w przeciwnym razie Crashlytics przestanie działać. To tylko ukrywa problem.
Roger Oba,
2

Przeprowadź migrację projektu do systemu AndroidX.

zależności są uaktualniane do systemu AndroidX. więc jeśli chcesz korzystać z zawartości systemu AndroidX, przenieś swój projekt do systemu AndroidX.

W Android Studio 3.2 i nowszych wersjach możesz szybko migrować istniejący projekt do AndroidX, wybierając Refactor> Migruj do AndroidX z paska menu.

Zmniejszenie zależności może tym razem rozwiązać Twój problem - ale nie jest to zalecane

Adarsh ​​Vijayan P.
źródło
1
Mam AndroidX i wciąż otrzymuję wiadomość.
Jorgesys,
1

To rozwiązało mój problem. Wystarczyło obniżyć wersję wtyczki usług Google w buildscript w pliku build.gradle (Project) w następujący sposób

buildscript{
     dependencies {
        // From =>
        classpath 'com.google.gms:google-services:4.3.0'
        // To =>
        classpath 'com.google.gms:google-services:4.2.0'
        // Add dependency
        classpath 'io.fabric.tools:gradle:1.28.1'
    }
}
Ali Sampson
źródło
0

Oto tymczasowe obejście, jeśli korzystasz z pokoju, po prostu uaktualnij do wersji 1.1.0 lub nowszej

implementation "android.arch.persistence.room:runtime:1.1.0"

usuwa to ostrzeżenie dla mnie.

Sergio KS
źródło
tak, kiedy aktualizuję wersję, te ostrzeżenia zniknęły
Sergio KS
0

trzymaj Projekt (nie aplikacja) Zależności Build.gradle kod wersji ścieżka klasy jest nowa

 dependencies {
    classpath 'com.android.tools.build:gradle:3.5.0-beta01'
    classpath 'com.novoda:bintray-release:0.8.1'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
Ven Ren
źródło
0

To popularne pytanie. Jeśli nie skorzystasz z tych metod, rozwiązaniem będzie aktualizacja bibliotek. Zaktualizuj swoją wersję kotlin i wszystkie swoje zależności, takie jak fabric , protobuf itp. Jeśli masz pewność, że wszystko zaktualizowałeś, spróbuj zapytać autora biblioteki.

monyag
źródło
0

Aktualizacja wtyczki protobuf-gradle do wersji 0.8.10 rozwiązała mój problem. Zamień swój istniejący protobuf na

classpath 'gradle.plugin.com.google.protobuf:protobuf-gradle-plugin:0.8.10'
Nejweti
źródło
0

Wynika to głównie z przestarzałych bibliotek. Aby ręcznie sprawdzić dostępność nowych aktualizacji, należy przejść do

Analiza> „Uruchom inspekcję według nazwy”

uruchom kontrolę według nazwy android wynik

To powinno wystarczyć. Inną opcją jest uruchomienie aktualizacji zależności stopniowej przy użyciu

./gradlew dependencyUpdates

, które wygenerują taki raport:

:dependencyUpdates

------------------------------------------------------------
: Project Dependency Updates (report to plain text file)
------------------------------------------------------------

The following dependencies are using the latest milestone version:
 - com.github.ben-manes:gradle-versions-plugin:0.15.0

The following dependencies have later milestone versions:
 - com.google.auto.value:auto-value [1.4 -> 1.4.1]
 - com.google.errorprone:error_prone_core [2.0.19 -> 2.0.21]
 - com.google.guava:guava [21.0 -> 23.0-rc1]
 - net.ltgt.gradle:gradle-apt-plugin [0.9 -> 0.10]
 - net.ltgt.gradle:gradle-errorprone-plugin [0.0.10 -> 0.0.11]

...
Dimas Mendes
źródło
0

aktualizacja usług Google na poziomie projektu build.gradle rozwiązało mój problem.

Po aktualizacji:

dependencies {
    ...
    classpath 'com.google.gms:google-services:4.3.2'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
Riddhi
źródło
0

Miałem ten sam problem i problem został rozwiązany poprzez zdefiniowanie wersji wtyczki stopni kotlin w pliku build.gradle.

Zmień to

 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

do

 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50{or latest version}"
Zahra
źródło
0

W moim przypadku poszedłem za tym . Podsumowanie, na poziomie aplikacji stopniowej: zmień to:

variant.outputs.all { output ->
    variant.assemble.doLast {
        ....
    }
}

do

variant.outputs.all { output ->
variant.getAssembleProvider().configure() {
    it.doLast { 
        ....
    }
}
Atef Farouk
źródło