我们的应用程序正在使用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)

That property and two others are obfuscated btw: enter image description here

推荐答案

我建议您找到将类放在第一位的规则(-whyareyoukeeping指令很方便),并判断它的配置情况.

对于第三方依赖性和过于宽泛的规则不必要地影响你的类的情况,你可以考虑用KeepRules#ignoreExternalDependencies(在AGP 7.3中可用,在AGP 8.4中已被弃用,参见示例用法here)或KeepRules#ignoreFrom(在AGP 8.4中可用)忽略它们,然后自己应用更严格的规则.这有效地允许"重写"依赖的proguard规则.

Android相关问答推荐

致命信号6(SIGABRT)MAUI应用程序在android net发布时崩溃.8、使用强制屏幕方向和并发GC

打开平板电脑的下载文件夹中的文件,例如使用其mimeType将Intent发送到我们的应用程序

带有kSP而不是kapt的Hilt

如何在Jetpack composeH中创建具有弯曲末端的六边形形状

如何在DownloadManager Android中显示ProgressBar和Complete Listener

如何在Jetpack Compose中向SearchBar添加边框

当提供非状态对象时,compose 如何进行重组

Android Studio SQLite 错误:列不正确(没有这样的列:_id)

相机2问题:设置AE区域、AF区域和AWB区域.

请求访问小部件中的位置权限

在 compose 中做可变状态堆栈

围绕动态大小的内容包装 Jetpack Compose Row?

在 Jetpack Compose 中对齐行项目

Kotlin File(path).walkTopDown() 找不到文件

单击过go 的文章时 NewsApp 崩溃

验证硬编码密码

协程中的 Job.Cancel 与 Scope.Cancel 有什么区别?

如何为具有不同屏幕尺寸但相同密度的手机创建响应式布局?

协程是否在 if 条件下保持秩序?

在 jetpack compose 中使用 viewmodel 的最佳实践