Я заметил, что имена делегированных свойств 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
все еще виден.
Как можно удалить эту информацию из байт-кода, чтобы улучшить запутываниеи сделать его более трудным для обратного инжиниринга?