Статьи

Как захватить кучу дампов из приложения для Android?

Дампы кучи являются жизненно важными артефактами для диагностики связанных с памятью проблем, таких как утечки памяти, проблемы сбора мусора и java.lang.OutOfMemoryError. Они также являются жизненно важными артефактами для оптимизации использования памяти.

В этой статье мы дали несколько различных вариантов захвата дампов кучи из приложений Android. После захвата дампов кучи вы можете использовать отличные инструменты, такие как HeapHero и анализатор кучи Android-студии, для анализа дампов кучи.

Профилировщик памяти

Ниже приведены шаги для захвата дампов кучи из Memory Profiler в студии Android:

а. Запустите приложение и выберите устройство, которое вы хотите профилировать из Android Studio.

б. В вашей Android-студии нажмите View >> Tool Windows >> Android Profiler

с. Будет временная шкала памяти, которая будет ниже временной шкалы ЦП, но выше временной шкалы сети. На этой временной шкале памяти нажмите кнопку загрузки (выделена на рисунке ниже), чтобы создать дамп кучи из приложения Android.

д. Чтобы сохранить дамп кучи в вашей системе, нажмите на выделенный значок на изображении ниже.

е. Выберите место для сохранения сгенерированного файла дампа кучи.

Android Debug Bridge (ADB)

Android Debug Bridge — это инструмент командной строки, который позволяет вам взаимодействовать с устройством. ADB предоставляет различные действия на устройстве, такие как установка и отладка приложений. Он также предоставляет доступ к оболочке Unix для запуска различных команд на устройстве. Вы можете использовать этот инструмент для генерации дампов кучи Android. Запустите оболочку ADB и выполните следующие действия:

а. Определите идентификатор процесса вашего Android-приложения

Первый шаг — определить идентификатор процесса вашего Android-приложения. Вы можете сделать это, выполнив следующую команду:

1
adb shell ps | grep <APP-NAME>

Выше команда вернет подробности о процессе. Второй номер будет PID вашего приложения. Пожалуйста, проверьте скриншот ниже.               

б. Создать дамп кучи:

1
2
3
4
adb shell am dumpheap <PID> <HEAP-DUMP-FILE-PATH> 
 
PID: Your Android App Process Id
HEAP-DUMP-FILE-PATH: Location where heap dump file should be generated

Пример:

1
adb shell am dumpheap 1769 /data/local/tmp/android.hprof

с. Вытащите файл на свою машину

Вышеуказанный шаг сгенерирует файл дампа кучи на устройстве. Для анализа вам нужно вытащить сгенерированный файл на ваш компьютер. Вы делаете это с помощью команды ниже:

1
2
3
adb pull <HEAP-DUMP-FILE-PATH>
 
HEAP-DUMP-FILE-PATH: Location where heap dump file

Пример:

1
adb pull /data/local/tmp/android.hprof

Записать дампы кучи на OutOfMemoryError

Если вы поместите приведенный ниже код в свое приложение, оно будет захватывать дампы кучи всякий раз, когда ваше приложение получает OutOfMemoryError.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class CaptureHeapDumps extends Application {
       private static final String FILE_NAME = "heap-dump.hprof";
       @Override
       public void onCreate() {
          super.onCreate();
 
Thread.currentThread().setUncaughtExceptionHandler(OutOfMemoryException());
 
       }
       @NonNull
       private Thread.UncaughtExceptionHandler OutOfMemoryException() {
               return new Thread.UncaughtExceptionHandler() {
               @Override
               public void uncaughtException(Thread t, Throwable e) {
                  String directory = getApplicationInfo().dataDir;
                  String absolutePath = new File(directory, FILE_NAME)
                         .getAbsolutePath();
                  try {
                      Debug.dumpHprofData(absolutePath);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
               }
        };
    }
}

Это создаст файл дампа кучи в этом месте: /data/user/0/appname/heap-dump.hprof

Смотрите оригинальную статью здесь: Как захватить кучу дампов из приложения для Android? — 3 варианта

Мнения, высказанные участниками Java Code Geeks, являются их собственными.