物理设备MQTT连接异常求助:曾正常连接公共代理
Android MQTT连接故障排查(物理设备无法连接公共代理)
我正在开发一款订阅MQTT主题并接收消息的Android应用。几小时前,应用在模拟器和物理手机上都能正常运行,但疑似误改了相关库文件后,物理设备无法连接公共MQTT代理(地址tcp://test.mosquitto.org:1883)。程序提示缓存未清理相关错误,但不确定是否是这个原因导致的——之前应用是能成功连接该代理的。
相关配置信息
依赖配置(build.gradle)
dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' }
服务声明(AndroidManifest.xml)
<service android:name="org.eclipse.paho.android.service.MqttService" > </service>
错误日志
Could not remove dir '/data/data/com.example.app6/code_cache/.ll/': No such file or directory 2023-06-30 14:57:18.997 499-499 audit auditd E type=1400 audit(1688129838.990:26677): avc: granted { execute } for pid=7749 comm="re-initialized>" path="/data/data/com.example.app6/code_cache/startup_agents/8dee6a62-agent.so" dev="mmcblk0p69" ino=7188 scontext=u:r:untrusted_app:s0:c0,c257,c512,c768 tcontext=u:object_r:app_data_file:s0:c0,c257,c512,c768 tclass=file SEPF_SM-T290_11_0004 audit_filtered
排查建议
- 清理缓存并重建项目:日志里的目录不存在错误看似无关,但缓存损坏确实可能引发运行异常。先在Android Studio执行
Build > Clean Project,再Build > Rebuild Project;同时在物理设备的应用设置里,清除应用的缓存和存储数据后重新安装。 - 核对MQTT库文件改动:如果有版本控制(比如Git),对比历史版本确认
org.eclipse.paho相关的依赖、配置或初始化逻辑是否被误改——比如是否删除了依赖、修改了版本号,或者调整了MqttService的调用代码。 - 确认网络权限配置:检查AndroidManifest.xml是否添加了必要的网络权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 简化连接逻辑测试:写一个最小化的连接测试代码,排除业务代码干扰,直接验证MQTT连接:
MqttConnectOptions options = new MqttConnectOptions(); options.setCleanSession(true); try { MqttAndroidClient client = new MqttAndroidClient(context, "tcp://test.mosquitto.org:1883", MqttClient.generateClientId()); IMqttToken token = client.connect(options); token.setActionCallback(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { // 连接成功回调 } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { exception.printStackTrace(); // 打印详细异常定位问题 } }); } catch (MqttException e) { e.printStackTrace(); } - 验证设备与代理连通性:确认物理设备能正常联网,用浏览器访问
http://test.mosquitto.org测试网络;也可以用第三方MQTT客户端(比如手机端的MQTT Explorer)连接tcp://test.mosquitto.org:1883,确认代理本身可用。 - 关注SELinux提示:日志里的avc权限提示显示已授权,但Android 11及以上设备可能存在适配问题,可尝试调试时临时关闭SELinux(仅测试用,发布版禁止),或者检查应用的targetSdkVersion是否符合系统要求。
内容的提问来源于stack exchange,提问作者boligrafo 45
相关产品推荐
相关产品推荐

