Android 14应用崩溃:需指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED
解决Android 14上Agora Chat SDK 1.2.0的SecurityException问题
问题原因
Android 14(API 34)对动态注册广播接收器新增强制规则:所有非仅接收系统广播的动态注册接收器,必须显式指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED标记。而io.agora.rtc:chat-sdk:1.2.0版本未适配该规则,内部动态注册广播时未添加对应标记,直接触发SecurityException。
解决方案
方案1:升级SDK到适配Android 14的版本
这是最稳妥的解决方式,Agora后续版本已修复该兼容性问题。将项目中的SDK依赖替换为最新兼容版本,示例如下:
dependencies { implementation 'io.agora.rtc:chat-sdk:1.3.0' // 或更高稳定版本 }
替换后同步Gradle,重新编译运行即可。
方案2:临时Hook方案(无法升级SDK时使用)
若暂时无法升级SDK,可通过反射Hook系统的广播注册方法,为SDK内部注册的接收器自动添加RECEIVER_NOT_EXPORTED标记(假设SDK内部接收器无需对外暴露):
- 创建Hook工具类:
import android.content.Context; import android.content.IntentFilter; import android.os.Build; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class BroadcastHookUtil { public static void init(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { return; } try { // 获取ActivityManager的代理对象 Object iActivityManager = Class.forName("android.app.ActivityManagerNative") .getMethod("getDefault").invoke(null); // 创建动态代理,拦截registerReceiverWithFeature方法 Object proxy = Proxy.newProxyInstance( ClassLoader.getSystemClassLoader(), new Class[]{Class.forName("android.app.IActivityManager")}, (proxyObj, method, args) -> { if ("registerReceiverWithFeature".equals(method.getName()) && args.length == 6) { // 给注册参数添加RECEIVER_NOT_EXPORTED标记 int flags = (int) args[5]; if ((flags & (IntentFilter.RECEIVER_EXPORTED | IntentFilter.RECEIVER_NOT_EXPORTED)) == 0) { args[5] = flags | IntentFilter.RECEIVER_NOT_EXPORTED; } } return method.invoke(iActivityManager, args); }); // 替换系统的ActivityManager代理 Class.forName("android.app.ActivityManagerNative") .getField("gDefault").set(null, proxy); } catch (Exception e) { e.printStackTrace(); } } }
- 在自定义Application中初始化Hook:
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); BroadcastHookUtil.init(this); // 初始化Agora Chat SDK ChatClient.getInstance().init(this, new ChatOptions()); } }
注意:Hook属于非常规操作,存在兼容性风险,仅作临时应急使用,优先推荐升级SDK。
验证步骤
- 应用任一方案后,在Android 14设备上重新运行应用。
- 触发聊天相关功能,检查是否再出现
SecurityException崩溃。
内容的提问来源于stack exchange,提问作者PRADEEP TRIVEDI
相关产品推荐
相关产品推荐

