Android 支持内存为 512 MB 的设备。本文档旨在帮助 OEM 优化和配置 Android 内核 4.4,使其能够在低内存设备上运行。在下文所述的优化措施中,有几项非常通用,甚至也可应用于以前的版本。

Android 内核 4.4 平台优化

改善了内存管理

采用了经验证可节省内存的内核配置:交换到 zram。

终止了那些即将被取消缓存且过大的缓存进程。

不允许大型服务自行返回至 A 服务类别(以免导致启动器终止)。

终止了那些处于空闲维护状态中的过大进程(甚至终止当前 IME 等通常不可终止的进程)。

对后台服务的启动进行了序列化。

优化了低内存设备的内存使用方式:采用更严格的内存不足 (OOM) 调整级别、缩减图形缓存大小。

减少了系统内存占用

删减 system_server 和系统界面进程(节省了几兆的内存)。

在 Dalvik 中预加载 dex 缓存(节省了几兆的内存)。

采用了经验证的 JIT-off 选项(每个进程最多可节省 1.5MB 的内存)。

减少了各进程的字体缓存开销。

Procstats

添加了一个开发者选项,以显示内存状态和应用内存使用情况(按照运行频率和所耗内存量排序)。

API

添加了

内存跟踪

添加了 memtrack HAL 来跟踪图形内存分配情况、dumpsys meminfo 中的更多信息,以及 meminfo 中的阐明性总结(例如,所报告的可用内存包括缓存进程占用的内存,这样 OEM 就不会尝试优化内存错误)。

编译时配置

低内存设备标记

ActivityManager.isLowRamDevice() 标志可确定应用是否应关闭在低内存设备上表现非常差的某些内存密集型功能。

对于内存为 512 MB 的设备,该标记应返回 true。可以通过在设备 makefile 中使用以下系统属性来启用该 API:

PRODUCT_PROPERTY_OVERRIDES += ro.config.low_ram=true

启动器配置

启动器的默认壁纸设置不应使用动态壁纸。低内存设备不应预装任何动态壁纸。

内核配置

优化内核/ActivityManager 以减少直接回收

当进程或内核尝试分配(直接分配或因新页面中存在故障而分配)内存页面并且内核已用尽所有可用内存时,就会发生直接回收。在这种情况下,内核需要释放一个页面,并在此过程中阻断分配操作。而这通常又需要磁盘 I/O 清理一个有文件支持的脏页或等待 lowmemorykiller 终止一个进程。最终可能会导致任意线程(包括界面线程)中出现额外 I/O。

为避免出现直接回收,内核已配有可触发 kswapd 或后台回收的水印。此线程会尝试释放页面,以便下次分配真实线程时,能够快速顺利启动。

用于触发后台回收的默认阈值相当低,在 2GB 设备上约为 2 MB,在 512 MB 设备上约为 636 KB。内核通过后台回收仅能回收几兆的内存。这意味着,任何快速分配超过几兆内容的进程都会快速导致直接回收。

在 Android-3.4 内核分支中,我们通过补丁程序 92189d47f66c67e5fd92eafaa287e153197a454f(“添加用于扩展可用内存空间的可调选项”)添加了对内核可调选项的支持。如果您选择将该补丁程序添加到设备内核中,ActivityManager 会告知内核尝试保留能容纳 3 个全屏 32 bpp 缓冲区的可用内存空间。

这些阈值可通过 config.xml 框架进行配置。

-1

0

优化 LowMemoryKiller

ActivityManager 可配置 LowMemoryKiller 的阈值,使其符合它对在每个优先级分段中运行进程时所需的文件支持页面(缓存页面)工作集的预期。如果设备对工作集有很高的要求(例如:如果供应商界面需要更多内存,或者如果添加了更多服务),则可增大阈值。

如果为文件支持页面预留了太多内存,则可减小阈值,以便系统能够在因缓存变得过小而导致磁盘超负荷之前就终止后台进程。

-1

0

交换到 zram

zram 交换可通过压缩内存页面并将其放入动态分配的内存交换区来增加系统中的可用内存量。由于这是以牺牲 CPU 时间为代价来增加少量内存,因此您应仔细权衡 zram 交换会对您系统的性能造成的负面影响。

Android 会在多个层面上处理 zram 交换:

首先,必须启用以下内核选项,才能有效地使用 zram 交换:

CONFIG_SWAP

CONFIG_ZRAM

然后,您应将一行与下列类似的内容添加到 fstab 中:/dev/block/zram0 none swap defaults zramsize=,swapprio=

zramsize 是必要内容,表示您希望 zram 区域占用多少未压缩内存。压缩比通常介于 30-50% 之间。

仅当您没有多个交换区时才需要 swapprio。

在设备专用 swap_block_device,以便 SELinux 适当地对其进行处理。

/dev/block/zram0 u:object_r:swap_block_device:s0

