簡體   English   中英

混淆后仍可見Kotlin委派的財產名稱

[英]Kotlin Delegated Property name still visible after obfuscation

我注意到,在模糊的字節碼中仍然可以看到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,然后使用Android Studio中的APK分析功能瀏覽字節碼:

.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仍然可見。

我如何從字節碼中刪除此信息以改善混淆並使其更難以反向工程?

委托屬性的名稱是其API的一部分:屬性委托接收名稱作為參數,並可以將其用作數據庫列名稱或持久性格式的鍵。 因此,不能簡單地將其從字節碼中刪除。 它在那里的含義與任何其他字符串文字(例如“ this is testProperty value”字符串)一樣多。

如果您真的擔心知道某個特定屬性的名稱對試圖對您的應用程序進行反向工程的人有本質的不同,請不要在此類代碼中使用委托的屬性。 但是,我很確定在95%的情況下這種擔心都是沒有根據的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM