为什么 R8 没有混淆某些类?

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

我们的应用程序使用 R8 来缩小和混淆,两者都可以正常工作,但有些类在应该混淆的时候却没有被混淆。作为一个例子,我专门研究了一个应该被混淆的类:

TokenStorage

Gradle 配置为:

debuggable = false
shrinkResources true
minifyEnabled true

// adding the Proguard files from a dedicated directory
file('proguard-rules').listFiles().each {
    proguardFile it
}

该类出现在

seeds.txt
文件中(因此不应将其删除):

com.package.storage.TokenStorage: TokenStorage(com.package.storage.StorageDelegate)

该类显然没有出现在

usage.txt
中,但它的一些私有函数却出现了:

com.package.storage.TokenStorage:
    private final com.package.api.model.Tokens getTokens()
    private final com.package.api.model.Tokens getTokensAndUpdateCache()

mapping.txt
文件表明它不会被混淆,但一些属性是:

com.package.storage.TokenStorage -> com.package.storage.TokenStorage:
# {"id":"sourceFile","fileName":"TokenStorage.kt"}
    com.package.storage.StorageDelegate storage -> a
    kotlinx.coroutines.sync.Mutex lock -> b
    com.package.api.model.Tokens tokens -> c
    com.squareup.moshi.JsonAdapter moshiAdapter -> d
    ...

configuration.txt
文件没有提及该特定类。该类也没有扩展任何内容,并且其他类似的类被混淆的事实告诉我,我们没有意外地将所有内容保留为公共或其他一些包罗万象的保留配置。

我们的要求:

  • 我们想保留这个类,它肯定会被使用
  • 我们想要混淆类名

我知道我们可以添加

-keep,allowobfuscation
行,但我们不能为每个类添加此行。我们想要的是:

  • 让 R8 保留所有可访问的类,但仍然会混淆它们,除非我们用
    @Keep
    显式注释它们,或者在 Proguard 文件之一中具有显式保留规则

这可能吗?如果可以,怎么做?

PS:在https://playground.proguard.com/上测试了代码,没有迹象表明configuration.txt保留了该特定类的规则

PS2:该类不会扩展其他类,对第 3 方库的唯一依赖是 Moshi:

private val moshiAdapter = Moshi.Builder().build().adapter(Tokens::class.java)

顺便说一句,该属性和另外两个属性被混淆了:

android kotlin proguard android-r8
1个回答
0
投票

我建议你找到将类保持在第一位的规则(

-whyareyoukeeping
指令可以很方便地做到这一点),并检查它的配置方式。

对于规则过于广泛的第三方依赖不必要地影响您的类的情况,您可以考虑使用 KeepRules#ignoreFrom(当前处于

Incubating
状态)忽略它们,然后自己应用更严格的规则。这有效地允许“重写”依赖项的 proguard 规则(请参阅示例用法此处)。

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