如何通过Android Studio Logcat定位Cordova Chromecast插件崩溃源文件
崩溃核心原因
从Logcat堆栈跟踪可直接锁定问题:
java.lang.IllegalArgumentException:
: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
你的应用目标SDK为Android 12(API 31)及以上,而创建PendingIntent时必须指定FLAG_IMMUTABLE或FLAG_MUTABLE标志,当前代码未满足该要求,触发崩溃。
调用链溯源
堆栈的调用路径明确指向问题触发点:
- 异常从
android.app.PendingIntent.checkFlags抛出,说明此处检测到PendingIntent未设置强制要求的标志 - 调用往上追溯到
com.google.android.gms.internal.cast.zzah.zza方法,该方法调用PendingIntent.getBroadcast时未添加合规标志 - 该调用是在
CastSession$zzb.onResult中触发的,也就是Chromecast的会话处理逻辑中出现了问题
定位可编辑文件的步骤
由于com.google.android.gms.internal.cast.zzah是Google Play Services Cast库的编译后字节码(显示Unknown Source说明无源码),无法直接编辑,你需要从以下方向定位可修改的文件:
检查并升级Chromecast插件版本
进入项目的plugins目录,找到Chromecast插件文件夹(通常命名为cordova-plugin-chromecast),查看package.json或plugin.xml确认版本。如果是旧版本,直接升级到最新版,新版本大概率已适配Android 12+的PendingIntent要求。修改插件的Android原生代码
进入插件的src/android目录,搜索所有调用PendingIntent.getBroadcast的代码。如果找到相关代码,添加FLAG_IMMUTABLE(推荐)或FLAG_MUTABLE标志,示例修改:// 原代码 PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); // 修改后 PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);强制升级Google Play Services Cast库版本
如果插件依赖的play-services-cast版本过低,在项目的platforms/android/build.gradle中添加依赖强制升级:dependencies { implementation 'com.google.android.gms:play-services-cast:21.3.0' }新版本的
play-services-cast已内置PendingIntent的正确标志设置。
内容的提问来源于stack exchange,提问作者Klaassiek

