iapp吧 关注:15,973贴子:191,310

杂谈应用保活-Android应用不死之术

只看楼主收藏回复




IP属地:山东1楼2023-03-18 14:53回复
    本期节目较长,请耐心观看,涉及一些iapp的保活实用方法


    IP属地:山东2楼2023-03-18 14:56
    回复
      现在时间比较紧,如果帖子内容不连续不要着急,那是我还没写玩


      IP属地:山东3楼2023-03-18 14:58
      回复
        首先你要知道为什么安卓会杀后台进程,以及回收内存,这里先引用个文章:
        从操作系统的角度来说,内存就是一块数据存储区域,是可被操作系统调度的资源。在多任务(进程)的OS中,内存管理尤为重要,OS需要为每一个进程合理的分配内存资源。所以可以从OS对内存和回收两方面来理解内存管理机制。
        分配机制:为每一个任务(进程)分配一个合理大小的内存块,保证每一个进程能够正常的运行,同时确保进程不会占用太多的内存。
        回收机制:当系统内存不足的时候,需要有一个合理的回收再分配机制,以保证新的进程可以正常运行。回收时杀死那些正在占用内存的进程,OS需要提供一个合理的杀死进程机制。
        同样作为一个多任务的操作系统,Android系统对内存管理有有一套自己的方法,手机上的内存资源比PC更少,需要更加谨慎的管理内存。理解Android的内存分配机制有助于我们写出更高效的代码,提高应用的性能。
        下面分别从 分配 和 回收 两方面来描述Android的内存管理机制:
        分配机制
        Android为每个进程分配内存时,采用弹性的分配方式,即刚开始并不会给应用分配很多的内存,而是给每一个进程分配一个“够用”的内存大小。这个大小值是根据每一个设备的实际的物理内存大小来决定的。随着应用的运行和使用,Android会为进程分配一些额外的内存大小。但是分配的大小是有限度的,系统不可能为每一个应用分配无限大小的内存。
        总之,Android系统需要最大限度的让更多的进程存活在内存中,以保证用户再次打开应用时减少应用的启动时间,提高用户体验。
        回收机制
        Android对内存的使用方式是“尽最大限度的使用”,只有当内存水足的时候,才会杀死其它进程来回收足够的内存。但Android系统否可能随便的杀死一个进程,它也有一个机制杀死进程来回收内存。
        Android杀死进程有两个参考条件:
        1. 进程优先级
        Android为每一个进程分配了优先组的概念,优先组越低的进程,被杀死的概率就越大。根据进程的重要性,划分为5级:
        1)前台进程(Foreground process)
        用户当前操作所必需的进程。通常在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。
        2)可见进程(Visible process)
        没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。
        3)服务进程(Service process)
        尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。
        4)后台进程(Background process)
        后台进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在 LRU 列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。
        5)空进程(Empty process)
        不含任何活动应用组件的进程。保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。
        通常,前面三种进程不会被杀死。
        2. 回收收益
        当Android系统开始杀死LRU缓存中的进程时,系统会判断每个进程杀死后带来的回收收益。因为Android总是倾向于杀死一个能回收更多内存的进程,从而可以杀死更少的进程,来获取更多的内存。杀死的进程越少,对用户体验的影响就越小。


        IP属地:山东4楼2023-03-18 15:04
        回复
          综上所述,安卓杀后台就是为了回收内存,因此在内存不紧张的时候是不会无故杀后台的(有个例外是手机休眠时会结束进程,这是android 6.0引入的机制用来省电)


          IP属地:山东5楼2023-03-18 15:08
          回复
            part 1 友好型保活,这也是谷歌官方推荐方法


            IP属地:山东6楼2023-03-18 15:10
            回复
              iapp作为一款极其阉割的android开发软件,去掉了不少实用的东西,官方也没之后再封装给我们,因此大多数情况下要用ilua ljava自己动手高级功能


              IP属地:山东7楼2023-03-18 15:14
              回复
                1尽量防止内存溢出
                例如一个线程写成这样
                t()
                {
                s a = 666
                for (1;20)
                {
                syso (a)
                }
                }
                而不是这样
                t()
                {
                for (1;20)
                {
                s a = 666
                syso (a)
                }
                }
                }


                IP属地:山东8楼2023-03-18 15:19
                回复
                  2防止内存抖动
                  v3的代码执行方式是用循环历遍所有匹配的文字再转换成baseshell执行,效率非常低且容易出现峰值内存波动,导致系统回收我们编写的iapp应用后台,所以建议多使用ilua模块,高计算量的地方建议ilua,ilua的效率比ijava还高,而且现在的ijava阉割的不成样子了


                  IP属地:山东9楼2023-03-18 15:25
                  回复
                    谈到这里,肯定有人会说,那我一直在前台运行不就得了
                    为什么要后台运行?
                    因为国外的推送sdk是谷歌统一的服务,国内谷歌没法用就只好让应用一直运行连接服务器


                    IP属地:山东10楼2023-03-18 15:33
                    回复
                      不玩虚的了,下面进入真部分part 2流氓保活大法


                      IP属地:山东11楼2023-03-18 15:35
                      回复
                        流氓应用保活主要有两个方面,提高应用的优先级和利用安卓系统的漏洞免杀


                        IP属地:山东12楼2023-03-18 15:39
                        回复
                          在5.0引入了一个叫做前台服务的功能,可以将后台的应用转换成前台使用,想到这里大家肯定都喊呀,谷歌居然给那些一肚子坏水的开发者,一个专门儿的保护通道。事实上并不是这样,这个机制是用来帮助那些需要在后台进行即时服务的。导航,通讯应用做出的。而且应用在使用指向服务时必须要申请权限,而且必须显示一个应用正在运行的通知。当你完成以上条件后,你的应用优先级会变得非常高,即使在后台也和前台一样,根本就不用担心被杀死,但作为一个坏心的开发者,那个通知显然极大的影响了用户,使我们的应用每时每刻都处在被用户杀死的情况下。为了解决这种情况,我们可以创建一个和那个向系统申请通知ID一样的运行前台服务的通知,再将相同通知ID的这个通知杀死,此时你的后台转前台运行权限依然存在,但这个应用正在运行的通知却不会再显示了。


                          IP属地:山东14楼2023-03-18 15:53
                          回复
                            但这种邪恶的做法终究是要被制裁的,好在在安卓8.1这个问题被修复了。


                            IP属地:山东15楼2023-03-18 15:53
                            回复
                              还有之前的安卓4.4的双进程守护,这里不再赘述。


                              IP属地:山东16楼2023-03-18 15:55
                              回复