android zygote进程重启问题调试

本文记录了一个在连接WiFi后Android设备上的Zygote进程异常重启的问题。日志显示因尝试将空字符串转换为整数引发NumberFormatException。错误发生在CpuManager和UserInfo类中,进一步追踪到OtaService的发送POST请求过程中。删除引发问题的APK后,问题得到解决。
AI助手已提取文章相关产品:

最近遇到一个连接wifi后zygote进程重启的问题。


打印log如下:

D/CPU Manager(  351): CPU Count: 1
W/System.err(  351): java.lang.NumberFormatException: Invalid int: "
W/System.err(  351): "
W/System.err(  351):    at java.lang.Integer.invalidInt(Integer.java:138)
W/System.err(  351):    at java.lang.Integer.parse(Integer.java:375)
W/System.err(  351):    at java.lang.Integer.parseInt(Integer.java:366)
W/System.err(  351):    at android.softwinner.utils.CpuManager.getChipID(CpuManager.java:224)
W/System.err(  351):    at android.softwinner.utils.UserInfo.getCpuInfo(UserInfo.java:41)
W/System.err(  351):    at com.softwinner.service.DeviceInfoService.getData(DeviceInfoService.java:126)
W/System.err(  351):    at com.softwinner.service.DeviceInfoService$PostThread.run(DeviceInfoService.java:234)
D/CPU Manager(  351): CPU Count: 1
W/dalvikvm(  351): threadid=77: thread exiting with uncaught exception (group=0x41e5f930)
E/AndroidRuntime(  351): *** FATAL EXCEPTION IN SYSTEM PROCESS: Thread-108
E/AndroidRuntime(  351): java.lang.NumberFormatException: Invalid int: "
E/AndroidRuntime(  351): "
E/AndroidRuntime(  351):        at java.lang.Integer.invalidInt(Integer.java:138)
E/AndroidRuntime(  351):        at java.lang.Integer.parse(Integer.java:375)
E/AndroidRuntime(  351):        at java.lang.Integer.parseInt(Integer.java:366)
E/AndroidRuntime(  351):        at android.softwinner.utils.CpuManager.getChipID(CpuManager.java:224)
E/AndroidRuntime(  351):        at android.softwinner.utils.UserInfo.getCpuInfo(UserInfo.java:41)
E/AndroidRuntime(  351):        at com.softwinner.service.OtaService.sendPostAndGetResult(OtaService.java:122)
E/AndroidRuntime(  351):        at com.softwinner.service.OtaService.access$100(OtaService.java:54)
E/AndroidRuntime(  351):        at com.softwinner.service.OtaService$PostThread.run(OtaService.java:272)
D/dalvikvm(  351): GC_CONCURRENT freed 1867K, 40% free 7709K/12792K, paused 6ms+9ms, total 166ms
D/ConnectivityService(  351): handleInetConditionChange: net=-1 != default=1 - ignore
I/Process (  351): Sending signal. PID: 351 SIG: 9
[  212.230071] binder: release 351:587 transaction 62062 in, still active
E/installd(   86): eof[  212.242675] alarm_release: clear alarm, pending 0


E/installd(   86): failed to r[  212.250283] alarm_release: clear alarm, pending 0
ead size
I/installd(   86): clo[  212.250283] alarm_release: clear alarm, pending 0
sing connection
[  212.265183] binder: release 351:587 transaction 62057 out, still active
[  212.273234] alarm_release: clear alarm, pending 0
E/InputEventReceiver(  517): channel '424acd58 com.android.systemui.ImageWallpaper (client)' ~ Publisher closed input channel or[  212.290046] binder: send failed reply for transaction 
62062 to 1032:1046
[  212.290046] binder: undelivered transaction 62073


E/InputEventReceiver(  517): channel '423663c8 SystemBar (clien[  212.306766] init: waitpid returned pid 133, status = 00000009
t)' ~ Publisher closed input cha[  212.318062] init: process 'zygote', pid 133 exited
nnel or an error occurred.  events=0x9
E/InputEventReceiver(  517): channel '4236b550 NotificationPanel (client)' ~ Publisher closed input channel or an error occurred.  events=0x9
E/InputEv[  212.340051] init: process 'zygote' killing any children in process group





通过log查找到是某个APK调用了不存在的服务导致,删掉APK后解决问题。



您可能感兴趣的与本文相关内容

