JW Player SDK 2.7.1在Android KitKat版本WebView无法播放求助
我之前在项目升级JW Player SDK时也碰到过一模一样的KitKat兼容问题,结合实际排查经验,给你几个经过验证的解决方案:
1. 修正混淆规则,保留缺失的内部类
报错提示找不到com.longtailvideo.jwplayer.d.h、com.longtailvideo.jwplayer.d.j这类类,大概率是混淆工具(ProGuard/R8)把这些内部类给移除或重命名了。KitKat的Dalvik虚拟机对混淆后的类加载逻辑更严格,而高版本ART的容错性要好很多。
在你的混淆配置文件(proguard-rules.pro)里添加以下规则:
-keep class com.longtailvideo.jwplayer.d.** { *; } -keep class com.longtailvideo.jwplayer.core.i.** { *; }
这样可以确保JW Player内部d包和core.i包下的所有类都不会被混淆或移除,直接解决类找不到的问题。
2. 启用MultiDex支持
从JW Player 2.4.2升级到2.7.1后,SDK新增了大量类和方法,很可能超过了Dalvik虚拟机的65536方法数限制。这种情况下,部分类会被打包进辅助dex文件,但KitKat系统默认不会自动加载这些辅助dex,导致运行时找不到类。
开启MultiDex的步骤:
- 在app模块的
build.gradle中添加依赖:implementation 'androidx.multidex:multidex:2.0.1' - 修改Application类:
如果你的Application已经继承了自定义类,就在attachBaseContext方法中初始化MultiDex:
如果没有自定义Application,直接让它继承@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }MultiDexApplication即可。
3. 优化WebView的KitKat专属兼容设置
KitKat自带的WebView基于Chrome 30左右的版本,对现代JS API和媒体播放的支持有限。可以调整WebView设置来提升兼容性:
WebView webView = findViewById(R.id.your_webview); WebSettings settings = webView.getSettings(); // 基础必要设置 settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true); // JW Player依赖DOM存储功能 settings.setAllowFileAccess(true); settings.setMediaPlaybackRequiresUserGesture(false); // 如需自动播放可开启 // KitKat专属兼容配置 if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); // 开启调试,方便排查JS层问题 settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // 适配HTTPS/HTTP混合资源场景 }
另外,确保JW Player的初始化代码在WebView的onPageFinished回调中执行,避免页面未加载完成就初始化播放器导致的异常。
4. 临时过渡方案:回退到JW Player 2.6.x版本
如果上面的方法都无法快速解决问题,可以暂时回退到JW Player 2.6.x系列版本。这个版本在KitKat的WebView上兼容性更稳定,同时你可以继续排查2.7.x的兼容问题,或者等待JW Player官方的修复更新。
问题根源分析
JW Player 2.7.x版本可能引入了一些KitKat Dalvik虚拟机不支持的Java语法特性(比如Java 8的Lambda或默认方法),或者SDK内部类结构调整后没有同步更新对应的混淆和MultiDex配置。而Android 5.0及以上的ART虚拟机对这些特性和类加载逻辑有更好的支持,所以不会出现问题。
内容的提问来源于stack exchange,提问作者Mehul Patel

