RK3288 Android 7.1 dumpsys meminfo 无法获取内存信息问题

简介: RK3288 Android 7.1 dumpsys meminfo 无法获取内存信息问题

平台


    RK3288 + Android 7.1


问题


dumpsys meminfo 执行后无法获取APP内存信息


问题LOG:


rk3288:/ $ dumpsys meminfo                                                                                           
Applications Memory Usage (in Kilobytes):
Uptime: 2236645 Realtime: 2236645
Total PSS by process:
     70,361K: system (pid 380)
     18,544K: com.android.settings (pid 631)
      8,734K: android.rockchip.update.service (pid 1184)
      6,630K: com.android.keychain (pid 1137)
      6,393K: com.hsdz.systemcontroler:shellservice (pid 728)
      6,341K: com.hsdz.systemcontroler:sysinfo (pid 745)
      5,965K: com.cghs.stresstest (pid 1029)
        558K: servicemanager (pid 204)
          0K: com.android.providers.calendar (pid 1284)
          0K: android.process.media (pid 1200)
          0K: com.android.printspooler (pid 1051)
          0K: com.android.calendar (pid 1240)
          0K: com.android.email (pid 1268)
          0K: com.android.onetimeinitializer (pid 1330)
          0K: com.android.managedprovisioning (pid 1313)
          0K: com.android.deskclock (pid 998)
          0K: com.android.launcher3 (pid 1100 / activities)
          0K: com.android.inputmethod.pinyin (pid 1013)
          0K: com.android.smspush (pid 1084)
          0K: android.ext.services (pid 978)
          0K: com.android.systemui (pid 608)
          0K: com.android.phone (pid 603)
          0K: /init (pid 1)
          0K: ueventd (pid 162)
          0K: logd (pid 182)
          0K: debuggerd (pid 189)
          0K: vold (pid 190)
          0K: debuggerd:signaller (pid 191)
          0K: healthd (pid 200)
          0K: displayd (pid 201)
          0K: tee-supplicant (pid 202)
          0K: lmkd (pid 203)
          0K: surfaceflinger (pid 205)
          0K: sh (pid 214)
          0K: rild (pid 215)
          0K: adbd (pid 217)
          0K: zygote (pid 223)
          0K: audioserver (pid 224)
          0K: cameraserver (pid 225)
          0K: drmserver (pid 226)
          0K: installd (pid 227)
          0K: keystore (pid 228)
          0K: media.codec (pid 229)
          0K: mediadrmserver (pid 230)
          0K: media.extractor (pid 231)
          0K: mediaserver (pid 232)
          0K: netd (pid 233)
          0K: gatekeeperd (pid 234)
          0K: perfprofd (pid 241)
          0K: logcat (pid 1369)
          0K: sh (pid 1388)
          0K: transport (pid 1390)
          0K: sh (pid 1409)
          0K: dumpsys (pid 1441)
Total PSS by OOM adjustment:
        558K: Native
            558K: servicemanager (pid 204)
              0K: /init (pid 1)
              0K: ueventd (pid 162)
              0K: logd (pid 182)
              0K: debuggerd (pid 189)
              0K: vold (pid 190)
              0K: debuggerd:signaller (pid 191)
              0K: healthd (pid 200)
              0K: displayd (pid 201)
              0K: tee-supplicant (pid 202)
              0K: lmkd (pid 203)
              0K: surfaceflinger (pid 205)
              0K: sh (pid 214)
              0K: rild (pid 215)
              0K: adbd (pid 217)
              0K: zygote (pid 223)
              0K: audioserver (pid 224)
              0K: cameraserver (pid 225)
              0K: drmserver (pid 226)
              0K: installd (pid 227)
              0K: keystore (pid 228)
              0K: media.codec (pid 229)
              0K: mediadrmserver (pid 230)
              0K: media.extractor (pid 231)
              0K: mediaserver (pid 232)
              0K: netd (pid 233)
              0K: gatekeeperd (pid 234)
              0K: perfprofd (pid 241)
              0K: logcat (pid 1369)
              0K: sh (pid 1388)
              0K: transport (pid 1390)
              0K: sh (pid 1409)
              0K: dumpsys (pid 1441)
     70,361K: System
         70,361K: system (pid 380)
      5,965K: Persistent
          5,965K: com.cghs.stresstest (pid 1029)
              0K: com.android.systemui (pid 608)
              0K: com.android.phone (pid 603)
     15,075K: A Services
          8,734K: android.rockchip.update.service (pid 1184)
          6,341K: com.hsdz.systemcontroler:sysinfo (pid 745)
      6,393K: B Services
          6,393K: com.hsdz.systemcontroler:shellservice (pid 728)
     25,174K: Cached
         18,544K: com.android.settings (pid 631)
          6,630K: com.android.keychain (pid 1137)
              0K: com.android.providers.calendar (pid 1284)
              0K: android.process.media (pid 1200)
              0K: com.android.printspooler (pid 1051)
              0K: com.android.calendar (pid 1240)
              0K: com.android.email (pid 1268)
              0K: com.android.onetimeinitializer (pid 1330)
              0K: com.android.managedprovisioning (pid 1313)
              0K: com.android.deskclock (pid 998)
