2
  • error log

    Process: com.sjianjun.test.kotlin.delegate, PID: 23730 kotlin.reflect.jvm.internal.KotlinReflectionInternalError: Property 'delegateTest' (JVM signature: getDelegateTest()Ljava/lang/Object;) not resolved in class com.sjianjun.test.kotlin.delegate.MainActivity at kotlin.reflect.jvm.internal.KDeclarationContainerImpl.findPropertyDescriptor(:115)

  • MainActivity:

@Keep
class MainActivity : AppCompatActivity() {
    var delegateTest by DelegateTest()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        this::class.java.declaredMethods.forEach {
            Log.e("DelegateTest", it.toString())
        }

        Log.e("DelegateTest ", delegateTest.toString()+DelegateTest::class.java.name)
        delegateTest = 1
        Log.e("DelegateTest ", delegateTest.toString())
    }
}

  • DelegateTest:
@Keep
class DelegateTest {
    var value: Any? = null
    operator fun getValue(thisRef: Any?, property: KProperty<*>): Any {
// crash : property
        return "value:$value $property"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Any) {
        this.value = value
    }

}
  • proguard:
-keep class com.sjianjun.test.kotlin.delegate.DelegateTest{*;}
-keep class com.sjianjun.test.kotlin.delegate.MainActivity{*;}
-keepclassmembers class com.sjianjun.test.kotlin.delegate.MainActivity{*;}
-keep class kotlin.reflect.**{*;}
  • and log:
 E/kotlin.delegat: Unable to peek into adb socket due to error. Closing socket.: Connection reset by peer
 E/DelegateTest: public void com.sjianjun.test.kotlin.delegate.MainActivity._$_clearFindViewByIdCache()
 E/DelegateTest: public android.view.View com.sjianjun.test.kotlin.delegate.MainActivity._$_findCachedViewById(int)
 E/DelegateTest: public final java.lang.Object com.sjianjun.test.kotlin.delegate.MainActivity.getDelegateTest()
 E/DelegateTest: protected void com.sjianjun.test.kotlin.delegate.MainActivity.onCreate(android.os.Bundle)
 E/DelegateTest: public final void com.sjianjun.test.kotlin.delegate.MainActivity.setDelegateTest(java.lang.Object)
 E/DelegateTest: value:null var com.sjianjun.test.kotlin.delegate.MainActivity.delegateTest: kotlin.Anycom.sjianjun.test.kotlin.delegate.DelegateTest
 E/DelegateTest: value:1 var com.sjianjun.test.kotlin.delegate.MainActivity.delegateTest: kotlin.Any

I found that proguard will delete the following fields:

 E/DelegateTest: value:null var com.sjianjun.test.kotlin.delegate.MainActivity.delegateTest: kotlin.Anycom.sjianjun.test.kotlin.delegate.DelegateTest
 E/DelegateTest: value:1 var com.sjianjun.test.kotlin.delegate.MainActivity.delegateTest: kotlin.Any

I don't know what to do ...

SJJ
  • 417
  • 4
  • 5

1 Answers1

0

Android gradle plugin uses R8 obfuscator by default. I encountered the same issue after switching from Proguard to R8.

Switching back to Proguard helped me. You can see here how to manually enable proguard in your project instead of R8:
https://www.guardsquare.com/manual/setup/gradleplugin

pavelperc
  • 119
  • 5