我有以下代码
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()
这是正确的,因为 use.txt 文件旨在显示编译期间的类或删除的函数,如
中所述但是,如果我将班级更改为
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() {}
}
当我检查用法.txt 时,我注意到两者也都显示了,只是在不同的部分中
com.example.myobfuscateretracetest.MyObfuscatedClass:
public final void unusedFunc()
// ... other sections
com.example.myobfuscateretracetest.MyObfuscatedClass:
public final void usedFunc()
为什么usage.txt中仍然显示
usedFunc()
?
显然上述场景 2 的奇怪行为仅在使用时才会发生
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
如果我使用非优化的默认混淆器,那就没问题了。
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
也许optimize proguard做了更高级的优化,虽然使用了该函数,但它仍然被优化掉了?
可能与此相关:
java编译器内联原始常量和字符串常量(静态最终字段)。因此,ProGuard 会将此类字段列为在其分析的类文件中未使用的字段,即使它们在源文件中使用也是如此。我们可以添加一个 -keepclassmembers 选项来保留这些字段,以避免列出它们:
-keepclassmembers class * {
static final % *;
static final java.lang.String *;
}
尝试将其添加到您的 proguard.pro 文件并再次运行它应该会停止打印这些静态成员的用法(这些静态成员已被删除,但我们看不到)