不知道为什么 Proguard/R8 删除某些代码

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

我们将 R8 添加到我们的 Android 应用程序中,以从我们的应用程序使用的特定依赖项中删除一些代码。我们的混淆器规则文件如下所示:

-dontobfuscate
-dontoptimize

-keep class !com.kaltura.tvplayer.offline.**, !com.kaltura.android.exoplayer2.scheduler.**, !com.kaltura.android.exoplayer2.offline.**, !com.kaltura.tvplayer.OfflineManager { *; }

-printusage usage.txt

构建我们的应用程序并查看生成的

usage.txt
文件后,我们看到我们想要从依赖项中删除的代码已被删除。但是,还有其他代码被删除,我们不确定原因。该代码如下所示:

kotlinx.coroutines.debug.AgentPremain$$InternalSyntheticLambda$1$677acd6fb4ca1651eb1c76ebe61d8c1a9f5aeadf35534bff63c38388e03cb9a0$0:
    public final void handle(sun.misc.Signal)
kotlinx.coroutines.debug.AgentPremain:
    public static synthetic void $r8$lambda$qtwhjy3HAlNEjQH7oAL6W8vp2zY(sun.misc.Signal)
com.google.android.material.checkbox.MaterialCheckBox$$InternalSyntheticLambda$1$a66ca6c6de65b4f256ca2f0a8ce6032afe507a77d8c42ef3015c9db612807b7a$0
com.google.android.material.checkbox.MaterialCheckBox:
    public static synthetic void $r8$lambda$hE-Ehj__sZakT88clijs-fYFgxg(com.google.android.material.checkbox.MaterialCheckBox)
io.reactivex.rxjava3.internal.jdk8.ObservableFlatMapStream$FlatMapStreamObserver$$InternalSyntheticApiModelOutline$1$87977bb73faf46839e24319ed6c7f5e872a83d3099d0adb8f3afc970e63deb06$2
io.reactivex.rxjava3.internal.jdk8.ObservableFlatMapStream$FlatMapStreamObserver$$InternalSyntheticApiModelOutline$1$87977bb73faf46839e24319ed6c7f5e872a83d3099d0adb8f3afc970e63deb06$5
org.apache.commons.io.file.PathUtils$$InternalSyntheticApiModelOutline$1$778588db3304f74caa63c13b87cbf3c380b7de57d734f860afc58cfef4c8cf73$2
org.apache.commons.io.file.PathUtils$$InternalSyntheticApiModelOutline$1$778588db3304f74caa63c13b87cbf3c380b7de57d734f860afc58cfef4c8cf73$5
org.apache.commons.io.filefilter.EmptyFileFilter$$InternalSyntheticApiModelOutline$1$95abaa9ca0d4f21097e19aae95cd518500ff56bb37279c94168ab66f95dc3506$4
org.apache.commons.io.filefilter.EmptyFileFilter$$InternalSyntheticApiModelOutline$1$95abaa9ca0d4f21097e19aae95cd518500ff56bb37279c94168ab66f95dc3506$7

即使我们更新 proguard-rules 文件以包含包含所有类的 keep 语句(如下所示),

usage.txt
文件仍然显示相同的代码正在被删除

-dontobfuscate
-dontoptimize

-keep class ** { *; }

-printusage usage.txt

我们尝试了几种不同的方法来帮助解决这个问题。

首先,如上所述,我们添加了一个 keep 语句来保留所有类作为健全性检查

-keep class ** { *; } 
。我们惊讶地发现在我们的
usage.txt
文件中添加此代码后代码仍然被删除。

我们还尝试添加特定的保留规则,以确保某些代码不会被删除(如下所示)。这些保留规则也对删除哪些代码没有影响。

-keep class org.apache.commons.io.file.PathUtils** { *; }

-keep class com.google.android.material.** { *; }

有谁知道为什么此代码可能会被删除以及我们可以在混淆器规则文件中添加哪些内容以防止其被删除?

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

来自混淆器文档:

-打印用法
指定列出输入类文件的死代码。该列表将打印到标准输出或给定文件。例如,您可以列出应用程序未使用的代码。仅适用于收缩时。

这意味着 R8 打印它将删除的类,因为它们被认为是死代码

要验证代码是否确实已登陆应用程序,请在 Android Studio APK 分析器中打开它并查找类。

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