<think>嗯,用户的问题是关于Android系统中init进程阶段因多线程问题导致系统重启的解决方案。首先,我需要回忆一下init进程的作用。根据引用[3],init进程根据init.rc运行app_process,启动Zygote和SystemServer。那用户提到的多线程问题可能发生在init进程初始化的过程中,或者其启动的服务中。 用户提到的引用[1]提到,多线程同步或状态机问题导致约八成以上的严重重启问题。这说明在Android系统底层,尤其是多线程操作中,锁的使用不当容易引发问题。所以解决方案可能涉及正确使用同步机制,如互斥锁、条件变量等,避免竞态条件和死锁。 接下来,我需要分析init进程的具体工作流程。引用[3]指出,Zygote会预加载类库和资源,然后fork SystemServer。如果在初始化过程中,有多个线程同时操作共享资源而没有正确同步,可能导致状态不一致,进而引发崩溃。例如,在初始化服务时,如果多个线程同时访问某个未加锁的全局变量,可能会引发问题。 另外,引用[4]提到System Server不被watchdog kill的原因,以及线程同步的问题。虽然这是关于System Server的,但可能init进程中的服务也有类似的机制。比如,如果某个线程长时间阻塞或未能及时响应,可能触发看门狗导致重启。因此,需要检查是否有线程未能正确释放锁或处理超时。 解决方案方面,可能需要代码审查,检查init进程相关代码中的多线程部分,确保同步机制正确应用。使用调试工具如gdb、addr2line分析崩溃日志,找到具体的锁竞争位置。此外,参考引用[2]中的书籍,如《深入理解Android内核设计思想》,可能提供系统内部机制,帮助理解init进程的线程模型。 用户可能需要具体的步骤,比如如何添加同步锁,如何分析日志,或者如何测试修复后的代码。例如,在C++代码中使用pthread_mutex_lock来保护临界区,或者在Java层使用synchronized关键字。此外,确保资源释放和状态机的正确切换,避免死锁。 总结来说,用户需要的是针对init进程多线程问题的排查方法和解决方案,包括代码审查、同步机制的应用、调试工具的使用,以及参考相关技术资料。需要将这些步骤详细列出,帮助用户一步步解决问题,并预防未来的类似问题。</think>### Android init进程多线程问题导致系统重启的解决方案 #### 一、问题定位与分析 1. **核心原因** Android系统启动阶段init进程通过多线程机制执行服务初始化(如Zygote、SystemServer等),若存在**未正确同步的共享资源访问**或**状态机逻辑错误**,会导致系统崩溃重启[^1][^3]。 2. **典型场景** - 服务初始化时多个线程同时操作未加锁的全局变量 - 状态机切换未正确处理线程间通信(如信号量/条件变量未配对使用) - 文件描述符或Socket在多线程环境下未正确关闭/复用 #### 二、具体解决方案 1. **同步机制增强** ```c // 示例:C++层同步锁(常见于init进程底层代码) pthread_mutex_t resource_lock = PTHREAD_MUTEX_INITIALIZER; void critical_section() { pthread_mutex_lock(&resource_lock); // 操作共享资源 pthread_mutex_unlock(&resource_lock); } ``` 需确保所有共享资源访问路径都通过锁保护,避免竞态条件[^1]。 2. **状态机验证** - 使用`strace`跟踪线程系统调用序列 - 通过`kill -3 <pid>`生成ANR日志,检查线程堆栈阻塞点 - 验证状态迁移逻辑是否满足: $$ \forall s_i \in S,\exists! s_j \mid s_i \xrightarrow{event} s_j $$ 3. **资源泄漏排查** ```shell # 检查文件描述符泄漏 adb shell ls -l /proc/<init_pid>/fd # 检查Socket泄漏 adb shell netstat -anp | grep init ``` #### 三、调试工具链 | 工具 | 用途 | 示例命令 | |---------------|-----------------------------|----------------------------| | **gdb** | 动态调试init进程 | `gdb -p <init_pid>` | | **addr2line** | 转换崩溃地址为代码行 | `addr2line -e init 0xabcd` | | **systrace** | 分析线程间同步延迟 | `systrace.py --async_start`| #### 四、预防措施 1. 遵循**Happens-Before原则**设计多线程逻辑 2. 使用Android特有同步机制: ```cpp // frameworks/base/include/utils/Mutex.h android::Mutex mLock; mLock.lock(); // 临界区操作 mLock.unlock(); ``` 3. 定期运行`ThreadSanitizer`进行静态检测[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值