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ć?


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,



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'
    }
}

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


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.


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.


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'
    }
}

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'
}

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


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

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


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'

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


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'

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ął


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


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'

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

gdzie build, grad lub app.gradle
Jithish PN

po prostu wyszukaj plik gradle.properties w swoim projekcie
Hamed safari


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


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'
    }
}

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.


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
}

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.


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'

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]

...

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
}

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}"

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 { 
        ....
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.