Kotlin отражение не работает, когда включена обфускация кода - PullRequest
0 голосов
/ 03 августа 2020

У меня есть этот класс

object Config {

    val type = Type
    val clazz = Class

    object Type {
        val type1 = "1"
        val type2 = "2"
        val type3 = "3"
    }

    object Class {
        val class1 = "1"
        val class2 = "2"
        val class3 = "3"
    }
}

Мне нужно получить все переменные (type1, type2, type3, class1, class2, class3).

Для этого у меня есть этот метод:

fun getAll(instance: Any? = null, depth: Int = 0): List<String> {
        if (depth > 2) {
            return emptyList()
        }

        val result = mutableListOf<String>()
        val currentInstance = instance ?: this

        val properties = currentInstance.javaClass.kotlin.declaredMemberProperties.filter { it.visibility == KVisibility.PUBLIC }
        
        for (prop in properties) {
            prop.get(currentInstance)?.let {

                if (it is String) {
                    result.add(it)
                } else {
                    result.addAll(getAll(it, depth + 1))
                }
            }
        }

        return result
    }

Он отлично работает, если обфускация кода отключена.

Когда я добавляю:

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

Он больше не работает.

Я пытался добавить аннотацию @Keep или подобное правило proguard. Не работает.

Важное примечание. type1, type2, type3, class1, class2, class3 никогда не используются в коде.

...