Розв'язання помилки збірки "com.android.tools.r8.internal.k2: MethodHandle.invoke та MethodHandle.invokeExact підтримуються лише починаючи з Android O"

Розв’язання помилки збірки “com.android.tools.r8.internal.k2: MethodHandle.invoke та MethodHandle.invokeExact підтримуються лише починаючи з Android O”

6 Березня 2024 в 01:33 25

Під час розробки Android-додатка можуть виникнути різноманітні помилки збірки, які можуть призвести до невизначених результатів та проблем з функціональністю. Одна з таких помилок, яка викликає особливе занепокоєння, це помилка “com.android.tools.r8.internal.k2: MethodHandle.invoke та MethodHandle.invokeExact підтримуються лише починаючи з Android O”. У цій статті ми розглянемо цю проблему більш докладно та запропонуємо кілька можливих шляхів її вирішення.

Опис помилки: дана помилка зазвичай виникає при спробі зібрати додаток, який містить бібліотеку org.tensorflow:tensorflow-lite:2.15.0, що в свою чергу залежить від бібліотеки com.google.inject:guice:5.1.0. Причиною цієї помилки є те, що бібліотека guice:5.1.0 несумісна з низькими версіями Android SDK (API рівня менше 26), оскільки використовує методи, які підтримуються лише починаючи з Android O.

Іншими словами, в процесі оптимізації коду за допомогою інструмента R8 від Google, використання деяких методів з guice:5.1.0 може призвести до виникнення даної помилки, яка забороняє збірку додатка.

Одним з можливих варіантів вирішення цієї проблеми є збільшення версії minSdk до 26. Однак це може призвести до втрати підтримки деяких користувачів, які працюють на старших версіях Android. Тому цей шлях може бути не найбільш оптимальним.

Іншим можливим рішенням є встановлення параметру minifyEnable в значення true, що дозволить уникнути помилки збірки. Однак це може призвести до проблем з іншими частинами додатка, оскільки параметр minifyEnable відповідає за збільшення розміру додатка та видалення невикористаних методів і класів з коду під час збірки.

Уникаючи зміни minSdk та встановлення параметру minifyEnable в значення true для всього додатку, ми можемо спробувати застосувати ці параметри лише для модуля, що спричиняє проблему. Однак, на даний момент, відомо, що встановлення параметру minifyEnable на рівні модуля не є простою задачею та може вимагати додаткового дослідження та експериментів.

Враховуючи вищезазначене, можна зробити висновок, що кожен з вищенаведених шляхів має свої переваги та недоліки. Вибір конкретного варіанту вирішення проблеми повинен бути здійснений на основі конкретних потреб та вимог проекту.