Android Studio 2.1'e yeni geçtim ve daha önce çalışan bir uygulamayı derlemeye çalışırken bu hata ortaya çıktı:
Hata:Bytecode'u dex'e dönüştürürken hata oluştu:
Neden: Dex, sürüm 52 bayt kodunu ayrıştıramıyor. Bu, Java 8 veya üzeri kullanılarak derlenmiş kütüphane bağımlılıklarından kaynaklanır. Eğer bir kütüphane alt modülünde 'java' gradle eklentisini kullanıyorsanız targetCompatibility = '1.7' sourceCompatibility = '1.7' ifadesini bu altmodülün build.gradle dosyasına ekleyin.
Java 1.7 kod üretimini zorlamak için ana projenin gradle.build dosyasını zaten güncellemiştim:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
}
}
Ayrıca gradle.build modülünü java sürümünü ayarlamak için aşağıdaki gibi güncelledim:
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
}
}
Alt modül Maven ile inşa ediliyor. Pom.xml dosyasında da 1.7 kod üretimini zorlamaya çalıştım.
Alt modülleri içeren bir assembly artifact kullandığımı anlıyorum, ancak alt modüllerin hiçbirini değiştirmedim ve modül için ortaya çıkan .jar dosyası en son derlediğimde sorunsuz çalıştı.
<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>
Benim sorum şu:
Android Studio 3.0+ ile java 1.8 kullanıyorum ve aşağıdaki ayarlar benim için çalışıyor: en son derleme araçlarına ihtiyaç duyuyor gibi görünüyor
classpath 'com.android.tools.build:gradle:3.0.0'
ve
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
}
}
Android'e özgü olmayan** bir java kütüphanesine sahip bir modülünüz varsa, bu işe yaramalıdır: apply plugin:'java'
Bunu build.gradle dosyasının en üstüne koyun, ardından yeniden oluşturun.
apply plugin: 'java'
apply plugin: 'jacoco'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.11'
sourceCompatibility = 1.7
targetCompatibility = 1.7
}
Muhtemelen, bağımlılıklarınızdan bazıları özellikle Android için değil, Java 8 ile derlenmiştir. Bu bağımlılıkları eski sürüme geçirmeyi deneyin. Hangi kütüphanenin sürümünü düşürmeniz gerektiğini tam olarak bilmiyorum, çünkü ana modülünüzün bağımlılıklarının bir listesini eklemediniz.
Örneğin: Ben de aynı sorunu yaşadım. Saatlerce araştırdıktan sonra, org.codehaus.httpcache4j.uribuilder:2.0.0
kütüphanesinin github itibariyle Java 8 gerektirdiğini buldum. Bu yüzden, 1.1.0
a geçtiğimde, proje başarıyla derlendi ve dağıtıldı.