Total PSS by category:
     27,403K: .dex mmap
     20,264K: Native
     16,707K: .oat mmap
     16,285K: Dalvik
     11,203K: .apk mmap
     10,282K: .art mmap
     10,104K: .so mmap
      3,947K: Dalvik Other
      3,886K: Unknown
      1,816K: Other mmap
      1,126K: .jar mmap
        232K: Stack
        106K: .ttf mmap
         90K: Ashmem
         75K: Other dev
          0K: Cursor
          0K: Gfx dev
          0K: EGL mtrack
          0K: GL mtrack
          0K: Other mtrack
Total RAM: 2,044,596K (status normal)
 Free RAM: 1,405,270K (   25,174K cached pss +   112,564K cached kernel + 1,267,532K free)
 Used RAM:   367,200K (   98,352K used pss +   268,848K kernel)
 Lost RAM:   272,122K
     ZRAM:         4K physical used for         0K in swap (  520,908K total swap)
   Tuning: 192 (large 512), oom   184,320K, restore limit    61,440K (high-end-gfx)


问题LOG 2:获取某个应用内存:


rk3288:/ $ dumpsys meminfo com.android.systemui                                                                      
Applications Memory Usage (in Kilobytes):
Uptime: 2218086 Realtime: 2218087
** MEMINFO in pid 608 [com.android.systemui] **
                   Pss  Private  Private     Swap     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap        0        0        0        0    13312    10980     2331
  Dalvik Heap        0        0        0        0    11424     6855     4569
      Unknown        0        0        0        0                           
        TOTAL        0        0        0        0    24736    17835     6900
 App Summary
                       Pss(KB)
                        ------
           Java Heap:        0
         Native Heap:        0
                Code:        0
               Stack:        0
            Graphics:        0
       Private Other:        0
              System:        0
               TOTAL:        0      TOTAL SWAP (KB):        0
 Objects
               Views:      538         ViewRootImpl:        4
         AppContexts:        9           Activities:        0
              Assets:        3        AssetManagers:        5
       Local Binders:      118        Proxy Binders:       49
       Parcel memory:        9         Parcel count:       39
    Death Recipients:        1      OpenSSL Sockets:        0
            WebViews:        0
 SQL
         MEMORY_USED:        0
  PAGECACHE_OVERFLOW:        0          MALLOC_SIZE:        0


正常LOG:


rk3288:/ $ dumpsys meminfo com.android.settings
Applications Memory Usage (in Kilobytes):
Uptime: 2281967 Realtime: 2281967
** MEMINFO in pid 631 [com.android.settings] **
                   Pss  Private  Private  SwapPss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap     3479     3396        0        0     8192     4758     3433
  Dalvik Heap     1629     1580        0        0     3572     2679      893
 Dalvik Other      236      236        0        0                           
        Stack       36       36        0        0                           
       Ashmem        4        4        0        0                           
    Other dev       10        0        8        0                           
     .so mmap     2128      124        0        0                           
    .apk mmap     3274        0       96        0                           
    .ttf mmap      106        0       40        0                           
    .dex mmap     2952        4     2948        0                           
    .oat mmap     2204        0       68        0                           
    .art mmap     1400      964        0        0                           
   Other mmap      527        4        0        0                           
      Unknown      559      544        0        0                           
        TOTAL    18544     6892     3160        0    11764     7437     4326
 App Summary
                       Pss(KB)
                        ------
           Java Heap:     2544
         Native Heap:     3396
                Code:     3280
               Stack:       36
            Graphics:        0
       Private Other:      796
              System:     8492
               TOTAL:    18544       TOTAL SWAP PSS:        0
 Objects
               Views:        1         ViewRootImpl:        0
         AppContexts:        2           Activities:        0
              Assets:        2        AssetManagers:        2
       Local Binders:       10        Proxy Binders:       13
       Parcel memory:        3         Parcel count:       12
    Death Recipients:        0      OpenSSL Sockets:        0
            WebViews:        0
 SQL
         MEMORY_USED:        0
  PAGECACHE_OVERFLOW:        0          MALLOC_SIZE:        0


