Название делегированного объекта Kotlin все еще видно после запутывания - PullRequest
0 голосов
/ 16 ноября 2018

Я заметил, что имена делегированных свойств Kotlin все еще видны в обфусцированном байт-коде.

Пример исходного кода:

class MainActivity : AppCompatActivity() {
    val testProperty by lazy { "this is testProperty value" }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        testMethod()
        Log.d("MainActivity", "testProperty: $testProperty")
    }

    fun testMethod() {
        Log.d("MainActivity", "this is testMethod")
    }
}

Я собираю apk с включенным минимизацией, а затем использую функцию APK Analyzing из Android Studio для просмотра байт-кода:

.method private final l()V
    .registers 3

    const-string v0, "MainActivity"

    const-string v1, "this is testMethod"

    invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    return-void
.end method

...

invoke-static {v2}, La/a/b/k;->a(Ljava/lang/Class;)La/b/b;

    move-result-object v2

    const-string v3, "testProperty"

    const-string v4, "getTestProperty()Ljava/lang/String;"

    invoke-direct {v1, v2, v3, v4}, La/a/b/j;-><init>(La/b/c;Ljava/lang/String;Ljava/lang/String;)V

    invoke-static {v1}, La/a/b/k;->a(La/a/b/i;)La/b/e;

В приведенных выше фрагментах вы могли видеть, что testMethod хорошо скрыт, но testProperty все еще виден.

Как можно удалить эту информацию из байт-кода, чтобы улучшить запутываниеи сделать его более трудным для обратного инжиниринга?

1 Ответ

0 голосов
/ 16 ноября 2018

Имя делегированного свойства является частью его API: делегат свойства получает имя в качестве параметра и может использовать его в качестве, например, имени столбца базы данных или ключа в постоянном формате.Следовательно, его нельзя просто удалить из байт-кода;он имеет такое же значение, как и любой другой строковый литерал (например, строка «this is testProperty value»).

Если вы искренне обеспокоены тем, что знание имени конкретного свойства имеет существенное значение для того, кто пытаетсядля обратного проектирования вашего приложения не используйте делегированные свойства в таком коде.Тем не менее, я уверен, что такие опасения необоснованны в 95% случаев.

...