草庐IT

能让 iOS 保持流畅的墓碑机制,安卓也有了!

世超 2023-03-28 原文

相信很多差友应该都听说过 iOS 的墓碑机制吧?

这个机制可以在我们把 App 切到后台的时候,像墓碑一样记录下这些 App 的状态,然后把它们给冻结起来,让它们不会跟前台 App 抢占 CPU 资源。

而当我们切回 App 时,它又会根据墓碑上的记录将 App 恢复到冻结前的状态;如果 App 长时间挂起,它则会进一步释放内存从而减小耗电与发热。


可以这么说,iOS 系统之所以这么流畅,有很大一部分原因都要得益于墓碑机制,这也是 iPhone 13 在 2022 年的今天还在使用 4G 内存的底气所在。

 最近世超闲来无事逛酷安的时候,偶然发现原来安卓其实也可以实现类似 iOS 的墓碑机制:

而且根据酷安基友们的反馈来看,安卓在开启墓碑机制后,效果意外的不错,很多人表示手机发热和耗电减少很多,同时杀后台现象也没那么严重了:

怀着好奇的心理,世超也在自己手机上试了试,没想到还真有效果。

没开墓碑机制前,我在手机后台开着微信、微博、百度地图、微信读书等 App,各位差友可以看到它们即使在后台,也依旧占用着一部分 CPU 资源:

 而在我开启了墓碑机制后呢,这些已经被挂到后台的 App,它们的 CPU 占用一下子就变成了 0%,效果可以说是立竿见影:


当然了,这种情况也不是绝对的。

在继续打开其它 App 的过程中,我注意到有时候某些 App 可能还会有那么一两个进程会继续占用 CPU,不过占用比例很小,基本上都在 5% 以下:

这些后台 App 的 CPU 资源被释放后,我对此最明显的感受就是我的手机,一下子连续点开多个 App 终于不卡了,而且整个过程手机也没怎么变热!

换做是之前,只要连续点开七八个 App 后系统就会出现掉帧和卡顿,同时手机会开始发热,等到我打开十多个 App,手势操作还会变得不跟手。

不过话说回来,开启这个功能也不是没有坏处。

有人反馈像微信等即时通讯软件,消息来了即使你把它挂在后台,也有可能会收不到消息或者消息有延迟;还有 App 切到后台可能会暂停下载文件。

实测,在把这些 App 设置为可以自启动后,貌似可以避免掉这个问题,至少我的手机没遇到前面这两种情况,消息一来微信 CPU 占用会立马上去:

总之我建议各位正在用安卓手机的差友都可以在自己试试,觉得效果不大或者影响体验的话大不了把它重新关闭就成。

接下来世超就跟大家说说到底怎么开启安卓手机的墓碑机制。

在开启之前,我们需要进入到手机设置里找到系统版本号,多次点击版本号直至系统提示 “ 您已经处于开发者模式 ”,然后再进入到开发者选项页面:

在开发者选项中,我们需要找到 “ 暂停执行已缓存的应用 ” 这个选项,选择启用后,将手机重启一遍,就等于是开启了安卓的墓碑机制:

要是你没在自己手机的开发者选项中找到这个选项,那大概率是因为厂商在系统里屏蔽了这个功能,这个时候就需要我们借助第三方工具来开启。

第三方工具开启墓碑机制稍微有点麻烦,首先我们要在酷安下载一个无线调试工具 Shizuku,然后再根据这个 App 提供的教程和提示激活 Shizuku

激活成功之后,我们还要在酷安下载一个爱玩机工具箱,并且授予这个软件相应的权限:

在这些权限中,基础的权限我们可以直接授权。

而 “ 修改系统安全设置 ” 权限则需要借助 Shizuku 才能授权成功,如果你已经激活 Shizuku,那就直接点击左下角的 “ Shizuku ” 就行:

接着你就能在爱玩机工具箱的系统相关设置里找到 “ 暂停执行已缓存的应用 ” 选项了,选择 “ 任何时候启动 ”,重启一遍手机就算大功告成:

总的来说,我个人感觉安卓还是挺开放的,给了我们这样一个选项,既然有,那我们就不妨试试,没准会有意料之外的惊喜,感谢大家的观看!

有关能让 iOS 保持流畅的墓碑机制,安卓也有了!的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  6. ruby - 如何保持我不常用的编程语言技能 - 2

    关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby​​-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby​​有很大不同。由于我与ruby​​之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?

  7. ruby - 为 IO::popen 拯救 "command not found" - 2

    当我将IO::popen与不存在的命令一起使用时,我在屏幕上打印了一条错误消息:irb>IO.popen"fakefake"#=>#irb>(irb):1:commandnotfound:fakefake有什么方法可以捕获此错误,以便我可以在脚本中进行检查? 最佳答案 是:升级到ruby​​1.9。如果您在1.9中运行它,则会引发Errno::ENOENT,您将能够拯救它。(编辑)这是在1.8中的一种hackish方式:error=IO.pipe$stderr.reopenerror[1]pipe=IO.popen'qwe'#

  8. ruby - IO::EAGAINWaitReadable:资源暂时不可用 - 读取会阻塞 - 2

    当我尝试使用“套接字”库中的方法“read_nonblock”时出现以下错误IO::EAGAINWaitReadable:Resourcetemporarilyunavailable-readwouldblock但是当我通过终端上的IRB尝试时它工作正常如何让它读取缓冲区? 最佳答案 IgetthefollowingerrorwhenItrytousethemethod"read_nonblock"fromthe"socket"library当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadab

  9. ruby - 如何使用 ruby​​ fibers 避免阻塞 IO - 2

    我需要将目录中的一堆文件上传到S3。由于上传所需的90%以上的时间都花在了等待http请求完成上,所以我想以某种方式同时执行其中的几个。Fibers能帮我解决这个问题吗?它们被描述为解决此类问题的一种方法,但我想不出在http调用阻塞时我可以做任何工作的任何方法。有什么方法可以在没有线程的情况下解决这个问题? 最佳答案 我没有使用1.9中的纤程,但是1.8.6中的常规线程可以解决这个问题。尝试使用队列http://ruby-doc.org/stdlib/libdoc/thread/rdoc/classes/Queue.html查看文

  10. ruby - 如何从 ruby​​ 中的 IO 对象获取文件名 - 2

    在ruby中...我有一个由外部进程创建的IO对象,我需要从中获取文件名。然而我似乎只能得到文件描述符(3),这对我来说不是很有用。有没有办法从此对象获取文件名甚至获取文件对象?我正在从通知程序中获取IO对象。所以这也可能是获取文件路径的一种方式? 最佳答案 关于howtogetathefilenameinC也有类似的问题,我将在这里以ruby​​的方式给出这个问题的答案。在Linux中获取文件名假设io是您的IO对象。以下代码为您提供了文件名。File.readlink("/proc/self/fd/#{io.fileno}")例

随机推荐