2016-03-04 12 views
16

W naszej aplikacji na Androida używamy DBFlow, aby uzyskać dostęp do bazy danych SQLite. Odwołujemy się do klas generowanych przez DBFlow przez Kotlin. Jesteśmy już świadomi faktu, że mamy klasę modelu, a także klasę bazy danych w Javie jako generację kodu won't work podczas pisania tych klas w Kotlin.Nierozwiązane odniesienie: Kotlin potrzebuje 2 buildów po oczyszczeniu, aby odebrać kod podczas używania kapt

Jednak nadal musimy zbudować kod dwa razy po każdym projekcie czystym. Wykonywanie pierwszej kompilacji na urządzeniu skutkuje ClassNotFoundExceptions dla pozornie losowych klas Kotlin (nawet jeśli nie mają one dostępu do kodu wygenerowanego przez DBFlow lub którąkolwiek z zdefiniowanych przez nas klas modeli). To samo jest zgłaszane już podczas kompilacji podczas włączania Proguard, co oczywiście nie powiedzie się. Druga kompilacja zawsze się udaje.

Zabawne jest to, że generowanie kodu działa już przy pierwszym uruchomieniu - zajęcia są tam i są również zbierane przez IDE. Ale kompilator w jakiś sposób nie może ich znaleźć, dzięki czemu myślę, że generowanie kodu dzieje się zbyt późno w procesie kompilacji. Z drugiej strony, jak wyjaśniono powyżej, nie ma również klas, które nie muszą nic robić z generowaniem kodu i/lub przetwarzaniem adnotacji.

Czy istnieje lepsze rozwiązanie tego problemu niż druga kompilacja?

Dla porównania, odpowiednie części naszej aplikacji build.gradle wygląda tak - podobnie jak DBFlow documentation sugeruje:

def dbflow_version = "3.0.0-beta4" 

dependencies { 
    kapt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}" 
    compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}" 
    compile "com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}" 
} 

kapt { 
    generateStubs = true 
} 

Edit: odkryłem, że mam również odbudować dwa razy na każdej zmianie robię do kodu. Kompiluje się poprawnie w pierwszym kompilacji, jeśli wcześniej nie czyściłem, ale zmiany po prostu nie są pobierane.

+1

Myśl może to może być ustalona przez https://youtrack.jetbrains.com/issue/KT-8733, ale niestety poprawka nie działa, gdy jest włączona opcja generateStubs. – ubuntudroid

+0

Mam dokładnie ten sam problem z 1.0.5-2 – deviant

+0

Mam podobny problem. Jeśli chcę wygenerować podpisane apki, muszę skompilować każdą kombinację buildType/flavor dwa razy, co sprawia, że ​​zautomatyzowane kompilacje są o wiele bardziej nieużyteczne. – vanomart

Odpowiedz

8

Jeśli używasz Kotlin i retrolambda to może go naprawić:

me.tatarka:gradle-retrolambda:3.4.0 

github gist

+1

Nie, porzuciliśmy retrolambdę, kiedy przeprowadzamy się do Kotlina. Dzięki! i tak! :) – ubuntudroid

+0

Stosuję retrospekcję do starszych projektów, które używają retrolambdy, więc można używać obu tak jak w reklamie. –

+2

omg naprawiłam wszystkie dziwne problemy, które miałem z Kotlinem i Androidem. Niesamowity. Dziękuję Ci. – MooGoo

Powiązane problemy