美文网首页编程AndroidWorld安卓
关于 Android 进程保活,你所需要知道的一切

关于 Android 进程保活,你所需要知道的一切

作者: ec95b5891948 | 来源:发表于2016-04-17 17:04 被阅读86354次

    声明:本文作者授权微信公众号Android程序员(AndroidTrending)在微信公众号平台原创首发。

    早前,我在知乎上回答了这样一个问题:怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?。关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一。你到网上搜 Android 进程保活,可以搜出各种各样神乎其技的做法,绝大多数都是极其不靠谱。前段时间,Github还出现了一个很火的“黑科技”进程保活库,声称可以做到进程永生不死

    怀着学习和膜拜的心情进去Github围观,结果发现很多人提了 Issue 说各种各样的机子无法成功保活。

    看到这里,我瞬间就放心了。坦白的讲,我是真心不希望有这种黑科技存在的,它只会滋生更多的流氓应用,拖垮我大 Android 平台的流畅性。

    扯了这么多,接下来就直接进入本文的正题,谈谈关于进程保活的知识。提前声明以下四点

    • 本文是本人开发 Android 至今综合各方资料所得
    • 不以节能来维持进程保活的手段,都是耍流氓
    • 本文不是教你做永生不死的进程,如果指望实现进程永生不死,请忽略本文
    • 本文有错误的地方,欢迎留下评论互相探讨(拍砖请轻拍)

    保活手段

    当前业界的Android进程保活手段主要分为** 黑、白、灰 **三种,其大致的实现思路如下:

    黑色保活:不同的app进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒)

    白色保活:启动前台Service

    灰色保活:利用系统的漏洞启动前台Service

    黑色保活

    所谓黑色保活,就是利用不同的app进程使用广播来进行相互唤醒。举个3个比较常见的场景:

    场景1:开机,网络切换、拍照、拍视频时候,利用系统产生的广播唤醒app

    场景2:接入第三方SDK也会唤醒相应的app进程,如微信sdk会唤醒微信,支付宝sdk会唤醒支付宝。由此发散开去,就会直接触发了下面的 场景3

    场景3:假如你手机里装了支付宝、淘宝、天猫、UC等阿里系的app,那么你打开任意一个阿里系的app后,有可能就顺便把其他阿里系的app给唤醒了。(只是拿阿里打个比方,其实BAT系都差不多)

    没错,我们的Android手机就是一步一步的被上面这些场景给拖卡机的。

    针对场景1,估计Google已经开始意识到这些问题,所以在最新的Android N取消了 ACTION_NEW_PICTURE(拍照),ACTION_NEW_VIDEO(拍视频),CONNECTIVITY_ACTION(网络切换)等三种广播,无疑给了很多app沉重的打击。我猜他们的心情是下面这样的

    而开机广播的话,记得有一些定制ROM的厂商早已经将其去掉。

    针对场景2场景3,因为调用SDK唤醒app进程属于正常行为,此处不讨论。但是在借助LBE分析app之间的唤醒路径的时候,发现了两个问题:

    1. 很多推送SDK也存在唤醒app的功能
    2. app之间的唤醒路径真是多,且错综复杂

    我把自己使用的手机测试结果给大家围观一下(我的手机是小米4C,刷了原生的Android5.1系统,且已经获得Root权限才能查看这些唤醒路径

    15组相互唤醒路径 全部唤醒路径

    我们直接点开 简书 的唤醒路径进行查看

    简书唤醒路径

    可以看到以上3条唤醒路径,但是涵盖的唤醒应用总数却达到了23+43+28款,数目真心惊人。请注意,这只是我手机上一款app的唤醒路径而已,到了这里是不是有点细思极恐。

    当然,这里依然存在一个疑问,就是LBE分析这些唤醒路径和互相唤醒的应用是基于什么思路,我们不得而知。所以我们也无法确定其分析结果是否准确,如果有LBE的童鞋看到此文章,不知可否告知一下思路呢?但是,手机打开一个app就唤醒一大批,我自己可是亲身体验到这种酸爽的......

    白色保活

    白色保活手段非常简单,就是调用系统api启动一个前台的Service进程,这样会在系统的通知栏生成一个Notification,用来让用户知道有这样一个app在运行着,哪怕当前的app退到了后台。如下方的LBE和QQ音乐这样:

    灰色保活

    灰色保活,这种保活手段是应用范围最广泛。它是利用系统的漏洞来启动一个前台的Service进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个Notification,看起来就如同运行着一个后台Service进程一样。这样做带来的好处就是,用户无法察觉到你运行着一个前台进程(因为看不到Notification),但你的进程优先级又是高于普通后台进程的。那么如何利用系统的漏洞呢,大致的实现思路和代码如下:

    • 思路一:API < 18,启动前台Service时直接传入new Notification();
    • 思路二:API >= 18,同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理;
    
    public class GrayService extends Service {
    
        private final static int GRAY_SERVICE_ID = 1001;
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            if (Build.VERSION.SDK_INT < 18) {
                startForeground(GRAY_SERVICE_ID, new Notification());//API < 18 ,此方法能有效隐藏Notification上的图标
            } else {
                Intent innerIntent = new Intent(this, GrayInnerService.class);
                startService(innerIntent);
                startForeground(GRAY_SERVICE_ID, new Notification());
            }
    
            return super.onStartCommand(intent, flags, startId);
        }
    
        ...
        ...
    
        /**
         * 给 API >= 18 的平台上用的灰色保活手段
         */
        public static class GrayInnerService extends Service {
    
            @Override
            public int onStartCommand(Intent intent, int flags, int startId) {
                startForeground(GRAY_SERVICE_ID, new Notification());
                stopForeground(true);
                stopSelf();
                return super.onStartCommand(intent, flags, startId);
            }
    
        }
    }
    
    

    代码大致就是这样,能让你神不知鬼不觉的启动着一个前台Service。其实市面上很多app都用着这种灰色保活的手段,什么?你不信?好吧,我们来验证一下。流程很简单,打开一个app,看下系统通知栏有没有一个 Notification,如果没有,我们就进入手机的adb shell模式,然后输入下面的shell命令

    dumpsys activity services PackageName
    

    打印出指定包名的所有进程中的Service信息,看下有没有 isForeground=true 的关键信息。如果通知栏没有看到属于app的 Notification 且又看到 isForeground=true 则说明了,此app利用了这种灰色保活的手段。

    下面分别是我手机上微信、qq、支付宝、陌陌的测试结果,大家有兴趣也可以自己验证一下。

    微信 手Q 支付宝 陌陌

    其实Google察觉到了此漏洞的存在,并逐步进行封堵。这就是为什么这种保活方式分 API >= 18 和 API < 18 两种情况,从Android5.0的ServiceRecord类的postNotification函数源代码中可以看到这样的一行注释

    当某一天 API >= 18 的方案也失效的时候,我们就又要另谋出路了。需要注意的是,使用灰色保活并不代表着你的Service就永生不死了,只能说是提高了进程的优先级。如果你的app进程占用了大量的内存,按照回收进程的策略,同样会干掉你的app。感兴趣于灰色保活是如何利用系统漏洞不显示 Notification 的童鞋,可以研究一下系统的 ServiceRecord、NotificationManagerService 等相关源代码,因为不是本文的重点,所以不做详述。

    唠叨的分割线

    到这里基本就介绍完了** 黑、白、灰 **三种实现方式,仅仅从代码层面去讲保活是不够的,我希望能够通过系统的进程回收机制来理解保活,这样能够让我们更好的避免踩到进程被杀的坑。

    进程回收机制

    熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正的kill掉这个进程,而是将其缓存起来。打开的应用越多,后台缓存的进程也越多。在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要kill掉哪些进程,以腾出内存来供给需要的app。这套杀进程回收内存的机制就叫 Low Memory Killer ,它是基于Linux内核的 OOM Killer(Out-Of-Memory killer)机制诞生。

    了解完 Low Memory Killer,再科普一下oom_adj。什么是oom_adj?它是linux内核分配给每个系统进程的一个值,代表进程的优先级,进程回收机制就是根据这个优先级来决定是否进行回收。对于oom_adj的作用,你只需要记住以下几点即可:

    • 进程的oom_adj越大,表示此进程优先级越低,越容易被杀回收;越小,表示进程优先级越高,越不容易被杀回收
    • 普通app进程的oom_adj>=0,系统进程的oom_adj才可能<0

    那么我们如何查看进程的oom_adj值呢,需要用到下面的两个shell命令

    ps | grep PackageName //获取你指定的进程信息
    

    这里是以我写的demo代码为例子,红色圈中部分别为下面三个进程的ID

    UI进程:com.clock.daemon
    普通后台进程:com.clock.daemon:bg
    灰色保活进程:com.clock.daemon:gray

    当然,这些进程的id也可以通过AndroidStudio获得

    接着我们来再来获取三个进程的oom_adj

    cat /proc/进程ID/oom_adj
    

    从上图可以看到UI进程和灰色保活Service进程的oom_adj=0,而普通后台进程oom_adj=15。到这里估计你也能明白,为什么普通的后台进程容易被回收,而前台进程则不容易被回收了吧。但明白这个还不够,接着看下图

    上面是我把app切换到后台,再进行一次oom_adj的检验,你会发现UI进程的值从0变成了6,而灰色保活的Service进程则从0变成了1。这里可以观察到,app退到后台时,其所有的进程优先级都会降低。但是UI进程是降低最为明显的,因为它占用的内存资源最多,系统内存不足的时候肯定优先杀这些占用内存高的进程来腾出资源。所以,为了尽量避免后台UI进程被杀,需要尽可能的释放一些不用的资源,尤其是图片、音视频之类的

    从Android官方文档中,我们也能看到优先级从高到低列出了这些不同类型的进程:Foreground processVisible processService processBackground processEmpty process。而这些进程的oom_adj分别是多少,又是如何挂钩起来的呢?推荐大家阅读下面这篇文章:

    http://www.cnblogs.com/angeldevil/archive/2013/05/21/3090872.html

    总结(文末有福利)

    絮絮叨叨写完了这么多,最后来做个小小的总结。回归到开篇提到QQ进程不死的问题,我也曾认为存在这样一种技术。可惜我把手机root后,杀掉QQ进程之后就再也起不来了。有些手机厂商把这些知名的app放入了自己的白名单中,保证了进程不死来提高用户体验(如微信、QQ、陌陌都在小米的白名单中)。如果从白名单中移除,他们终究还是和普通app一样躲避不了被杀的命运,为了尽量避免被杀,还是老老实实去做好优化工作吧。

    所以,进程保活的根本方案终究还是回到了性能优化上,进程永生不死终究是个彻头彻尾的伪命题!

    补充更新 (2016-04-20)

    有童鞋问,在华为的机子上发现微信和手Q的UI进程退到后台,oom_adj的值一点都没有变,是不是有什么黑科技在其中。为此,我稍稍验证了一下,验证方式就是把demo工程的包名改成手机QQ的,编译运行在华为的机子上,发现我的进程怎么杀也都是不死的,退到后台oom_adj的值同样不发生变化,而恢复原来的包名就不行了。所以,你懂的,手Q就在华为机子的白名单中。

    文章到此结束,相关简单的实践代码请看

    https://github.com/D-clock/AndroidDaemonService

    为了感谢看完本文的童鞋,特地献上福利图片一张。。。。。。。。。请注意:

    如果你屏幕旁有人在,请谨慎往下观看!!!!!!!!!

    如果你屏幕旁有人在,请谨慎往下观看!!!!!!!!!

    如果你屏幕旁有人在,请谨慎往下观看!!!!!!!!!

    福利

    相关文章

      网友评论

      • 唐_夏影:感觉保活对一些App还是有一定意义的,不然用户一不小心把微信App退出了,就接受不到微信的消息了,体验也不好
      • d57e533f1431:挖一下坟。。想问下作者,就是有一个需求,关于推送方面的,就是希望app在任务管理器划掉关闭后依然能收到推送,这个实现么,,用的是极光推送
        hebbkeke:@五十步笑百步是Low比 老哥,怎样了
        cc25b6aa133b:极光最新的api有文档集成了华为小米魅族的大厂系统级别推送,让公司去申请几个账号,集成也很简单
      • 青林_64bf:虽然内容很值得学习,但是更喜欢楼主的说话风格...关注一下...
      • g小志:牛掰
      • Todo2:组件化和插件化的开发里程总结
        https://www.jianshu.com/p/df2a6717009d
      • 珠穆朗玛小王子:很强,必须得关注一波,好好学习学习:+1:
      • 季白zy:那个吧包名改成q的会把q替换掉啊:joy:
        b2a2b6daca88:不是还有签名么
      • Cloverss:楼主如何刷的原生Android 系统 求指教
      • lfork:Android 8.0还有效吗
      • 若无初见:真心好文
      • bingin:mark.
      • 麋鹿原:泡在网上的日子.
      • snowyeti:不能容忍作者对福利图的错误定义!!!!
        作者很幽默嘛:smiley:
      • 微小码:感谢作者:pray:
      • 秦子帅:大佬,有个问题想问
        秦子帅:@g小志 哈哈
        g小志:看完文章忽然看到了你:joy:
      • 0c97a746aee9::joy: 因为这个需求 加班两三天了
        eceb4cfdddc9:然而你当时就是没搞定是不是
      • i_am_upgirl:请问,只有Root的手机才能看到oom_adj吗?因为我这边试了好几个手机,都报Permission denied
      • 03b655eda1e4:这种保活机制,在api25(譬如小米,oppo)上,会通知栏提示:xxx正在运行,点按即可了解详情或停止应用,,,,,,这个可以规避么?
      • Boy强:受教了,阔以,支持
      • 心少无心:葱花大神 为什么我用你的方式保活 在通知栏能够看到当前应用图标
        lfork:Google 又发力了
      • 莫高窟同学:楼主,灰色保活的API>18处理时,为哈开了2个service,再把后开启的service做了stopSelf()呢?目的是?谢谢~
      • Hanwen1001:android 7.1.1系统修复了这个漏洞,会出现通知栏。
        03b655eda1e4:@D_clock爱吃葱花 有办法规避么?
        ec95b5891948:对的,已经做了适配。
      • 奔跑的夸父:看来,单纯从技术手段上实现进程保活是有一定限制的,不做这方面的考虑了。谢谢!
      • 88deffac642e:真的是一篇好文章 :heart_eyes:
      • 3496808c1f4b:感谢大神的文章!!!
      • 3d2004e7f969:楼主,像酷狗,qq音乐他们是不是也在白名单,我用白色保活休眠还是会服务被杀死
      • 1a625b3493ea:先收藏,有时间好好研究下
      • 木友:楼主 执行命令 cat proc 时,显示权限拒绝是什么情况,已开root
        kaixinzzy:adb remount && adb shell cat proc...
        试试看。
      • Real_young:我想问下 安卓 那个推送原理,也就是需要进程一直保活是吗?例如个推那个,打开一款,唤醒了其他APP的进程,所以就能够一直收到推送了?
      • 8706d7ec7fe0:写得不错,受教了:smile:
      • 憶舊九州:这些个手机厂商,就不能联合起来搞一个统一的推送sdk吗?那样解救了多少人,提升了多少效率啊
        小编:现在工信部已经在做这件事了
      • 杨旭_:你那里是程序员,你是个段子手.
      • 沈敏杰:至今看回,还是受益匪浅
      • 一简画:好文
      • 相互交流:楼主问一个问题,,如果我只是想在应用打开的时候,开启一个服务,,然后在后台轮询上传数据,假如这个时候,内存不足服务被销毁,,后调用onDestroy方法,,我在里面发送一个广播,然后在重新启动,会有问题吗,,或者说,无论在任何情况下服务被杀死,都会调用onDestroy方法,,?忘大神解答啊。。。
        隔壁云老陈:@相互交流 好像被杀死不会调用ondestory
      • e156012376cf:感谢楼主
      • ed1e218bf627:楼主写的很好,灰色保活有个地方不理解 -> “同时启动两个id相同的前台Service,然后再将后启动的Service做stop处理;”这里为什么要启动两个id相同的前台Service,并且还要把后启动的Service做stop处理?
      • 1e7339ed7324:请教一个问题:对于多进程app,灰度服务进程对应的oom_adj提高了,但是其他进程oom_adj仍然不变,容易被杀死,这个如何解决?
      • 翻身不做咸鱼:灰度保活之后会有这样的异常,有遇到过吗
        Bad notification for startForeground: java.lang.RuntimeException: invalid service notification: Notification(pri=-2 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 color=0x00000000 vis=PRIVATE)
        摸鱼的小石头:这个问题解决了吗
      • jiaozi0203:不能容忍作者对福利图的错误定义!!!!
      • walkthehorizon:大赞,黑白灰,经典的分类
      • c5769c16e77a:灰色保活的方法在6.0上已经失效 但是微信不知道有什么黑科技可以继续保持
      • SlientWheat:楼主你用的手机是什么型号的
      • e1e7918c36fe:不错,非常受用!谢谢了
      • 科学的超bug:么么哒
      • faf84acf3f68:感谢楼主分享,文章有技术有情调,赞!!!
      • b00633bac37b:不错,很受用,最近在学习这个呢
      • Avalon1:我发现一个问题。这个灰色保活的service倒是一直没死。但是home键出去后我app死了。
        1a378ce2b8c2:您这个问题解决了吗?
      • d8ddc4309040:说得好,更应该注重是眼前,最基本的东西,只有基础的东西做得足够好,才能有可能出色
      • D13954:其实,在用户不是很依赖你的APP的时候,做这样的保活,就是作死,这个和app里面插入各种广告一样恶心 :confounded:
      • 573a725e1add:虽然有点流氓 但是还是得学习一下
      • 5e30a667061c:灰色保活原理是啥?
      • ec95b5891948:AccessibilityService 目前还没仔细玩耍过,所以暂时不大清楚哈 :joy:
      • MeloDev:想请教一下葱花哥 AccessibilityService 这种辅助服务属于哪个级别的进程?
        因为我写了一个AccessibilityService 服务,当我使用手机清理进程的时候,这个服务就会被关闭。再次开启的时候需要再去设置里打开,很麻烦,体验也不好。
        所以有什么解决办法吗?
        俞其荣:AccessibilityService 属于前台进程,测试了一下 oom_adj 为 0
        d60971551f30:@MeloDev 个别手机会关,不是所有吧?
      • outer199:作者您好,我按照您的代码敲的灰色保活,不好用啊,依然存在Notification
      • 捡淑:学习了
      • w4lle:好文!
      • 宇是我:作者思路很清晰,写得很好,赞一个
      • f9255619252a:华为的一些手机上,第二种方式会有通知;【xxx 正在运行】,怎么把这个通知干掉?
      • 821802365c6e:非常不错,点个赞
      • 逐悦:收藏,学习了
      • 0a2282cf3ac6:“可以看到以上3条唤醒路径,但是涵盖的唤醒应用总数却达到了23+43+28款,数目真心惊人。” ——这酸爽..
      • 343dd47ae9f8:为了这个,两个星期茶饭不思,至今还挂在心理
      • 4664c58913b4:为了给楼主点个赞 专门注册了简书 n(*≧▽≦*)n 有个问题想问问,我在你的WakeReceiver里面想处理系统的解锁广播ACTION_USER_PRESENT,但是不起作用呢,权限也加了的,targetSdkVersion也改成的22。我手机是6.0.1的原生Android系统
        ec95b5891948: @刘子豪zZ 嗯,这个我暂时不大清楚。还没研究过
      • 21e00ea1077c:寓教于乐 :+1:
      • 971ff29cd833:学习不少!
      • 653e819a353c:楼主,首先感谢你的分享。我在用灰色保活时遇到个问题:我在你灰色保活原有代码上加上了弹出Toast(监听ACTION_SCREEN_ON),断开usb线,切换到后台等待大约6分钟再解锁屏幕,就不能弹出Toast,此时我再连接电脑接上usb线,才能弹出Toast(如果一直连接usb线测试就是正常的)。后来发现如果用你提供的包名"com.clock.daemon",一切都是正常的,但是如果用我测试代码中的包名"xym.com.testkillback2",就会出现问题。
      • 北疆_:福利呢。。。。,把头伸过来,给个宝贝给你看,楼主
        ec95b5891948: @BabyFace老林 禽兽啊。。。(*`・з・)ムッ
      • eceb4cfdddc9:好文,之前也做过这个需求,网上搜了很多,没个答案,还以为真有用永远杀不死进程的这功能
        念念不忘_2016:这个有用?我也遇到了这个问题
      • 李牧羊:学到了,厉害
      • 大利猫:文章略有情怀啊,非常赞同,开发者应该从整改系统生态角度去开发应用
      • lumenghz:请问灰色保活怎么停止掉服务呢?
      • 田雨亭:╮(╯▽╰)╭,如果谷歌的推送可以用,还要这么多的唤醒干什么
        老年追梦人:默默地给你点个赞,如果谷歌的东西能直接用,我觉得国内很多android第三方的相关行业要倒闭
      • We7ex:亲,你的代码是不是少了点东西。 黑色保活不见了==、
        ec95b5891948:@陌合_莫合 黑色保活就是自定义广播而已!
      • We7ex:那楼主觉得大多数的跑步软件是怎么实现的呢 都是白色保活?
      • Aracys:今天看的时候突然发现了一个杀不死的程序,唯品会,我的手机是小米3W MIUI7.2.11 Android6.0.1,能分析下吗?表示找不到头绪,杀死立刻启动
      • hqdoremi:弱弱的问句,你那个查看唤醒路径的软件叫啥?自启管家?
        ec95b5891948:@hqdoremi LBE
      • huhu2008:看到最后关于QQ那段的我眼泪掉下来
        ec95b5891948:@huhu2008 :joy: 孩纸,站起来撸,不哭!
      • 后厂村追寻:这是后台服务进程 ,如果是ui进程呢? 只能从内存优化,释放资源上考虑吗?!!
        后厂村追寻:@D_clock OK 谢谢 小宝贝
        ec95b5891948:@草莓的味道 对的!
      • 8152126e95e4:楼主,在demo里面,有aidl。可否提供下aidl服务端的实现类。。。。
        8152126e95e4:@D_clock 已看到了。。谢谢楼主 :blush:
        ec95b5891948:@美女江山一锅煮 里面的aidl是个客户端自己跨进程用的,你可以忽略掉!
      • 陈鸿禧:裤子都脱了,结尾你给我看这个?
        ec95b5891948:@陈鸿禧 :joy: 来,慢慢穿回去!
      • e5cc8662f138:程序在最近任务列表中退出后,就没有进程和服务了,怎样让程序在最近任务栏中退出后还能在运行列表中看到进程和服务
        e5cc8662f138: @D_clock 主要是看到微信和QQ这样的话,正在运行条目中还有进程和服务
        ec95b5891948: @杨格 最近任务列表划掉后,服务进程不在了我要跟进一下,能到github给我提个issue么,包括你运行代码的机型和版本号
        ec95b5891948: @杨格 额,没有这个法子!
      • 1fdd4ea682bf:楼主,拿了好几个机型试过,用你的代码试的 ,难道一定要root吗。
        ec95b5891948:@1fdd4ea682bf 试了都不行吗?不需要root哦,可否提供一下你试过不行的手机型号及对应的系统版本号,到github给我提一个issue,待我检查修复!
      • 大姨夫斯基:所以个推要接锅了! 10.1的版本的时候用户反馈简书耗电异常,频繁启动,后来你猜是怎么解决的
      • 42edb8fe2c60:在小米MIUI5.0.1上出现了正在运行的nitfycation。。。原生系统没有这个问题。。。
        42edb8fe2c60:@aa41 红米note2的开发版
        ec95b5891948:@aa41 :blush: 你好,5.0.1是Android系统的版本号吗?可以顺便说一下小米的机型?
        ec95b5891948:@aa41 ok,了解,回去检查一下。有结果再回复你。可以先提一个Issue到Github上!
      • fe5b2366f21c:好文,学习了
      • 1fdd4ea682bf:博主 ,你好,在华为荣耀7 5.0系统上实测:Bad notification for startForeground: java.lang.RuntimeException: icon must be non-zero,会抛出这个错,意思是Notification不能为空,用微信试了了下,发现他们确实把进程优先级提高到1(关掉界面后),不知道是怎么做的
        ----------------
        给Notification加了图片后通知栏里就有消息了
        Dear宅学长:这个有人有解决方案么?我们线上出过类似的crash
        1fdd4ea682bf:已经提了,感谢博主
        ec95b5891948:@1fdd4ea682bf 这个我去验证完在回复你!可以到Github上先给我提个Issue!
      • 小阳撒:好东西。要是各个厂家都这样想才行。
      • cb720d6f3c97:难道只有我一个人把保活 看成了 保洁?
      • 30a2c333718c:永生不死,绝对的百害而无一利
      • fe52b911f5db:不错,学习了
      • c7b049635af8:mark下
      • 333753b257a4:亏我看到了最后
      • stay4it:就这一点上,就得让多少人没日没夜的加班
        回眸婉约:@OCTSJimmy 我看过人家一个sdk是说集成小米华为推送用推送保活 你的app在小米的手机上 肯定 能收到自家的推送的 然后唤醒
        OCTSJimmy:@QuMingHaoNan 因为APP存活,就意味着推送能被看到的概率就高,送达率就高。

      本文标题:关于 Android 进程保活,你所需要知道的一切

      本文链接:https://www.haomeiwen.com/subject/rfbolttx.html