为什么在 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做了更高级的优化,虽然使用了函数,但还是被优化掉了?
我有以下代码
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做了更高级的优化,虽然使用了函数,但还是被优化掉了?