分析


frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java


final void dumpApplicationMemoryUsage(FileDescriptor fd,
            PrintWriter pw, String prefix, String[] args, boolean brief, PrintWriter categoryPw) {
        boolean dumpDetails = false;
        boolean dumpFullDetails = false;
        boolean dumpDalvik = false;
        boolean dumpSummaryOnly = false;
        boolean dumpUnreachable = false;
        boolean oomOnly = false;
        boolean isCompact = false;
        boolean localOnly = false;
        boolean packages = false;
        boolean isCheckinRequest = false;
        boolean dumpSwapPss = false;
        //...
    if (mi == null) {
                    mi = new Debug.MemoryInfo();
                }
                if (dumpDetails || (!brief && !oomOnly)) {
                    Debug.getMemoryInfo(pid, mi);
                    hasSwapPss = mi.hasSwappedOutPss;
                } else {
                    mi.dalvikPss = (int)Debug.getPss(pid, tmpLong, null);
                    mi.dalvikPrivateDirty = (int)tmpLong[0];
                }
      //...
}


frameworks/base/core/java/android/os/Debug.java


 

/**
     * Retrieves information about this processes memory usages. This information is broken down by
     * how much is in use by dalvik, the native heap, and everything else.
     *
     * <p><b>Note:</b> this method directly retrieves memory information for the give process
     * from low-level data available to it.  It may not be able to retrieve information about
     * some protected allocations, such as graphics.  If you want to be sure you can see
     * all information about allocations by the process, use instead
     * {@link android.app.ActivityManager#getProcessMemoryInfo(int[])}.</p>
     */
    public static native void getMemoryInfo(MemoryInfo memoryInfo);


frameworks/base/core/jni/android_os_Debug.cpp


static void android_os_Debug_getDirtyPagesPid(JNIEnv *env, jobject clazz,
        jint pid, jobject object)
{
    bool foundSwapPss;
    stats_t stats[_NUM_HEAP];
    memset(&stats, 0, sizeof(stats));
    load_maps(pid, stats, &foundSwapPss);
    struct graphics_memory_pss graphics_mem;
    if (read_memtrack_memory(pid, &graphics_mem) == 0) {
        stats[HEAP_GRAPHICS].pss = graphics_mem.graphics;
        stats[HEAP_GRAPHICS].privateDirty = graphics_mem.graphics;
        stats[HEAP_GL].pss = graphics_mem.gl;
        stats[HEAP_GL].privateDirty = graphics_mem.gl;
        stats[HEAP_OTHER_MEMTRACK].pss = graphics_mem.other;
        stats[HEAP_OTHER_MEMTRACK].privateDirty = graphics_mem.other;
    }
    for (int i=_NUM_CORE_HEAP; i<_NUM_EXCLUSIVE_HEAP; i++) {
        stats[HEAP_UNKNOWN].pss += stats[i].pss;
        stats[HEAP_UNKNOWN].swappablePss += stats[i].swappablePss;
        stats[HEAP_UNKNOWN].privateDirty += stats[i].privateDirty;
        stats[HEAP_UNKNOWN].sharedDirty += stats[i].sharedDirty;
        stats[HEAP_UNKNOWN].privateClean += stats[i].privateClean;
        stats[HEAP_UNKNOWN].sharedClean += stats[i].sharedClean;
        stats[HEAP_UNKNOWN].swappedOut += stats[i].swappedOut;
        stats[HEAP_UNKNOWN].swappedOutPss += stats[i].swappedOutPss;
    }
    for (int i=0; i<_NUM_CORE_HEAP; i++) {
        env->SetIntField(object, stat_fields[i].pss_field, stats[i].pss);
        env->SetIntField(object, stat_fields[i].pssSwappable_field, stats[i].swappablePss);
        env->SetIntField(object, stat_fields[i].privateDirty_field, stats[i].privateDirty);
        env->SetIntField(object, stat_fields[i].sharedDirty_field, stats[i].sharedDirty);
        env->SetIntField(object, stat_fields[i].privateClean_field, stats[i].privateClean);
        env->SetIntField(object, stat_fields[i].sharedClean_field, stats[i].sharedClean);
        env->SetIntField(object, stat_fields[i].swappedOut_field, stats[i].swappedOut);
        env->SetIntField(object, stat_fields[i].swappedOutPss_field, stats[i].swappedOutPss);
    }
    env->SetBooleanField(object, hasSwappedOutPss_field, foundSwapPss);
    jintArray otherIntArray = (jintArray)env->GetObjectField(object, otherStats_field);
    jint* otherArray = (jint*)env->GetPrimitiveArrayCritical(otherIntArray, 0);
    if (otherArray == NULL) {
        return;
    }
    int j=0;
    for (int i=_NUM_CORE_HEAP; i<_NUM_HEAP; i++) {
        otherArray[j++] = stats[i].pss;
        otherArray[j++] = stats[i].swappablePss;
        otherArray[j++] = stats[i].privateDirty;
        otherArray[j++] = stats[i].sharedDirty;
        otherArray[j++] = stats[i].privateClean;
        otherArray[j++] = stats[i].sharedClean;
        otherArray[j++] = stats[i].swappedOut;
        otherArray[j++] = stats[i].swappedOutPss;
    }
    env->ReleasePrimitiveArrayCritical(otherIntArray, otherArray, 0);
}


