# Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile ## 萤石云 SDK 混淆规则 #-keep class com.ezviz.** { *; } #-keep class com.videogo.** { *; } #-keep class com.media.** { *; } #-dontwarn com.ezviz.** #-dontwarn com.videogo.** #-dontwarn com.media.** #========SDK对外接口=======# -keep class com.ezviz.opensdk.** { *; } #========以下是hik二方库=======# -dontwarn com.ezviz.** -keep class com.ezviz.** { *; } -dontwarn com.ez.** -keep class com.ez.** { *; } -dontwarn com.hc.CASClient.** -keep class com.hc.CASClient.** { *; } -dontwarn com.videogo.** -keep class com.videogo.** { *; } -dontwarn com.hik.TTSClient.** -keep class com.hik.TTSClient.** { *; } -dontwarn com.hik.stunclient.** -keep class com.hik.stunclient.** { *; } -dontwarn com.hik.streamclient.** -keep class com.hik.streamclient.** { *; } -dontwarn com.hikvision.sadp.** -keep class com.hikvision.sadp.** { *; } -dontwarn com.hikvision.netsdk.** -keep class com.hikvision.netsdk.** { *; } -dontwarn com.neutral.netsdk.** -keep class com.neutral.netsdk.** { *; } -dontwarn com.hikvision.audio.** -keep class com.hikvision.audio.** { *; } -dontwarn com.mediaplayer.audio.** -keep class com.mediaplayer.audio.** { *; } -dontwarn com.hikvision.wifi.** -keep class com.hikvision.wifi.** { *; } -dontwarn com.hikvision.keyprotect.** -keep class com.hikvision.keyprotect.** { *; } -dontwarn org.MediaPlayer.PlayM4.** -keep class org.MediaPlayer.PlayM4.** { *; } #========以上是hik二方库=======# #========以下是第三方开源库=======# # JNA -dontwarn com.sun.jna.** -keep class com.sun.jna.** { *; } # Gson -keepattributes *Annotation* -keep class sun.misc.Unsafe { *; } -keep class com.google.gson.stream.** { *; } # OkHttp # JSR 305 annotations are for embedding nullability information. -dontwarn javax.annotation.** # A resource is loaded with a relative path so the package of this class must be preserved. -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase # Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. -dontwarn org.codehaus.mojo.animal_sniffer.* # OkHttp platform used only on JVM and when Conscrypt dependency is available. -dontwarn okhttp3.internal.platform.ConscryptPlatform # 必须额外加的,否则编译无法通过 -dontwarn okio.** #========以上是第三方开源库=======# 解决报错:Unresolved class name
时间: 2025-07-30 15:25:31 AIGC 浏览: 28 评论: 6
<think>根据提供的ProGuard规则文件,报错“Unresolvedclassname”通常是由于ProGuard在混淆过程中移除了某些类或方法,而代码中又引用了这些类或方法导致的。但是,从规则中可以看到,已经对很多包进行了保留(keep),所以问题可能出在规则没有覆盖到某些类。然而,报错“Unresolvedclassname”也可能是由于其他原因,比如:1.在代码中引用了某个类,但该类并不存在于项目的依赖中(即根本没有这个类)。2.该类存在于依赖中,但依赖没有正确添加到项目中。3.ProGuard规则过于严格,移除了某些必要的类。由于你提供的ProGuard规则中已经对很多包进行了保留,所以我们需要检查是否有遗漏的包。观察规则,发现已经对萤石云SDK(com.ezviz.opensdk等)、hik二方库(如com.hikvision.netsdk等)以及第三方库(如okhttp,gson等)进行了保留。但是,报错信息“Unresolvedclassname”并没有指明是哪个类,所以我们需要进一步排查。建议的解决方案:1.检查编译日志,确定是哪个类找不到。通常,在构建过程中,如果ProGuard移除了某个类,会在日志中输出相关信息。2.如果确定是ProGuard移除了某个类,则需要在ProGuard规则中添加对该类的保留。例如,如果找不到的类在包`com.example`中,则添加:```-keepclasscom.example.**{*;}```3.如果找不到的类是第三方库中的,确保该库已经正确添加到依赖中,并且ProGuard规则中已经包含了对该库的保留规则。4.如果问题依然存在,可以尝试在ProGuard规则中保留所有类(仅用于测试),然后逐步缩小范围。例如:```-keepclass*{*;}```如果这样能解决问题,说明是ProGuard规则太严格,需要根据实际情况调整规则。5.如果使用的是AndroidStudio,可以检查`build.gradle`文件中是否启用了ProGuard(或R8),并确保规则文件被正确包含。由于没有具体的类名,我无法给出针对性的规则。但是,根据你提供的规则,我注意到有一个地方可能存在问题:规则中有一行:```-keepclasscom.ezviz.opensdk.**{*;}```但是,在萤石云SDK部分,之前被注释掉的规则中还有`com.ezviz.**`,而这里只保留了`com.ezviz.opensdk.**`。如果SDK中还有其他包(比如`com.ezviz.someotherpackage`)没有被保留,那么这些包中的类可能会被混淆或移除。因此,建议将规则改为:```-keepclasscom.ezviz.**{*;}```同样,对于其他二方库,也要确保所有必要的包都被保留。修改后的规则(部分)如下:```proguard#========SDK对外接口=======##修改为保留整个ezviz包-keepclasscom.ezviz.**{*;}#========以下是hik二方库=======#-dontwarncom.ezviz.**#上面已经保留了com.ezviz.**,所以这里可以去掉重复的保留规则,但保留也无妨#其他二方库规则保持不变...```另外,请注意规则中对于第三方库的保留已经比较全面,但如果有新的第三方库引入,需要添加对应的规则。最后,如果问题仍然存在,请提供具体的类名,以便更精确地添加规则。由于问题描述中没有具体的类名,以上是通用的解决方案。§§相关问题§§:1.如何在Android构建过程中查看ProGuard移除了哪些类?2.如何解决ProGuard导致的运行时ClassNotFoundException?3.在Android中,如何为特定的第三方库编写ProGuard规则?4.R8和ProGuard在规则上有哪些兼容性注意事项?</think>根据报错信息 "Unresolved class name",这通常是由于 ProGuard 规则配置不正确导致的。以下是解决方案:
### 修改后的 ProGuard 规则
```proguard
# 保留所有类名(解决 Unresolved class name 问题)
-keepnames class * {
*;
}
# 保留所有类成员(防止方法/字段被移除)
-keepclassmembers class * {
*;
}
# 保留所有注解(防止注解被移除)
-keepattributes *Annotation*
# ======== 萤石云 SDK 混淆规则 ========
-keep class com.ezviz.** { *; }
-keep class com.videogo.** { *; }
-keep class com.media.** { *; }
-dontwarn com.ezviz.**
-dontwarn com.videogo.**
-dontwarn com.media.**
# ======== SDK 对外接口 ========
-keep class com.ezviz.opensdk.** { *; }
# ======== hik 二方库 ========
-dontwarn com.ez.**
-keep class com.ez.** { *; }
-dontwarn com.hc.CASClient.**
-keep class com.hc.CASClient.** { *; }
-dontwarn com.hik.TTSClient.**
-keep class com.hik.TTSClient.** { *; }
-dontwarn com.hik.stunclient.**
-keep class com.hik.stunclient.** { *; }
-dontwarn com.hik.streamclient.**
-keep class com.hik.streamclient.** { *; }
-dontwarn com.hikvision.sadp.**
-keep class com.hikvision.sadp.** { *; }
-dontwarn com.hikvision.netsdk.**
-keep class com.hikvision.netsdk.** { *; }
-dontwarn com.neutral.netsdk.**
-keep class com.neutral.netsdk.** { *; }
-dontwarn com.hikvision.audio.**
-keep class com.hikvision.audio.** { *; }
-dontwarn com.mediaplayer.audio.**
-keep class com.mediaplayer.audio.** { *; }
-dontwarn com.hikvision.wifi.**
-keep class com.hikvision.wifi.** { *; }
-dontwarn com.hikvision.keyprotect.**
-keep class com.hikvision.keyprotect.** { *; }
-dontwarn org.MediaPlayer.PlayM4.**
-keep class org.MediaPlayer.PlayM4.** { *; }
# ======== 第三方开源库 ========
# JNA
-dontwarn com.sun.jna.**
-keep class com.sun.jna.** { *; }
# Gson
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.** { *; }
-keep class com.google.gson.stream.** { *; }
# OkHttp
-dontwarn javax.annotation.**
-dontwarn org.codehaus.mojo.animal_sniffer.*
-dontwarn okhttp3.internal.platform.ConscryptPlatform
-dontwarn okio.**
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
# ======== 调试信息保留 ========
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile
```
### 关键修改说明:
1. **添加全局保留规则**:
```proguard
-keepnames class * { *; }
-keepclassmembers class * { *; }
```
- 保留所有类名和类成员,防止类名被混淆导致运行时找不到类
- `-keepnames` 确保类名在混淆后保持不变
2. **修复 Gson 规则**:
```proguard
-keep class com.google.gson.** { *; }
```
- 原规则只保留了 `com.google.gson.stream.**`,忽略了主包
- 确保 Gson 的核心类不被混淆
3. **增强 OkHttp 规则**:
```proguard
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
```
- 保留所有 OkHttp 类和接口,防止反射调用失败
4. **添加注解保留**:
```proguard
-keepattributes *Annotation*
```
- 防止运行时注解被移除,这对依赖注解的框架很重要
5. **保留调试信息**:
```proguard
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile
```
- 保留行号信息便于调试
- 统一重命名源文件属性
### 使用建议:
1. **测试混淆后的 APK**:
使用以下命令检查是否还有类找不到:
```bash
aapt dump badging your-app.apk | grep "unresolved"
```
2. **缩小保留范围**:
如果 APK 体积过大,可以逐步缩小保留范围:
```proguard
# 替代全局保留
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
```
3. **处理特定错误**:
如果仍有类找不到,在 build.gradle 中添加:
```gradle
android {
buildTypes {
release {
debuggable true // 临时开启调试
}
}
}
```
运行应用后检查 logcat 中的 `ClassNotFoundException`
阅读全文
评论

以墨健康道
2025.09.01
详细记录了ProGuard规则的优化过程。

yxldr
2025.08.19
逐步缩小保留范围以控制APK大小。

SLHJ-Translator
2025.07.12
ProGuard规则需确保关键类和包不被混淆。

SeaNico
2025.06.15
调试信息保留有助于问题定位。

13572025090
2025.05.09
保留规则配置不全可能是报错原因。

蔓誅裟華
2025.05.05
添加通用保留规则以防止类名混淆。