名词解读
名词的解读与定义
白重载
由应用被压缩太严重,进程被杀或者应用没及时进行解冻造成。
表现为:
打开应用,应用页面重新加载
黑重载
相当于冷启动,因为存在程序不完整或者进程丢失,也就是炸binder。
表现为:
应用黑闪一下,出现桌面,然后重新加载页面
闪弹
目前闪弹触发条件不明,我觉得大部分出现于kill上面。
表现为:
应用进入后台之后再次打开,应用在动画没结束的时候就会自动闪退。等再次进入的时候就会发现重新启动了【这种再次重新加载也被成为冷启动】
内存泄漏
1.当你打开软件,然后清掉后台,重复操作,内存占用会一直累加,等到内存耗尽,就会出现卡顿和死机
正常情况下杀死应用后会回收应用占用内存(如QQ占用1.7G内存,杀死QQ及其后台以后系统应能空闲出1.7G左右内存),但是内存泄漏情况下杀死应用后内存不会被回收,导致内存占用越来越多。目前仅freezerv1存在此问题。
表现为:
打开进程查询软件,如果出现2个一样的进程就是内存泄露(非双开应用)
注:
内存泄露会无法释放内存,导致内存满手机卡死,noa3x已经打了内存泄露补丁缓解,但是还是会造成内存泄露
解决方法:
重启手机
掉卡片
表现为:
1.软件进程还在,你去点应用的快捷方式还能打开,但是后台任务卡片掉了
2.长时间不用的app在后台界面,卡片和进程一起丢失
解决方法:
刷入hook了后台防掉卡片的模块,例如后台优化,AppRetention等
冻死
目前出现情况不明,在冻它和noa中我都见过冻死
表现为:
1.滑动页面,点击页面无响应
2.滑动页面,点击页面无响应,重新切一次后台才能显示刚刚滑动,点击的页面,但是继续滑动页面,点击页面还是无响应,需要重新切一次后台才能显示刚刚滑动,点击的页面
解决方法:
杀死应用重新打开一次
注:
把应用从后台切换至前台,其中有一段时间无法滑动屏幕,需要过一段时间才可以滑动屏幕,这不是冻死,而是应用从交换分区交换至RAM中,或者是应用还在解冻中(一般情况下为前者)
卡屏
日前怀疑是binder有问题出现的
表现为:
点击/滑动页面无响应,切后台重新进就正常
卡屏与冻死的区别:
卡屏切换后台重新进就解决,冻死之后,切换后台重新进也只是加载一下页面而已,滑动,点击还是不响应,切一次后台加载一下页面
假断网
出现情况不明
表现为:
重新打开应用,在网络正常的情况下,应用无法连接网络
解决方法:
杀死应用重新打开一次
Binder
1.Binder驱动是系统里负责应用之间通信,传递通信数据的驱动,位于dev/binder。如果应用只是冻结的运行,而没有冻结其binder通信接口,那么在其冻结状态下,如果遇到其他应用发来的通信请求,京就无法及时回复,超时不回复将被安卓框架层认为应用运行异常而杀死。而后应用解冻时,大概率将发生瞬间闪退,重启,重载等等情况(来自冻它官网)
2.常见binder通信路径在/dev/binder如果你刷的第三方内核魔改了binder就会出现路径错乱情,况只有小米原生墓碑才能使用binder_ open外加binder_ Freezer 在冻它对binder使用的是/dev/binder所以如果是5.4内核的就不要刷所谓的完整binder通信的内核除非你用小米的原生墓碑( 来自 @魔威 补充)
3.虽然平时一直只说binder,实际上是两个东西,binder是Android本来就有的,冻结提到的binder实际上是通知墓碑有binder消息,要不要解冻(来自@lztxzr 补充)
Freezer
Freezer是cgroup的其中一个子控制器,用于冻结进程的CPU使用权。
FreezerV1
Freezer1很早便在内核中支持,3.×/4.×/5.×内核都会支持。部分内核的FreezerV1存在缺陷,进程处于冻结状态时无法被杀死,依旧占据内存,类似内存泄漏,需要解冻才能结束进程并释放内存。这是内核级缺陷,应用层大率无法解决,只能积极解冻来缓解
注:某些手机厂商基于V1的墓碑机制(例如Freezerv1版Millet)会捕获杀进程信号及时解冻,这样会及时释放进程的内存。(充电时或者各类按键事件时,Millet也会积极解冻应用
FreezerV2
Freezer2在5.4内核Android11起支持,冻结效果好,且没有V1的类似内存泄漏问题高通平台一般在4.19内核就获得支持,但部分厂商的手机可能默认不会开启,需要使用额外模块手动开启。谷歌Pixel某些机型甚至在4.14内核中也有实现
SIGSTOP
SIGSTOP是Linux中编号19的系统信号,不能被进程捕获,一旦进程收到该信号则被立即强制暂停运行。
解冻方式
Binder 解冻
利用系统间的通讯 binder进行临时解冻
效果最好
轮番解冻
因为没有binder压死之后就需要让app来活一会让他以为自己还活着,轮的意思是轮着解
冻一个app3秒,解冻是最久没打开的那个app
例:
我有5个应用,正常情况下是按顺序解冻的,也就是12345,但这时候我突然打开了3了,这时候顺序就会变成12453。
noactive拥有这种解冻方式,该解冻方式不如binder解冻,只能作为binder解冻的下位品
定时解冻
设置一个解冻时间,时间到了应用全部解冻
冻它拥有这种解冻方式,该解冻方式不如binder解冻,只能作为binder解冻的下位品
单应用定时解冻
给应用绑定一个单独的定时器,时间到了解冻该应用。效果也好,但是会略微增加功耗
仅noactive-2.0拥有这种解冻方式,该解冻方式虽然不如binder解冻,但能与轮番解冻形成互补

