android - android bootanimation子进程影响其父进程init内存占用的怪问题

标签 android linux memory process init

此问题可能与Android或Linux有关。如果你不熟悉Android,我先简单介绍一下init和bootanimation。 Android init 与 Linux init 相同。它是用户空间中的第一个进程。 pid 为 1。init 进程将执行一些在 init.rc 中定义的系统初始化。初始化之一是开机动画。它由名为 bootanimation 的进程播放。 Bootanimation 是一个 native 进程。它使用 OpenGL ES 播放动画。开机动画通常由一个包含数十或数百个静态图像的 zip 文件来描述。以一定的速度播放它们成为动画。

现在奇怪的问题来了。是关于init进程的内存占用。在干净的android 8.1.0系统中,init占用内存超过40M+。我们可以通过 adb shell 命令 'dumpsys meminfo init' 找到分配细节。

                   Pss
                 Total
                ------
  Native Heap     1076
  Dalvik Heap        0
        Stack       16
    Other dev      363
   Other mmap      333
   EGL mtrack    10040
    GL mtrack    29170
      Unknown       32
        TOTAL    41030

我们可以看到与图形相关的 EGL/GL 占用了大部分内存。通常,init 是一个后端进程。它与图形无关。那为什么图形相关的内存占用最多。我唯一能弄清楚的与图形相关的是启动动画。如上所述,它由 init 进程启动/派生。所以我做了一些测试。如果我禁用开机动画,init的内存占用确实减少了很多,大约20M。我还做了其他测试。我试图修改 bootanimation 的源代码以加载和渲染单个图像而不是数百个图像。 init的内存占用也减少了很多。也就是说init的内存占用与bootanimation加载的图片数量有关。进一步测试发现,通过init fork bootanimation进程后,init的内存占用会减少很多。似乎内存从init转移到了它的子进程bootanimation。

那么我的最后一个问题是:作为子进程,为什么bootanimation会影响其父进程的内存占用?当bootanimation进程退出时,占用的资源不应该全部释放吗?

补充说明:虽然在我看来,当一个进程退出时,应该释放所有资源。而且谷歌写的android源码应该是老练的,没有bug。我仍然怀疑bootanimation中的资源泄漏。 Bootanimation 使用 skia 库中的 SkBitmap 来加载图像并使用 OpenGL ES 1.0 纹理来渲染它们。我确认如果我没有确认错误,SkBitmap 和 OpenGL 纹理将被正确销毁。大家可能对相关的android源码感兴趣。

bootanimation中播放动画的核心代码: http://androidxref.com/8.1.0_r33/xref/frameworks/base/cmds/bootanimation/BootAnimation.cpp#862 图片加载代码: http://androidxref.com/8.1.0_r33/xref/frameworks/base/cmds/bootanimation/BootAnimation.cpp#190 init中启动bootanimation的代码: http://androidxref.com/8.1.0_r33/xref/system/core/init/service.cpp#688

感谢您的所有回答、建议和评论。

最佳答案

经过一系列新的测试和代码阅读,我发现了一些新东西。我将添加一些新评论。这个问题与init无关。该问题与 dumpsys meminfo 的实现有关。 dumpsys meminfo 显示的进程内存由两部分组成。一部分由该过程直接分配。比如 Dalvik Heap 和 Native Heap。而另一部分不是由该进程直接分配的,而是由系统分配的,只是由该进程引起的。上面显示的EGL/GL mtrack部分属于这个部分。跟踪这部分内存是由不同的硬件平台实现的。 Is 由显示驱动程序计数。我用的是MTK平台。它将跟踪那些执行实际 GL 操作的进程的 GL 内存。我相信这些统计数据是准确的。但是有系统消耗的总GL内存,也就是我们在不带额外参数的情况下执行dumpsys meminfo时可以看到的总GL mtrack值。它可能不等于所有已核算流程的已统计 GL 值的总和。然后它计算总 GL 内存和 GL 内存总和的差异到 init 进程。因为 init 是所有其他进程的祖先进程。所以init的GL mtrack的值看起来很大,它不是init分配的,实际上也不是init造成的。

现在我们可以解释上面那个很奇怪的问题了,知道它和process init没有关系。但是我的问题仍然没有解决。也就是说,为什么事件bootanimation被终止,它分配的GL内存没有被释放?这是否意味着资源泄漏?或者我可以将其视为 mtk 显示驱动程序的错误吗?

关于android - android bootanimation子进程影响其父进程init内存占用的怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52814874/

相关文章:

java - Java 对象数组创建后的内存大小是多少?

java - 缓存一个 Map 变量并跨四个 tomcat 服务器访问它(java)

android - OutOfMemory 异常 - 对于 adapter.notifiyDataSetChanged() 在使用 picasso 加载图像时

android - jar 绑定(bind) zubhium sdk 的 Monodroid 问题

linux - 按信号名称查找信号编号

c++ - OpenCV版本显示错误

c# - 将泛型 Span<T> 转换为特定实例化(例如 Span<int>)(如果它在运行时实际上属于该类型)

java - Android 警报管理器不会触发我的事件

android - Google Play控制台和Play商店中的应用大小不同

linux - shell 脚本 : to print selected text in the string