2016-06-22 16 views
10

Podążyłem za Android Java 8 Features manual. Działa dobrze w przypadku projektu aplikacji na Androida. Ale gdy próbuję go używać z projektu biblioteki Android uzyskaćCzy można używać funkcji Java 8 z projektem biblioteki Android?

Error:Library projects cannot enable Jack. Jack is enabled in default config. 

Częściowym rozwiązaniem: Włączyłem lamdba wyraz z Gradle Retrolambda Plugin.

+0

AFAIK, nope dzień dzisiejszy z AS 2.1.2 –

+0

To z informacją, że jest on już włączony w domyślnej konfiguracji. Powinieneś być w stanie go użyć. –

+1

@DanielHolst Nie, domyślnie konfiguracja oznacza, że ​​jest włączona przez @sasha_tm w swoim gradle script w sekcji 'defaultConfig' i nie oznacza, że ​​jest włączona domyślnie. – reubenjohn

Odpowiedz

17

Miałem ten sam problem i próbowałem różnych podejść. Działa teraz dla mnie bez użycia retrolambdy (która wywołała jakiś dziwny błąd podczas uruchamiania). Jack również nie jest aktywny z tego samego powodu, o którym już wspominałeś. Jest ciekawy bug po google.com na ten temat: https://code.google.com/p/android/issues/detail?id=211386

Oto mój skrypt build.gradle użyłem obejścia ze stanowiska błędów naprawić „MethodType nie znaleziono” wyjątek podczas kompilacji.

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.1.2' 
    } 
} 
apply plugin: 'com.android.library' 

repositories { 
    mavenCentral() 
} 

// Java8 not fully supported in library projects yet, https://code.google.com/p/android/issues/detail?id=211386 
// this is a temporary workaround to get at least lambdas compiling 
gradle.projectsEvaluated { 
    tasks.withType(JavaCompile) { 
     options.compilerArgs << "-Xbootclasspath/a:" + System.properties.get("java.home") + "/lib/rt.jar" 
    } 
} 

android { 
    compileSdkVersion 24 
    buildToolsVersion "24" 

    defaultConfig { 
     minSdkVersion 10 
     targetSdkVersion 24 
    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_8 
     targetCompatibility JavaVersion.VERSION_1_8 
    } 
} 
+0

Dzięki. Spróbuję. Miałem także do czynienia z problemem, że nie mogę debugować projektu biblioteki, gdy Jack jest włączony dla głównego projektu aplikacji. –

+2

Nie działa z najnowszymi narzędziami do kompilacji, czyli 25. BŁĄD: LibClass.java:18-19: Lambda pochodząca z pliku jar wymaga kompilacji swoich interfejsów w ścieżce klasy, nieznane interfejsy to java.lang. Runnable –

+0

Również teraz otrzymywanie "Lambda przychodzącej z pliku jar" wymaga kompilacji ich interfejsów na ścieżce klas, nieznane interfejsy to błąd java.lang.Runnable "podczas kompilacji z Jackiem. Powróć do korzystania z Retrolambdy po kilku godzinach szukania nowego rozwiązania. :( –

0

To na pewno długa jazda. Wypróbowałem wszystkie możliwe kombinacje wtyczki gradle, eksperymentalnej wtyczki gradle + retrolambda + Jack itp., Ale bez powodzenia. Do teraz. Z wersji 1.0 lub późniejszej Android Studio 3.0 (a także wtyczki Android Gradle 3.0.0-alpha1 lub nowszej) łańcuch narzędziowy Jack jest przestarzały i zastąpiony przez nową transformację kodu bajtowego - , która informuje o, używanej w połączeniu ze standardowym kompilatorem javac.

Dzięki tej konfiguracji osobiście (w końcu !!!) udało się wykorzystać funkcje Java 8, takie jak lambdas w projekcie bibliotecznym.

Ta strona posiada wszystkie informacje techniczny, a także migracji pomocy itp: https://developer.android.com/studio/write/java8-support.html

+0

Czy przeniesienie biblioteki do wersji Java 8 zmusiło również aplikacje do kompilacji przy pomocy Java 8? – PseudoPsyche

+0

Nie próbowałem, ale spodziewam się, że używanie lambd i takich funkcji w bibliotece nie wymusza zgodności aplikacji Java 8 z aplikacją kliencką, ponieważ te funkcje są realizowane poprzez słodzenie. Korzystanie z API Java * 8 * takich jak strumienie to oczywiście inna historia, ponieważ może wpłynąć na minSdkVersion biblioteki, a z kolei na aplikację. – JHH

+1

Witaj, @PseudoPsyche, przepraszam za długie opóźnienie. Tak. Bez kompatybilności z Javą 8, dostałem dziwny błąd dex i trochę czasu zajęło zrozumienie, co to było. – JHH

Powiązane problemy