static void load_maps(int pid, stats_t* stats, bool* foundSwapPss)
{
    char tmp[128];
    FILE *fp;
    sprintf(tmp, "/proc/%d/smaps", pid);
    fp = fopen(tmp, "r");
    if (fp == 0)
  {
     //问题点在这里, 读取smaps文件时出现访问权限问题.
     //load_maps open smaps failed:Permission denied
  ALOGE("load_maps open smaps failed:%s", strerror(errno));
  return;
  }
    read_mapinfo(fp, stats, foundSwapPss);
    fclose(fp);
}


看下权限,


#SELINUX
rk3288:/proc/1 # ps -Z 397
LABEL                          USER      PID   PPID  VSIZE  RSS   WCHAN            PC  NAME
u:r:system_server:s0           system    397   221   1621612 165364 SyS_epoll_ adc7f7a4 S system_server
rk3288:/ $ ls -lZ proc/1176/smaps
-r--r--r-- 1 u0_a19 u0_a19 u:r:platform_app:s0:c512,c768 0 2013-01-18 23:25 proc/1176/smaps
##LINUX
rk3288:/ $ ls -l proc/1176/smaps                                                                                   
-r--r--r-- 1 u0_a19 u0_a19 0 2013-01-18 23:25 proc/1176/smaps


初步判断权限的问题点:


1.SELINUX

2.基本文件权限

一般情况下, SELINUX的LOG会出现:


type=1400 audit(1358525621.570:41): avc: denied { read open } for pid=1449 comm="rmlogger" path="/data/media/0" dev="mmcblk1p14" ino=1137 scontext=u:r:rmlogger:s0 tcontext=u:object_r:media_rw_data_file:s0 tclass=dir permissive=1


然而在多次测试后, 并没有出现类似问题的LOG


之后, 开始折腾这两个文件 :


kernel/fs/namei.c
kernel/fs/open.c


加了一堆关于 -EACCES的LOG, 始终定位不到问题…


最后, 终于在GOOGLE上找到:

framework

kernel


0a2653c851af460fa595bd959398a8f1.png

0a2653c851af460fa595bd959398a8f1.png


补丁打上, 解决


引用


dumpsys meminfo分析

Linux open系统调用流程浅析

open.c源代码阅读

Androiod 安全上下文的临时更改,命令


