为什么在 proguard 输出的 usage.txt 中仍然显示已使用的函数?

Why is an in used function still shown in usage.txt of proguard output?

我有以下代码

class MainActivity : AppCompatActivity() {
    private val obfuscatedClass = MyObfuscatedClass()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        obfuscatedClass.usedFunc()
    }
}

class MyObfuscatedClass {
    fun usedFunc() {}
    fun unusedFunc() {}
}

使用普通的混淆器,我生成了 usage.txt 文件,其中显示了 unusedFunc()

com.example.myobfuscateretracetest.MyObfuscatedClass:
    public final void unusedFunc()

这是正确的,因为 usage.txt 文件是为了显示 class 或编译期间删除的函数,如

中所述

但是,如果我将 class 更改为 lazy,如下所示,

class MainActivity : AppCompatActivity() {
    private val obfuscatedClass by lazy {
        MyObfuscatedClass()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        obfuscatedClass.usedFunc()
    }
}

class MyObfuscatedClass {
    fun usedFunc() {}
    fun unusedFunc() {}
}

当我检查 usage.txt 时,我注意到两者都显示了,只是在不同的部分

com.example.myobfuscateretracetest.MyObfuscatedClass:
    public final void unusedFunc()

// ... other sections

com.example.myobfuscateretracetest.MyObfuscatedClass:
    public final void usedFunc()

为什么 usedFunc() 仍然显示在 usage.txt 中?

显然,上述情况 2 的奇怪行为仅在使用

时发生
buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

如果我使用 non-optimize 默认的混淆器,那就没问题了。

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

也许optimize proguard做了更高级的优化,虽然使用了函数,但还是被优化掉了?