为什么在proguard输出的usage.txt中仍显示一个用过的功能?
我有以下代码
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() {}
}
具有正常的proguard,我会生成ustage.txt文件,显示unusterfunc()
com.example.myobfuscateretracetest.MyObfuscatedClass:
public final void unusedFunc()
这是正确的,因为usage.txt文件旨在显示类或删除函数在编译期间,如
- https://developer.android.com/studio.com/studio.com/studio.com/studio /build/shink-code#full-mode
- https://jebware.com/blog /?p = 484
但是,如果我将我的类更改为懒惰
,如下所示,
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()
为什么underfunc()
仍在usage.txt中显示?
I have the following code
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() {}
}
With a normal proguard, I generate the usage.txt file, showing the unusedFunc()
there
com.example.myobfuscateretracetest.MyObfuscatedClass:
public final void unusedFunc()
This is correct, as the usage.txt file is meant to show the class or removed function during compilation as mentioned in
However, if I change my class to a lazy
as shown below,
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() {}
}
When I check the usage.txt, I notice that both also shown, just in a different section
com.example.myobfuscateretracetest.MyObfuscatedClass:
public final void unusedFunc()
// ... other sections
com.example.myobfuscateretracetest.MyObfuscatedClass:
public final void usedFunc()
Why is the usedFunc()
still being shown in the usage.txt?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
显然,上述方案2的奇怪行为仅在使用
非优化默认proguard时才发生,然后没关系。
尽管使用该功能,但优化的Proguard可以更高级优化,但是它仍然被优化了吗?
Apparently the odd behavior of scenario 2 above only happen when using
If I use the non-optimize default proguard, then it's alright.
Perhaps the optimize proguard does more advanced optimization, though the function is used, but it still got optimized away?
可能与此有关:
尝试将其添加到您的proguard.pro文件中并再次运行它,应停止打印这些静态成员的用法我们可以看到)
Probably related to this:
Try adding that to your proguard.pro file and run it again should stop printing out usages of those static members (which are stripped but not that we can see)