日更挑战-安卓开发之后台保活


越不懂的越爱装
大家都同等:IT世界没有难不难,只有是否了解过

挑战目录

由于同事经常迟到,拜托我写一个自动打卡的工具。发现现在安卓上的保活不太起作用。由于对保活这块不是特别了解,于是就花了点时间看了下这个。最终实现了一个简单的打卡工具。由于还要工作原因导致大部分时间都被占用了。


问题1: 什么是后台保活?

解 答:

当应用需要有一个一直在运行的进程时,为了防止系统杀死进程的一种手段。

进程? (下面方法的执行和开在其中开线程的区别?)

前台进程:(内存过低,连这些进程都无法继续运行,才会终止这些进程)
  1. onResume()方法已被调用(正在用户的互动屏幕上运行一个 Activity)
  2. BroadcastReceiver.onReceive() 方法正在执行
  3. Service.onCreate()、Service.onStart()、Service.onDestroy()...方法正在执行
  4. 按下Home或Back键的Activity,但是有前台service运行(比如音乐播放器等)
可见进程:(为了使前台进程运行而终止它们,否则不会这么做)
  1. onPause()方法已被调用(Activity在屏幕上对用户可见,但不在前台)
  2. Service通过 Service.startForeground() 作为"前台服务(用户知晓的看得见的)"运行
  3. 系统正在使用其托管的服务实现用户知晓的特定功能,例如动态壁纸、输入法服务等?
服务进程:(会始终保持运行,除非没有内存来保留前台和可见进程)
  1. 使用startService()方法启动的Service坐着用户看不见的事情(网络数据上传下载等).
    由于使用LRU 列表,执行时间越长越容易被回收。
  2. 按下HOME或Back键后的Activity。有普通service运行
后台进程:(系统可能随时终止它们,以回收内存供上述三种进程使用)
  1. 按下HOME键后的Activity。(对用户不可见的Activity的进程)
空进程:(不含任何活动应用组件的进程)
  1. 应用按Back按键的Activity。(不含任何活动组件的进程。保留的唯一目的是用作缓存,缩短下次所需的启动时间)

系统如何杀死进程?

由于系统的内存是有限的,内存不足时系统就会清理进程。另外由于为了 " 节约手机电量 ",系统会清理进程。

Android 5.0 以上:

系统以 uid 杀进程,杀死整个进程组,包括java进程和native进程。

Android 6.0 以上:

引入了待机模式(doze):拔下电源,屏幕关闭后的一段时间杀死后台进程。

Android 7.0 以上:

待机模式不再要求设备静止。
移除了一些隐式广播,App 无法再通过监听这些广播拉起自己

Android 8.0 以上:

无法使用 Mainifest 注册大部分隐式广播
限制未在前台运行的应用的某些行为 

Android 9.0 以上:

省电模式功能加入应用待机分组,长时间不用的 App 和刚装的App都处理危险的地位;
当系统监测到应用消耗过多资源时,会询问用户是否限制该应用的后台活动

对于锁屏熄屏来说:

锁屏事件后一段时间(一般为5分钟以内)内会杀死后台进程,以达到省电的目的问题

对于服务Service来说

onStartCommand返回值在保活中的具体有何作用上的意义:
1.
2.
3.
4.
杀死APP进程的主要分为如下
1. LowmemoryKiller
2. killBackgroundProcesses:系统会在需要的时候再次重启被我们杀死的进程(公开的方法)

需要权限android.Manifest.permission.KILL_BACKGROUND_PROCESSES

public void killBackgroundProcesses(String packageName) {  
   try {   
ActivityManagerNative.getDefault().killBackgroundProcesses(packageName,UserHandle.myUserId());  
        } catch (RemoteException e) {  
        }  
    }  
3. removeTask:
4. forceStopPackage(@hide隐藏的方法):首先杀掉目标进程,以uid为单位杀掉进程组(双进程守护的方式实现保活失效),然后清理残留在 system_server 内的四大组件信息。

杀掉进程组时:循环 40 遍不停滴杀进程 组 ,每次杀完之后等 5ms
上述的缺陷:

    public void forceStopPackage(String packageName) {  
        try {  
            ActivityManagerNative.getDefault().forceStopPackage(packageName,  
                    UserHandle.myUserId());  
        } catch (RemoteException e) {  
        }  
    }

如何防止被杀死(高版本适用低版本)?

主要通过如下方法:

 1. 提高进程优先级,降低进程被杀死的概率
 2. 降低APP的内存占用量,在oom_adj相同的时候,会优先干掉内存消耗大的进程
 3. 在进程被杀死后,进行拉活
Android 5.0及以下:
通过 native 方式 fork 出来的进程是不受系统管控的,系统在杀 App 进程的时候,只会去杀 App 启动的 Java 进程
Android 6.0及以下:(5.0后以uid为标识,能杀死整个进程组native进程也会杀掉)
Android 7.0及以下:(6.0引入待机模式,拔下电源,屏幕关闭后进入低电耗模式)
Android 8.0及以下:
1.提升进程的优先级
2. 监听广播:
3. 双进程(NDK方式Fork子进程)、双Service守护:
4. 提高Service优先级:
5. 添加app进入白名单:
6. 推送互相唤醒复活:极光、友盟、以及各大厂商的推送:
7. 同派系APP广播互相唤醒:
8. 故意在后台播放无声的音乐:
9. 监听锁屏广播打开1像素Activity:
10. 使用JobScheduler唤醒Service:

透明悬浮窗
前台服务
独立进程

TIM保活方法:
创建 2 个进程 p1, p2,这两个进程通过文件锁互相关联,一个被杀之后拉起另外一个;
同时 p1 经过 2 次 fork 产生孤儿进程 c1,p2 经过 2 次 fork 产生孤儿进程 c2,
c1 和 c2 之间建立文件锁关联。
这样假设 p1 被杀,那么 p2 会立马感知到,然后 p1 和 c1 同属一个进程组,
p1 被杀会触发 c1 被杀,c1 死后 c2 立马感受到从而拉起 p1,
因此这四个进程三三之间形成了铁三角,从而保证了存活率。
11. 白名单

不同安卓版本的保活代码

Android 5.0及以下:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容