卸载ap导致的重启问题回顾

来源:互联网 发布:淘宝千里眼怎么安装 编辑:程序博客网 时间:2024/06/06 01:24

问题描述

L版本上安装一个apk

移动到sd卡上

升级系统到M版本

打开应用

卸载

就出现了重启

 

系统被杀掉了

自己写一个ap,也会出现这个问题

 

 

这个复现步骤很繁琐,随着sd卡的消退,出现该问题的几率很小

但是,为了追求完美,我们还是要去分析


查看log

05-01 09:33:54.119: I/ActivityManager(1107): Force stopping com.UCMobile appid=10150 user=-1: uninstall pkg

 

05-01 09:33:55.521: E/ProcessKiller(385): Process system_server (1107) has open file /mnt/asec/com.UCMobile-2/base.apk

05-01 09:33:55.894: E/ProcessKiller(385): Process com.google.android.packageinstaller (7798) has open file /mnt/asec/com.UCMobile-2/base.apk

05-01 09:33:57.658: E/ProcessKiller(385): Process system_server (1107) has open file /mnt/asec/com.UCMobile-2/base.apk

05-01 09:33:58.077: E/ProcessKiller(385): Process com.google.android.packageinstaller (7798) has open file /mnt/asec/com.UCMobile-2/base.apk

05-01 09:33:59.788: E/ProcessKiller(385): Process system_server (1107) has open file /mnt/asec/com.UCMobile-2/base.apk

05-01 09:33:59.788: W/ProcessKiller(385): Sending Terminated to process 1107

05-01 09:34:00.219: E/ProcessKiller(385): Process com.google.android.packageinstaller (7798) has open file /mnt/asec/com.UCMobile-2/base.apk

05-01 09:34:00.219: W/ProcessKiller(385): Sending Terminated to process 7798

 

这里看上去是卸载sd卡上的ap时,太着急了,pms还没有走完,就动手kill

ps|grep 385

root      385   1     26484  2844  hrtimer_na 0000000000 S /system/bin/vold

media_rw  8424  385   16720  2096  inotify_re 0000000000 S /system/bin/sdcard

media_rw  8663  385   16720  2116  inotify_re 0000000000 S /system/bin/sdcard

 

搜索log

ProcessKiller(385): Sending Terminated to process
有分析:

【Android】killProcessesWithOpenFiles分析

http://blog.csdn.net/aaajj/article/details/51854015

研究到这里的时候,已经可以采用屏蔽kill信号的方式避免重启,
但这只是个不得已的方法,很粗糙。

继续研究,可否采用某种方式关闭打开了的fd呢?
信号组合的方法进行文件关闭
http://blog.csdn.net/aaajj/article/details/52155937


强制close 打开的fd显然不是一个好方法,
因为没有找到原因,到底是哪里打开了base.apk
/mnt/asec/com.UCMobile-2/base.apk
而创建的fd呢?
一个非常关键的思路出现了,
采用引蛇出洞的方式,删除掉base.apk,然后点击应用,查看报错log
01-02 01:13:25.763: V/PackageManagerService(1062): getApplicationInfo com.UCMobile: Package{76884dc com.UCMobile}
01-02 01:13:25.764: W/asset(1062): Asset path /data/app/com.UCMobile-1/base.apk is neither a directory nor file (type=1).

于是找到了asset
继续分析
AssetManager打开及关闭文件研究
http://blog.csdn.net/aaajj/article/details/52627192

似乎看不出哪里有内存泄露导致fd没有及时关闭

而重启又是由卸载触发的,分析卸载

Android apk卸载流程

http://blog.csdn.net/aaajj/article/details/52863589

这个时候,对处理流程有了大致了解,
通过不断的测试分析,堆栈分析,以及对比分析

终于,找到内存泄露原因以及解决方案
AssetManager的释放跟踪
http://blog.csdn.net/aaajj/article/details/52960079#t3


解决方案很简单,但探索过程极度曲折艰难

充满想象的探索尝试,是解决这个问题的灵丹妙药


一把辛酸泪,弦断有谁听


0 0