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

问题描述 投票:0回答:2

我有以下代码

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()

android proguard android-r8
2个回答
0
投票

显然上述场景 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做了更高级的优化,虽然使用了该函数,但它仍然被优化掉了?


0
投票

可能与此相关:

java编译器内联原始常量和字符串常量(静态最终字段)。因此,ProGuard 会将此类字段列为在其分析的类文件中未使用的字段,即使它们在源文件中使用也是如此。我们可以添加一个 -keepclassmembers 选项来保留这些字段,以避免列出它们:

-keepclassmembers class * {
    static final %                *;
    static final java.lang.String *;
}

尝试将其添加到您的 proguard.pro 文件并再次运行它应该会停止打印这些静态成员的用法(这些静态成员已被删除,但我们看不到)

© www.soinside.com 2019 - 2024. All rights reserved.