相关文章
|
25天前
|
存储 开发工具 Android开发
构建高效的Android应用:从内存管理到用户界面
【5月更文挑战第29天】 随着智能手机的普及,Android应用的开发变得日益重要。然而,许多开发者在开发过程中忽视了性能优化,导致应用运行缓慢,用户体验差。本文将深入探讨如何通过有效的内存管理和用户界面优化,提升Android应用的性能。我们将详细介绍内存泄漏的原因和解决方案,以及如何使用Android的新特性来创建流畅的用户界面。无论你是新手还是经验丰富的开发者,都可以从本文中获得有用的技巧和建议。
|
25天前
|
移动开发 监控 Android开发
构建高效Android应用:从内存优化到电池寿命代码之美:从功能实现到艺术创作
【5月更文挑战第28天】 在移动开发领域,特别是针对Android系统,性能优化始终是关键议题之一。本文深入探讨了如何通过细致的内存管理和电池使用策略,提升Android应用的运行效率和用户体验。文章不仅涵盖了现代Android设备上常见的内存泄漏问题,还提出了有效的解决方案,包括代码级优化和使用工具进行诊断。同时,文中也详细阐述了如何通过减少不必要的后台服务、合理管理设备唤醒锁以及优化网络调用等手段延长应用的电池续航时间。这些方法和技术旨在帮助开发者构建更加健壮、高效的Android应用程序。
|
1天前
|
大数据 API Android开发
Android MemoryFile 共享内存
Android MemoryFile 共享内存
7 0
|
1天前
|
缓存 Java Linux
Android 匿名内存深入分析
Android 匿名内存深入分析
6 0
|
25天前
|
监控 Android开发 UED
构建高效的Android应用:从内存管理到用户体验
【5月更文挑战第28天】 在移动开发的世界中,打造一个既快速又高效的Android应用是每个开发者追求的目标。本文将深入探讨如何通过合理的内存管理策略、优化的代码实践和用户界面设计的提升来增强应用性能。我们将剖析内存泄漏的根源,提供解决方案,探索Kotlin与Java在性能上的差异,并分析如何利用Android系统提供的工具监控和改善应用表现。此外,我们还将讨论Material Design的应用以及其对用户体验的影响。通过这些技术的综合运用,你将能够为用户提供更流畅、响应更快的使用体验。
|
27天前
|
监控 Java Android开发
构建高效Android应用:采用Kotlin进行内存优化的策略
【5月更文挑战第26天】随着移动设备的普及,用户对应用程序的性能要求越来越高。在资源受限的Android平台上,内存管理成为提升性能的关键因素之一。本文将深入探讨使用Kotlin语言开发Android应用时,如何通过智能内存管理策略来提高应用性能和用户体验。我们将分析内存泄露的原因,介绍有效的内存优化技巧,并通过实例代码展示如何在Kotlin中实现这些优化措施。
|
28天前
|
缓存 Java Android开发
构建高效的Android应用:内存优化策略解析
【5月更文挑战第25天】在移动开发领域,性能优化一直是一个不断探讨和精进的课题。特别是对于资源受限的Android设备来说,合理的内存管理直接关系到应用的流畅度和用户体验。本文深入分析了Android内存管理的机制,并提出了几种实用的内存优化技巧。通过代码示例和实践案例,我们旨在帮助开发者识别和解决内存瓶颈,从而提升应用性能。
|
28天前
|
存储 算法 Java
Android 应用开发中的内存优化策略
【5月更文挑战第25天】 在移动设备上,资源的有限性要求开发者对应用进行严格的性能优化。特别是对于Android平台,由于设备的多样性和碎片化问题,内存管理成为确保应用流畅运行的关键因素之一。本文将探讨几种实用的内存优化技术,包括避免内存泄漏、合理使用数据结构和算法、优化图片资源以及利用Android系统的垃圾回收机制。文章的目的是为Android开发者提供一套有效的内存管理工具集,帮助他们构建更高效、更稳定的应用。
|
1月前
|
缓存 移动开发 Android开发
构建高效Android应用:从内存优化到电池寿命
【5月更文挑战第18天】在移动开发领域,一个优秀的Android应用不仅要拥有流畅的用户界面和丰富的功能,更要在设备资源有限的前提下保持高效运行。本文将探讨Android应用开发中关键的性能优化策略,包括内存使用优化、CPU使用减少和电池寿命延长等方面。通过分析常见的性能瓶颈和提供实用的解决方案,帮助开发者打造更高效、更受欢迎的Android应用。
|
1月前
|
移动开发 监控 Android开发
构建高效Android应用:从内存优化到电池续航
【5月更文挑战第22天】 在移动开发的世界中,一个流畅且高效的Android应用是区分优秀与平庸的关键因素。本文深入探讨了如何通过内存管理和电池使用效率的优化来提升应用性能,确保最终用户获得无缝且持久的体验。我们将透过具体策略和编码实践,揭示开发过程中可实施的改进措施,旨在帮助开发者克服常见的性能瓶颈,打造更高质量的Android应用。