11

当用户第一次打开我的应用程序时,它使用了 75MB 内存。

我使用 Android Studio 中的 Android Profiler Tool 来检查我的 Android 应用程序的内存使用情况。当主屏幕打开时,应用程序开始使用 75MB 内存,即使主 Activity 没有创建任何需要太多内存的对象。没有位图或任何大数组等。

40MB 来自“代码”部分,19MB 来自“本机”,我们在此 Activity 中不加载任何本机库。不过,我们会在用户打开另一个 Activity 后加载。我正在尝试减少内存使用量,我想知道如何从“代码”和“本机”部分减少。

Android Profiler 的屏幕截图

在此处输入图像描述

4

1 回答 1

15

关于native内存使用:

  1. 即使您的应用程序中有 0 个本机代码,Android 框架也可以使用本机内存,请参阅此处的“本机”以供参考。例如,我只是尝试制作一个示例项目,只有一个Activity和一个Button,本机内存使用量为 18mb,如果我触发垃圾收集,它会下降到 8mb。为了在 Android Studio 中手动触发垃圾收集,您可以单击内存分析器窗口左上角的“垃圾箱”图标。不要对那个按钮害羞,我通常必须连续按多次才能看到内存使用量下降。

  2. 本机内存也可以从 Java 分配,而无需使用ByteBuffer.allocateDirect(int).

  3. 当您说直到 next 才加载任何本机库Activity时,如果您静态加载库(在 内static { }),则不能保证在第二个 Activity 启动时实际加载该库。它很可能会在之前加载。如果您想检查库何时实际加载,您可以尝试将此方法添加到您的 C 代码中,它应该在加载库时调用。它非常脏,但是,嘿,它有效。你可能会记录一些东西而不是崩溃。

__attribute__((constructor)) void init(void) { int a = *(int *) ((void *) 0); }

关于code内存使用,你应该减少你的代码:)

如果您还没有这样做,请在您的构建类型中设置minifyEnabledtrue,假设您正在使用调试构建检查内存使用情况:

    ...
    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    ...

此外,关闭即时运行(请参阅此处的“注释” )。

于 2018-03-09T17:03:10.190 回答