Właśnie przełączyłem się na Android Studio 2.1 i ten błąd pojawił się podczas próby skompilowania aplikacji, która wcześniej działała:
Error:Error converting bytecode to dex:
Cause: Dex cannot parse version 52 byte code.
This is caused by library dependencies that have been compiled using Java 8 or above.
If you are using the 'java' gradle plugin in a library submodule add
targetCompatibility = '1.7'
sourceCompatibility = '1.7'
to that submodule's build.gradle file.
Zaktualizowałem już plik gradle.build głównego projektu, aby wymusić generowanie kodu Java 1.7:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
}
}
Zaktualizowałem również moduł gradle.build w następujący sposób, aby ustawić wersję java:
android {
compileSdkVersion 19
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.abc.def"
minSdkVersion 19
targetSdkVersion 19
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
Podmoduł budowany z Maven. W pliku pom.xml próbowałem też wymusić generowanie kodu 1.7.
Rozumiem, że używam artefaktu zespołu, który zawiera moduły podrzędne, ale nie zmieniłem żadnego z modułów podrzędnych, a wynikowy plik .jar modułu działał poprawnie podczas ostatniej kompilacji.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId> <!-- maven-compiler-plugin -->
<version>2.6</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Moje pytanie: 1) Czy jest to problem z Androidem Studio 2.1? Czy inni to widzieli? 2) Zakładając, że to mój błąd i ponieważ komunikat o błędzie nie pomaga w znalezieniu złego modułu, czy są jakieś zalecenia dotyczące znalezienia kodu V52? Nie mogę po prostu pominąć bibliotek bez zrywania dużej ilości kodu. Czy można przejrzeć plik .jar, aby znaleźć wersję kodu? Z góry dziękuję. -Hefajstos
źródło
Odpowiedzi:
po prostu użyj Java 1.8 z Androidem Studio 3.0+ i ustaw następujące prace dla mnie: wydaje się, że potrzebuję najnowszych narzędzi do kompilacji
classpath 'com.android.tools.build:gradle:3.0.0'
i
android { compileSdkVersion 26 buildToolsVersion "26.0.1" defaultConfig { ... //jackOptions { // DEPRECATED //enabled true //} } dexOptions { incremental true } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
źródło
android.dexOptions.incremental
Właściwość jest przestarzała i nie ma wpływu na proces kompilacji”.Jeśli masz moduł z biblioteką java, która nie jest specyficzna dla Androida , powinno to działać:
apply plugin:'java'
Umieść go na górze pliku build.gradle, a następnie odbuduj.
apply plugin: 'java' apply plugin: 'jacoco' dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.11' sourceCompatibility = 1.7 targetCompatibility = 1.7 }
źródło
Jeśli używasz
org.jetbrains:annotation:15
wtyczki i retrolambda, usuń linięcompile org.jetbrains:annotations:15.0
ze swojego,build.gradle
a błąd zniknie. Mi to pasuje.źródło
Być może niektóre z Twoich zależności zostały skompilowane w Javie 8, a nie w systemie Android. Spróbuj przełączyć te zależności na starszą wersję. Nie wiem dokładnie, którą bibliotekę powinieneś obniżyć, ponieważ nie załączyłeś listy zależności swojego głównego modułu.
Na przykład: miałem ten sam problem. Po godzinach poszukiwań odkryłem, że biblioteka
org.codehaus.httpcache4j.uribuilder:2.0.0
wymaga Java 8, jak na github . Tak więc po przełączeniu się na1.1.0
projekt został pomyślnie skompilowany i wdrożony.źródło
Spróbuj dodać do main build.gradle w sekcji allprojects
tasks.withType(JavaCompile) { sourceCompatibility = "1.7" targetCompatibility = "1.7" }
lub dodaj to w zależnościach
sourceCompatibility = 1.7 targetCompatibility = 1.7
we wszystkich modułach ręcznie
źródło
Udało mi się rozwiązać ten problem, dodając następujące wiersze:
jackOptions { enabled true }
do
defaultConfig
wbuild.gradle
pliku.Możesz postępować zgodnie z wytycznymi dla Java 8 pod linkiem - https://developer.android.com/guide/platform/j8-jack.html
źródło
Miałem ten sam problem z zależnością greendao-generator.
compile 'org.greenrobot:greendao-generator:3.1.0'
Pomyłkowo dodałem tę zależność do mojej build.gradle ( ), a AndroidStudio pokazał mi ten sam komunikat o błędzie.Prawdopodobnie dlatego, że ten moduł został skompilowany w Javie 8.
Więc usunąłem tę zależność z mojego build.gradle i wszystko skompilowałem szczęśliwie :)
źródło
Rozwiązałem ten problem jak poniżej:
apply plugin: 'java' sourceCompatibility = 1.7 targetCompatibility = 1.7 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) }
źródło
Wyłączenie Instant Run w Android Studio 2.2 z wtyczką Gradle 2.2.2 naprawiło to za mnie. Powrót do starszej wersji wtyczki Gradle (na przykład 2.2.0) również to naprawił, ale to mniej pożądane imho.
źródło
Zdarzyło mi się to w Android Studio 2.3.3. Rozwiązaniem, które znalazłem, było usunięcie folderu kompilacji, a następnie odbudowanie projektu . To było takie proste.
źródło
Android 2.3.3
Napotkałem również ten sam błąd w , po dodaniu kilku zależności JAR. Problem był spowodowany depenecjąio.netty:netty-all:4.1.16.Final
. Ten plik JAR w wersji 4.1.16 został skompilowany w Javie 1.8, a wszystkie inne zostały wygenerowane w Javie 1.7.Zostało to rozwiązane po włączeniu starszej wersji programu
netty
(która została wygenerowana w Javie 1.7) w moimbuild.gradle
pliku.compile 'io.netty:netty-all:4.1.5.Final'
źródło
Natknąłem się na ten problem podczas próby aktualizacji do auto-value v 1.5 w Android Studio v 2.3.3. Wartość automatyczna 1,5 prawdopodobnie będzie zgodna z AS 3 (wymaga zaktualizowanego kompilatora java)
Na razie działa auto-wartość 1.4.1.
źródło
Mam ten sam problem z biblioteką interfejsów API reaktywnej lokalizacji dla Androida i RxJava 2. Po prostu zaktualizuj build.gradle do 3.0.1 i zmniejsz bibliotekę interfejsów API reaktywnej lokalizacji dla Androida i RxJava 2 z wersji 1.0.4 do 1.0.3 Działa dobrze w moim przypadku.
źródło
Zetknąłem się z tym problemem, próbując zaimportować jar skompilowany przez jdk 1.8 w Android Studio 3.0. Wypróbowałem wszystkie powyższe rozwiązania, ale żadne nie działa. więc poprosiłem programistę tego jar, aby ponownie skompilował go z jdk 1.7, a potem działa dobrze, aby nie napotkać tego problemu ponownie.
źródło
Jeśli to możliwe dla Ciebie:
To powinno rozwiązać problem.
Źródła: https://developer.android.com/studio/write/java8-support
źródło