En primer lugar, tenga en cuenta que no espero why do you want to obfuscate library . Este es un problema genuino por el que estoy preguntando.
He tenido problemas con R8/ofuscación con una biblioteca de Android escrita en Kotlin.
Tengo un método de API público que está anotado con @JvmStatic y ese método toma un Lambda como parámetro.
Por ejemplo, eche un vistazo al código a continuación,
typealias MyLambdaCallback = (String, Map<String, Any>) -> Unit @Keep object MyApi { private var callback: MyLambdaCallback? = null @JvmStatic fun setCallback(callback: MyLambdaCallback) { this.callback = callback } } He agregado @Jvmstatic para que el código de llamada de Java pueda llamar al método de forma estática en lugar de hacer MyApi.INSTANCE.setCallback()
Cuando libero la biblioteca sin minification , todo está bien y el código de llamada de Java y Kotlin se escribe como se esperaba.
Pero ahora quiero liberar la biblioteca mientras activo la minification .
Eso crea un problema.
aquí está el error
java.lang.IncompatibleClassChangeError: se esperaba que el método 'void setCallback(kotlin.jvm.functions.Function2)' fuera de tipo virtual, pero en cambio resultó ser de tipo estático (aparece la declaración de 'com.demo.basic.Application' en /data/app/com.demo.basic-_0uJXPbtfs3UZ2Rp2h-RdQ==/base.apk!classes2.dex)
¿Estoy cometiendo un error en alguna parte o esto se espera como algún tipo de limitación?
¿Qué probé?
Eliminar @Jvmstatic resuelve el problema, pero creó un código de llamada Java feo
Mantuvo @Jvmstatic pero eliminó Lambda , convirtiendo Lambda en una interface with one method y todo funciona bien. Desafortunadamente SAM for Kotlin classes aún no está disponible, por lo que llamar al código de Kotlin se ve feo.
Esto se rastrea en el rastreador de problemas R8 http://issuetracker.google.com/158393309 que tiene más detalles.
La historia corta es que esto se solucionó en R8 versión 2.1.35, que se puede usar haciendo los siguientes cambios en el archivo build.gradle de nivel superior:
repositories { maven { url 'https://storage.googleapis.com/r8-releases/raw' } } dependencies { classpath 'com.android.tools:r8:2.1.35' // Must be before the Gradle Plugin for Android. classpath 'com.android.tools.build:gradle:XYZ' // Your current AGP version. }El equipo de R8 solucionó este problema junto con el problema relacionado b/158400283 en la versión 2.1.42 de R8
La solución ya debería estar disponible en Android Studio 4.1 beta o superior, pero si está utilizando Android Studio 4.0 estable, agregue lo siguiente a su archivo build.gradle de nivel superior:
buildscript { repositories { maven { url 'https://storage.googleapis.com/r8-releases/raw' } } dependencies { classpath 'com.android.tools:r8:2.1.42' // Must be before the Gradle Plugin for Android. classpath 'com.android.tools.build:gradle:XYZ' // Your current AGP version. } }