Proguard 在 proguard-rules.pro 中添加包名称后运行 R8 时检测到缺少类

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

AGPBI
将此作为输出:

> Task :app:minifyReleaseWithR8
AGPBI: {"kind":"warning","text":"Unexpected reference to missing service class: META-INF/services/reactor.blockhound.integration.BlockHoundIntegration.","sources":[{"file":"/app/build/intermediates/merged_java_res/release/base.jar"}],"tool":"R8"}

AGPBI: {"kind":"warning","text":"Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in /app/build/outputs/mapping/release/missing_rules.txt.\n","sources":[{}]}

AGPBI: {"kind":"warning","text":"Missing class com.aayushatharva.brotli4j.Brotli4jLoader (referenced from: void io.netty.handler.codec.compression.Brotli.<clinit>() and 2 other contexts)\n

Missing class com.aayushatharva.brotli4j.decoder.DecoderJNI$Status (referenced from: void io.netty.handler.codec.compression.BrotliDecoder$1.<clinit>() and 1 other context)\n
Missing class com.aayushatharva.brotli4j.decoder.DecoderJNI$Wrapper (referenced from: com.aayushatharva.brotli4j.decoder.DecoderJNI$Wrapper io.netty.handler.codec.compression.BrotliDecoder.decoder and 4 other contexts)\n
Missing class com.aayushatharva.brotli4j.encoder.Encoder$Mode (referenced from: void io.netty.handler.codec.compression.BrotliOptions.<clinit>())\n
Missing class com.aayushatharva.brotli4j.encoder.Encoder$Parameters (referenced from: com.aayushatharva.brotli4j.encoder.Encoder$Parameters io.netty.handler.codec.compression.BrotliEncoder.parameters and 7 other contexts)\n
Missing class com.aayushatharva.brotli4j.encoder.Encoder (referenced from: io.netty.buffer.ByteBuf io.netty.handler.codec.compression.BrotliEncoder.allocateBuffer(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, boolean))\n
Missing class com.android.org.conscrypt.SSLParametersImpl (referenced from: void org.conscrypt.KitKatPlatformOpenSSLSocketImplAdapter.<init>(org.conscrypt.AbstractConscryptSocket))\n
Missing class com.github.luben.zstd.Zstd (referenced from: io.netty.buffer.ByteBuf io.netty.handler.codec.compression.ZstdEncoder.allocateBuffer(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf, boolean) and 1 other context)\n
Missing class com.google.protobuf.ExtensionRegistry (referenced from: void io.netty.handler.codec.protobuf.ProtobufDecoder.<init>(com.google.protobuf.MessageLite, com.google.protobuf.ExtensionRegistry))\n
Missing class com.google.protobuf.ExtensionRegistryLite (referenced from: com.google.protobuf.ExtensionRegistryLite io.netty.handler.codec.protobuf.ProtobufDecoder.extensionRegistry and 2 other contexts)\n

丢失的文件似乎是

bouncycastle
库的一部分。这是我的
proguard
文件:

-keep class org.spongycastle.** { *; }
-dontwarn org.spongycastle.**

# When I remove this, java.security.cert.CertificateException: X.509 not found is thrown
-keep class org.bouncycastle.** { *; }
-keep interface org.bouncycastle.**

# I got the missing classes from missing_rules.txt and added the package names that created the problem here:
-keep class org.conscrypt.** { *; }
-keep class io.netty.** { *; }

-keep class com.aayushatharva.** { *; }

-keep class ** { *; }

build.gradle(应用程序):

implementation "org.conscrypt:conscrypt-android:$conscrypt"
implementation 'org.bouncycastle:bcprov-jdk15on:1.69'
implementation 'org.bouncycastle:bcpkix-jdk15on:1.69'

为什么当我添加正确的缺失包名称时它仍然给出错误?

android kotlin proguard
9个回答
66
投票

我将 gradle 升级到

8.0
当我打包我的应用程序时,我遇到了同样的问题。

这是错误信息

运行 R8 时检测到缺少类。请添加缺少的类或应用在 mmmissing_rules.txt 路径

中生成的其他保留规则

我按照这样的路径访问 mmmissing_rules.txt

app -> build -> outputs -> mapping -> your_app_name -> missing_rules.txt

我收到这些消息

# Please add these rules to your existing keep rules in order to 
  suppress warnings.
# This is generated automatically by the Android Gradle plugin.
-dontwarn android.os.ServiceManager*
-dontwarn com.bun.miitmdid.core.MdidSdkHelper*
-dontwarn com.bun.miitmdid.interfaces.IIdentifierListener*
-dontwarn com.bun.miitmdid.interfaces.IdSupplier*
-dontwarn com.google.firebase.iid.FirebaseInstanceId*
-dontwarn com.google.firebase.iid.InstanceIdResult*
-dontwarn com.huawei.hms.ads.identifier.AdvertisingIdClient$Info*
-dontwarn com.huawei.hms.ads.identifier.AdvertisingIdClient*
-dontwarn com.tencent.android.tpush.otherpush.OtherPushClient*

我将这些消息复制到

proguard-rules.pro
,然后解决这个问题。


22
投票

缺少类警告表明上述类不存在于输入(您的源代码和依赖项)或引用的库中(在本例中由 Platfrom SDK 提供的 Android 运行时库

android.jar
)。当 R8 跟踪程序时,它将尝试处理在它认为处于活动状态的程序部分中找到的所有类、方法和字段。将所有类保留在一个包中不会改变这一点。这种情况有两种选择:

  1. 找到缺少的依赖项并将其添加到项目中
  2. 使用
    -dontwarn
    忽略警告,因为该类预计会丢失。

对于班级警告

com.android.org.conscrypt.SSLParametersImpl
添加

-dontwarn com.android.org.conscrypt.SSLParametersImpl`

是正确的做法,因为查看 source 显示该类扩展了一个将在 KitKat 运行时中的类,但不在应用程序中(并且也不在

android.jar
中)。

对于其余警告,必须做出类似的决定。


9
投票

不直接是OP的问题,但如果您发现R8因缺少规则而导致构建失败,并且您使用的是旧版本的OkHttp,则可以将OkHttp升级到4.11.0以获取必要的Proguard规则,而不是将它们添加到您的项目中.


1
投票

将missing_rules.txt文件中的-dontwarn规则写入proguard-rules文件中


0
投票

在 proguard-rules 文件中写入 -dontwarn 规则

-dontwarn okhttp3.internal.platform.**
-dontwarn org.conscrypt.**
-dontwarn org.bouncycastle.**
-dontwarn org.openjsse.**

0
投票

这些规则对我有用

-dontwarn com.google.protobuf.java_com_google_android_gmscore_sdk_target_granule__proguard_group_gtm_N1281923064GeneratedExtensionRegistryLite**

-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

0
投票
  1. 转到 proguard-rules 文件(此文件在 Gradle 脚本中可用)
  2. 将此规则添加到 proguard-rules 文件中
-dontwarn android.media.Spatializer$OnSpatializerStateChangedListener

-dontwarn android.media.Spatializer

0
投票

只需将 -ignorewarnings 添加到 proguard-rules.pro,如 Android 8 发行说明中所述。


-1
投票

您可以在调试应用程序时禁用 minifyEnabled,因为您是在手机上调试应用程序,但对于发布版本,让 minifyEnabled true ;

    buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.ProfileForsign
    }
    debug {
        signingConfig signingConfigs.ProfileForsign
        debuggable true
        minifyEnabled false
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.