Android平台ONVIF WS-Discovery实现及Evercam类加载异常求助
ClassNotFoundException(net.sbbi.upnp.Discovery) 我之前在Android项目里整合Evercam做ONVIF功能时,也踩过这个类找不到的坑,结合你的堆栈信息来看,这个问题基本是依赖缺失或者打包配置导致运行时找不到upnp相关类,给你几个靠谱的解决方向:
补全依赖项
Evercam库依赖了sbbi-upnp这个第三方UPNP库,但很多时候只引入Evercam本身的依赖是不够的。你需要在项目的build.gradle(Module level)里添加这个依赖:implementation 'net.sbbi:upnplib:1.0.4'同时要确保你的仓库配置里包含了能拉取这个库的源,比如
mavenCentral()或者jcenter()(如果还能用的话)。排除ProGuard的混淆影响
如果你的项目开启了ProGuard混淆,很可能它把net.sbbi.upnp下的类当成无用代码给移除了。打开proguard-rules.pro,添加以下规则保护这些类:-keep class net.sbbi.upnp.** { *; } -keep interface net.sbbi.upnp.** { *; }之后clean项目再重新构建。
检查打包配置
如果你用了Android App Bundle或者动态特性模块,要确认sbbi-upnp的依赖是添加在主模块的build.gradle里,而不是某个动态模块。动态模块的依赖不会默认打包进主APK,导致运行时找不到类。手动引入Jar包(兜底方案)
如果依赖管理工具拉取库有问题,可以直接下载sbbi-upnplib的jar包(对应版本),放到项目的libs目录下,然后在build.gradle里添加:implementation files('libs/upnplib-1.0.4.jar')
另外提醒一下:你遇到的是NoClassDefFoundError,不是编译时的ClassNotFoundException,这说明编译时类是存在的,但运行时类路径里找不到,所以重点排查运行时的类打包情况。
内容的提问来源于stack exchange,提问作者Nilotpal Roychowdhury