默认情况下,Linux 内核每次会换入 8 页内存。当使用 zram 时,每次读取 1 页内存产生的增量开销微乎其微,如果设备承受巨大的内存压力,可能有所助益。要想每次只读取 1 页内存,请将以下内容添加到您的 init.rc 中:write /proc/sys/vm/page-cluster 0

在 init.rc 行的 mount_all /fstab.X 行之后,添加:swapon_all /fstab.X

如果在内核中启用了此功能,系统便会在启动时自动配置内存 cgroups。

如果内存 cgroup 可用,则 ActivityManager 将优先级较低的线程标记为可比其他线程更适合交换。在需要内存时,Android 内核会开始将内存页面迁移到 zRAM 交换区,并会优先处理那些已被 ActivityManager 标记的内存页面。

Carveout、Ion 和连续内存分配 (CMA)

在低内存设备上,请务必注意 carveout,尤其是那些未得到充分利用的 carveout,例如用于安全地播放视频的 carveout。有几种解决方案可最大限度地减小 carveout 区域的影响,具体取决于硬件的确切要求。

如果硬件允许不连续的内存分配,则可利用 Ion 系统堆从系统内存中分配内存,这样便无需使用 carveout。Ion 还会尝试增大分配的内存空间以消除外围设备上的转译后备缓冲区 (TLB) 压力。如果内存区域必须连续或必须限定在某个特定地址范围内,则可以使用 CMA。

这将创建一个 carveout,系统也可以将其用于处理可移动页面。

当需要该区域时,可移动页面就会从中移出,以便系统将处于空闲状态的大型 carveout 用于其他目的。 您可以直接将 CMA 与 Ion CMA 堆配合使用。

应用优化提示

使用 development/tools/findunused 移除预安装应用中所有未使用的资源(这应该会有助于减小应用所占用的空间)。

针对资源(特别是具有透明区域的资源)使用 PNG 格式。

编写原生代码时,请使用 calloc() 而非 malloc/memset。

请勿启用会将 Parcel 数据写入磁盘并在之后读取这些数据的代码。

使用 SSP 过滤,而不要订阅已安装的所有软件包。请添加如下所示的过滤条件:

了解 Android 中的各种进程状态

状态

含义

详情

SERVICE

SERVICE_RESTARTING

由于与应用相关的原因而在后台运行的应用。

SERVICESERVICE_RESTARTING 是应用过于频繁地在后台运行时会遇到的最常见的问题。使用 %duration * pss 或 %duration 作为“不良”指标。理想情况下,这些应用根本不应该运行。

IMPORTANT_FOREGROUND

RECEIVER

在后台运行的应用(不直接与用户交互)。

这些应用会增加系统的内存负载。使用 (%duration * pss)“不良”值来对这些进程进行排序。不过,很多此类应用都会因合理原因而需要运行。pss 大小将会是它们的内存负载的重要组成部分。

PERSISTENT

持续的系统进程。

跟踪 pss 可监视这些进程是否会变得过大。

TOP

正与用户交互的进程。

pss 在此又成为了重要指标,可显示应用在使用过程中产生的内存负载。

HOME

CACHED_EMPTY

系统保留的备用进程。

这些进程可随时终止,并可根据需要重新创建。内存状态(“正常”、“中等”、“低”、“严重”)是根据系统运行的此类进程的数量进行计算的。这些进程的关键指标为 pss。在这种状态下,这些进程应尽可能地减少其内存占用空间,以便系统能够保留尽可能多的进程。一般来说,与在 TOP 状态下相比,运行状况良好的应用在该状态下的 pss 占用空间明显更小。

CACHED_ACTIVITY

CACHED_ACTIVITY_CLIENT

与 TOP 相比,这些状态显示了应用将内存释放到后台的程度。

排除 CACHED_EMPTY 状态可改善这些数据,因为这项操作会排除因某些原因(除了与用户互动之外)而启动进程的情况。

这样便无需处理 CACHED_EMPTY 在执行与用户相关的 Activity 时产生的界面开销。

分析

分析应用启动时间

如需分析应用的启动时间,请运行 $ adb shell am start -P 或 --start-profiler 并启动您的应用。在该进程从 zygote 分 k 之后以及任何代码加载到该分支之前,分析器就会启动。

使用错误报告进行分析

错误报告包含一些服务(包括 batterystats、netstats、procstats、usagestats),它们可用于调试。报告可包括以下行:

------ CHECKIN BATTERYSTATS (dumpsys batterystats --checkin) ------

7,0,h,-2558644,97,1946288161,3,2,0,340,4183

7,0,h,-2553041,97,1946288161,3,2,0,340,4183

检查是否存在任何持续进程

要检查任何持续进程,请重新启动设备并检查进程情况。然后,让设备运行几个小时,然后再次检查进程情况。

两次检查之间不应存在任何长时间运行的进程。

运行长时测试

