Android 5.1.1自定义AOSP中PPP连接后com.android.phone崩溃求助
从你的日志来看,核心崩溃原因非常明确:java.lang.SecurityException: Package android does not belong to 1001。这里的uid 1001是radio用户组的ID(com.android.phone进程默认运行在这个uid下),而android系统包的uid是1000(system用户),两者不匹配导致AppOps权限检查失败,直接杀死了phone进程。
下面是针对性的排查和解决思路:
1. 定位NetworkAgent注册的包名错误
崩溃发生在DataConnection$DcNetworkAgent初始化时调用ConnectivityManager.registerNetworkAgent的环节。问题大概率出在Telephony框架代码中,注册网络代理时错误地传递了android作为包名,而非com.android.phone。
你需要检查packages/services/Telephony/src/com/android/internal/telephony/dataconnection/DataConnection.java中的DcNetworkAgent构造逻辑:
// 找到类似这样的代码段 NetworkAgentConfiguration config = new NetworkAgentConfiguration(); // 错误示例:config.setPackageName("android"); // 正确写法应该是: config.setPackageName("com.android.phone");
如果这里被错误设置为android,就会触发uid和包名不匹配的SecurityException。
2. 验证com.android.phone的Manifest配置
确保Telephony服务的Manifest文件正确声明了uid和包名:
打开packages/services/Telephony/AndroidManifest.xml,检查以下配置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.phone" android:sharedUserId="android.uid.phone"> <!-- 必须是这个sharedUserId,对应uid 1001 --> <!-- 确保声明了必要的内部权限 --> <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
如果sharedUserId被错误修改为android.uid.system,也会导致uid不匹配。
3. 检查pppd进程的运行上下文
虽然你提到/dev/ttyUSB3的权限是system:radio,但需要确认pppd进程的运行uid:
在设备上执行命令:
ps | grep pppd
如果pppd以root或system uid运行,可能会导致Telephony框架在处理PPP连接时获取错误的上下文。你可以调整pppd的启动脚本,让它以radio uid运行(使用su radio -c "pppd ..."的方式启动)。
4. 调试AppOps权限检查(临时方案)
如果需要快速验证问题,可以临时修改ConnectivityService的权限检查逻辑(不建议作为最终解决方案):
在frameworks/base/services/core/java/com/android/server/ConnectivityService.java中,找到registerNetworkAgent方法,暂时注释掉包名和uid的校验逻辑,看看是否还会崩溃。如果不崩溃,就坐实了是包名/uid不匹配的问题。
5. 检查RIL二进制的适配
你添加的SIMCOM二进制文件是否针对Android 5.1.1和NanoPC T3做了正确适配?某些预编译的RIL库可能会错误地设置进程上下文,导致Telephony服务运行在错误的uid下。可以尝试替换为官方适配的SIMCOM RIL版本,或者检查RIL初始化时的参数传递。
内容的提问来源于stack exchange,提问作者Dave McLaughlin

