我们的应用程序正在使用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 everything public或其他一些catch—all keep配置.
我们的要求:
- 我们想保留这门课,当然,
- 我们要混淆类名
我知道我们可以添加-keep,allowobfuscation
行,但我们不能 for each 类添加这个.我们想要的是:
- 让R8保留所有可到达的类,但仍然会混淆它们,除非我们显式地用
@Keep
注释它们,或者在某个Proguard文件中有一个显式的保留规则
这是否可能,如果可能,如何?
PS:测试了https://playground.proguard.com/上的代码,没有迹象表明configuration.txt有保留该特定类的规则
PS2:类不扩展其他类,唯一依赖于第三方lib的是Moshi:
private val moshiAdapter = Moshi.Builder().build().adapter(Tokens::class.java)