要运行长时测试,请让设备运行较长时间,并跟踪进程的内存占用情况,以确定内存用量增加还是保持不变。然后拟订规范的使用情形,并针对这些情形运行长时测试。

android开机自动开启zram,低内存配置  |  Android 开源项目  |  Android Open Source Project...相关推荐

  1. android开机自动开启zram,android zram

    8 10 2013 android zram android 内核中引入zram Compressing pages and keeping them in RAM virtually increas ...

  2. 苹果电脑删除软件_软件自动开启很烦人?如何彻底关掉开机自动开启的应用程序...

    使用Mac的小伙伴有没有这样的烦恼,电脑一开机,一堆烦人的软件就自动开启了,让人很懊恼,如何才能彻底关掉开机自动开启的应用程序?mac开机启动项怎么设置?开机启动项要怎么禁止?今天就带大家解决这个懊恼 ...

  3. 怎么关闭电脑开机自动启动的程序_软件自动开启很烦人?如何彻底关掉Mac电脑开机自动开启的应用程序?...

    使用Mac电脑的小伙伴有没有这样的烦恼,电脑一开机,一堆烦人的软件就自动开启了. 如何才能彻底关掉开机自动开启的应用程序?mac开机启动项怎么设置?开机启动项要怎么禁止?今天就带大家解决这个懊恼的问题 ...

  4. Windows10设置移动热点开机自动开启

    带有无线网卡设备的Windows10系统中提供了移动热点的功能,可以很方便的将电脑有线网络通过无线广播出去(相当于无线路由器的效果),但是这个功能必须要手动开启,下面提供一个可以开机自动开启移动热点的 ...

  5. 【开源项目----Android OPenGLES渲染YUV视频文件】

    [开源项目----Android OPenGLES渲染YUV视频文件] OpenGLES对YUV渲染相关文章参考

  6. Android 开机自动运行和添加删除桌面快捷方式

    <一>开机自启动 当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为android.intent.action.BOOT_C ...

  7. Android开机自动运行APP——BroadcastReceiver

    前言: 有些时候,应用需要在开机时就自动运行,例如某个自动从网上更新内容的后台service.怎样实现开机自动运行的应用?在撰写本文时,联想到高焕堂先生以"Don't call me, I' ...

  8. Android 开机自动加载新wifi模块驱动

    在android ROM 开发中经常会遇到产品更换wifi模块的情况,一般常见的wifi驱动android内核中自带都有,无需过多调试,要是碰上内核中没有的就需要根据厂商提供的驱动进行移植. wifi ...

  9. 【彻底解决】Win10设置开机自动开启【移动热点】

    1. 在D盘根目录创建wifi.txt记事本,随后粘贴下面内容: Add-Type -AssemblyName System.Runtime.WindowsRuntime $asTaskGeneric ...

最新文章

  1. REST API出错响应的设计(转)
  2. Bengio实验室推出开源AI药物研发平台,唐建领队、清北上交学生参与开发
  3. Python Numpy介绍
  4. 微信支付在巴黎发布“智慧生活零时差”全球战略
  5. 2n皇后 - 回溯
  6. Java中interrupted()和isInterrupted()之间的区别
  7. java 判断日期为第几天
  8. 2021小程序该怎么做?爆款产品拆解案例来了
  9. Python机器学习:决策树002信息熵
  10. k8s高可用集群_搭建高可用集群(实现方式介绍)---K8S_Google工作笔记0054
  11. 内部人示范(野生项目笔记02)
  12. 四川省大学生计算机作品大赛,我校学子在2019“新华三杯”四川省大学生计算机作品大赛中获奖20项...
  13. python开发mbus程序_一种PMBus总线电源模块的控制与实现
  14. win10 教育版本变专业版本
  15. 无线桥接dhcp服务器不启动,TP-Link路由器桥接提示“获取IP地址失败,请检查DHCP是否开启...
  16. html css径向渐变,如何实现css3径向渐变如何定义中心和大小形状
  17. 【tool】动态注释LOG_NDEBUG宏定义
  18. 嵌入式软件开发笔试面试知识点总结-Linux部分
  19. 大青云不显示服务器,《大青云》8月30日合服公告
  20. 关于 /proc/mounts

热门文章

  1. 那些你不知道的 LVS 秘密!
  2. 云+X案例展 | 民生类:中国电信天翼云携手国家天文台打造“大国重器”
  3. Ivanti罗琦:IT服务管理中“拧紧螺丝”要有门道儿!
  4. 启动metabase_引入开源BI软件Metabase——数据分析平台建设(一)
  5. MQ java.lang.OutOfMemoryError: unable to create new native thread
  6. Gitlab14.x 安装、配置、启动 (Centos/Red Hat7/8.x)
  7. Hadoop集群安装部署_分布式集群安装_01
  8. 使用MAT工具分析内存溢出
  9. 安装Vuecli新版本正常,但是显示版本是低版本
  10. 实战_06_SpringBoot整合redis-cluster集群版本