[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/android/memory-profiling":3,"mdc-rbjrj9-key":869,"mdc--j6vu69-key":880,"mdc-d6fhac-key":896,"mdc-uaxwo0-key":904,"mdc-gswt01-key":912,"mdc-4ws7op-key":934,"mdc--kpyq6b-key":950,"mdc--3250v4-key":965,"mdc-rzu58b-key":995,"related-/guides/android/debugging-overview,/errors/android/oom,/guides/android/garbage-collection":1026},{"id":4,"title":5,"appliesTo":6,"author":10,"body":11,"canonical":798,"code":798,"createdAt":799,"description":800,"difficulty":801,"draft":802,"estimatedTime":803,"extension":804,"faq":805,"howToSteps":818,"howToTotalTime":834,"image":798,"keywords":835,"locale":846,"meta":847,"navigation":848,"path":849,"platform":850,"related":851,"section":855,"seo":856,"severity":798,"stem":857,"summary":858,"tags":859,"twitterCreator":798,"twitterSite":798,"type":867,"updatedAt":799,"__hash__":868},"content_ru/guides/android/memory-profiling.md","Профилирование памяти Android: полное руководство по Android Studio",[7,8,9],"Android Studio Hedgehog (2023.1.1)+","Android 5.0 (API 21)+","Kotlin 1.8+ / Java 11+","FixPedia Team",{"type":12,"value":13,"toc":773},"minimark",[14,19,33,37,40,79,83,128,131,170,174,225,235,239,246,270,273,277,288,293,339,350,355,400,404,415,458,463,504,516,520,535,540,564,568,576,598,605,638,645,677,684,725,732],[15,16,18],"h2",{"id":17},"введение-зачем-это-нужно","Введение / Зачем это нужно",[20,21,22,23,27,28,32],"p",{},"Профилирование памяти — ключевой этап в разработке стабильных Android-приложений. Утечки памяти (memory leaks) приводят к постепенному росту потребления RAM, замедлению работы, а в худшем случае — к крашу с ошибкой ",[24,25,26],"code",{},"OutOfMemoryError",". Встроенный ",[29,30,31],"strong",{},"Memory Profiler"," в Android Studio позволяет визуально отслеживать распределение памяти в реальном времени, делать снимки состояния кучи (Heap Dump) и находить объекты, которые не должны находиться в памяти. Этот гайд проведёт вас через весь процесс от запуска инструмента до интерпретации результатов.",[15,34,36],{"id":35},"требования-подготовка","Требования / Подготовка",[20,38,39],{},"Перед началом убедитесь, что:",[41,42,43,51,58,65,76],"ol",{},[44,45,46,47,50],"li",{},"У вас установлен ",[29,48,49],{},"Android Studio"," версии Hedgehog (2023.1.1) или новее. Инструмент постоянно улучшается.",[44,52,53,54,57],{},"Устройство или эмулятор работает на ",[29,55,56],{},"Android 5.0 (API 21)"," или выше.",[44,59,60,61,64],{},"Приложение собрано в ",[29,62,63],{},"debug-конфигурации"," (с включённой отладочной информацией). Для release-сборок анализ возможен, но сложнее.",[44,66,67,68,71,72,75],{},"В ",[24,69,70],{},"build.gradle"," (module) у вашего приложения включён ",[24,73,74],{},"debuggable true"," для debug-сборок (обычно это по умолчанию).",[44,77,78],{},"Устройство подключено по USB с включённой отладкой по USB, или запущен эмулятор.",[15,80,82],{"id":81},"шаг-1-запустите-profiler-и-подключите-устройство","Шаг 1: Запустите Profiler и подключите устройство",[41,84,85,92,111,117],{},[44,86,87,88,91],{},"Запустите ваше приложение на устройстве или эмуляторе из Android Studio (кнопка ",[24,89,90],{},"Run",").",[44,93,94,95,98,99,102,103,106,107,110],{},"Откройте окно ",[29,96,97],{},"Profiler",": ",[24,100,101],{},"View → Tool Windows → Profiler"," или используйте сочетание клавиш ",[24,104,105],{},"Alt+Shift+F10"," (Windows/Linux) / ",[24,108,109],{},"⌥⇧F10"," (macOS).",[44,112,113,114,91],{},"В верхней части окна Profiler вы увидите список активных процессов. Выберите процесс вашего приложения (обычно с именем пакета, например, ",[24,115,116],{},"com.example.myapp",[44,118,119,120,123,124,127],{},"По умолчанию откроется вкладка ",[29,121,122],{},"CPU",". Переключитесь на вкладку ",[29,125,126],{},"Memory"," (иконка с синим графиком и цифрами).",[20,129,130],{},"На графике вы увидите реальное потребление памяти вашим приложением:",[132,133,134,140,146,152,158,164],"ul",{},[44,135,136,139],{},[29,137,138],{},"Java Heap",": память, управляемая JVM/ART (ваш код).",[44,141,142,145],{},[29,143,144],{},"Native Heap",": память, выделенная через NDK (C/C++ код).",[44,147,148,151],{},[29,149,150],{},"Graphics",": память, используемая для буферов отрисовки.",[44,153,154,157],{},[29,155,156],{},"Stack",": память под стековые фреймы.",[44,159,160,163],{},[29,161,162],{},"Code",": память под скомпилированный код.",[44,165,166,169],{},[29,167,168],{},"Others",": прочее.",[15,171,173],{"id":172},"шаг-2-начните-запись-и-выполните-сценарий","Шаг 2: Начните запись и выполните сценарий",[41,175,176,189,210,216],{},[44,177,178,179,184,185,188],{},"На панели инструментов вкладки Memory нажмите кнопку ",[29,180,181],{},[24,182,183],{},"Record memory allocations"," (иконка с красной точкой внутри кружка). Статус записи изменится на ",[24,186,187],{},"Recording...",".",[44,190,191,194,195],{},[29,192,193],{},"Выполните в приложении действие",", которое, как вы подозреваете, вызывает утечку. Например:\n",[132,196,197,200,207],{},[44,198,199],{},"Откройте и закройте фрагмент/активность несколько раз.",[44,201,202,203,206],{},"Прокрутите список (",[24,204,205],{},"RecyclerView",") с большим количеством элементов.",[44,208,209],{},"Перейдите на другой экран и вернитесь.",[44,211,212,215],{},[29,213,214],{},"Важно",": пытайтесь воспроизвести сценарий, который пользователь мог бы выполнить многократно. Утечка часто проявляется после нескольких итераций.",[44,217,218,219,224],{},"После выполнения действия нажмите кнопку ",[29,220,221],{},[24,222,223],{},"Stop recording"," (та же кнопка, теперь красная). Запись выделений объектов прекратится.",[226,227,228],"blockquote",{},[20,229,230,231,234],{},"💡 ",[29,232,233],{},"Совет",": Не записывайте слишком долго — это может привести к огромному объёму данных и замедлению работы. 30-60 секунд активных действий обычно достаточно.",[15,236,238],{"id":237},"шаг-3-сделайте-heap-dump-для-анализа","Шаг 3: Сделайте Heap Dump для анализа",[20,240,241,242,245],{},"Запись allocations полезна для отслеживания частоты создания объектов, но для поиска утечек нужен ",[29,243,244],{},"Heap Dump"," — полный снимок объектов в куче в конкретный момент времени.",[41,247,248,253,262],{},[44,249,250,251,188],{},"Убедитесь, что вы находитесь на вкладке ",[29,252,126],{},[44,254,255,256,261],{},"Нажмите кнопку ",[29,257,258],{},[24,259,260],{},"Dump Java heap"," (иконка с кучей мусора и стрелкой вниз). Профилер запросит у системы создание дампа.",[44,263,264,265,269],{},"Дождитесь завершения. На экране появится новая вкладка ",[29,266,267],{},[24,268,244],{}," с результатами.",[271,272],"in-article-ad",{},[15,274,276],{"id":275},"шаг-4-проанализируйте-результаты-в-analyzer","Шаг 4: Проанализируйте результаты в Analyzer",[20,278,279,280,282,283,188],{},"Вкладка ",[29,281,244],{}," автоматически открывает анализатор. По умолчанию вы видите таблицу ",[29,284,285],{},[24,286,287],{},"Classes",[20,289,290],{},[29,291,292],{},"Как читать таблицу:",[132,294,295,303,311,319],{},[44,296,297,302],{},[29,298,299],{},[24,300,301],{},"Class"," — имя класса объекта.",[44,304,305,310],{},[29,306,307],{},[24,308,309],{},"Instance Count"," — количество экземпляров этого класса в куче на момент дампа.",[44,312,313,318],{},[29,314,315],{},[24,316,317],{},"Size"," — общий объём памяти, занятый всеми экземплярами этого класса (в КБ/МБ).",[44,320,321,326,327,330,331,335,336,338],{},[29,322,323],{},[24,324,325],{},"Retained Size"," — ",[29,328,329],{},"самый важный показатель",". Это объём памяти, который будет освобождён, если ",[332,333,334],"em",{},"все"," объекты этого класса (и те, на которые они ссылаются) будут удалены. Большой ",[24,337,325],{}," у класса, который не должен быть в памяти — верный признак утечки.",[20,340,341,344,345,349],{},[29,342,343],{},"Первое действие:"," отсортируйте таблицу по столбцу ",[29,346,347],{},[24,348,325],{}," (по убыванию). Вверху окажутся классы, удерживающие наибольшие объёмы памяти.",[20,351,352],{},[29,353,354],{},"Что ищем:",[132,356,357,375,382],{},[44,358,359,360,363,364,363,367,370,371,374],{},"Классы вашего приложения (например, ",[24,361,362],{},"MyActivity",", ",[24,365,366],{},"MyAdapter",[24,368,369],{},"MyViewModel","), которые ",[29,372,373],{},"не должны"," существовать после закрытия экрана/фрагмента.",[44,376,377,378,381],{},"Классы из библиотек, известные своими утечками (например, старые версии ",[24,379,380],{},"androidx.lifecycle.ViewModel"," при неправильной конфигурации).",[44,383,384,385,363,388,363,391,363,394,363,397,188],{},"Большое количество экземпляров ",[24,386,387],{},"Bitmap",[24,389,390],{},"Context",[24,392,393],{},"View",[24,395,396],{},"Activity",[24,398,399],{},"Fragment",[15,401,403],{"id":402},"шаг-5-исследуйте-пути-до-gc-root","Шаг 5: Исследуйте пути до GC Root",[20,405,406,407,410,411,414],{},"Нашли подозрительный класс? Теперь нужно понять, ",[29,408,409],{},"почему"," он не удаляется сборщиком мусора (Garbage Collector). Для этого ищут ",[29,412,413],{},"GC Root"," — объект, который напрямую или через цепочку ссылок удерживает ваш объект в памяти.",[41,416,417,427,435,451],{},[44,418,419,420,422,423,426],{},"В таблице ",[24,421,287],{}," найдите подозрительный класс и ",[29,424,425],{},"выделите его"," (кликните на строку).",[44,428,429,430,188],{},"На панели справа (или в контекстном меню) выберите ",[29,431,432],{},[24,433,434],{},"Show Path to GC Roots",[44,436,437,438,443,444,447,448,188],{},"Появится диалоговое окно с опциями. Выберите ",[29,439,440],{},[24,441,442],{},"Show all paths"," (или ",[24,445,446],{},"Show soft references",", если подозреваете кэши). Нажмите ",[24,449,450],{},"OK",[44,452,453,454,457],{},"Анализатор построит ",[29,455,456],{},"дерево ссылок"," от GC Root (вверху) к вашему объекту (внизу).",[20,459,460],{},[29,461,462],{},"Как интерпретировать:",[132,464,465,483,493],{},[44,466,467,469,470,363,473,363,476,479,480,91],{},[29,468,413],{}," — это обычно системный объект (например, ",[24,471,472],{},"android.app.ActivityThread",[24,474,475],{},"java.lang.Thread",[24,477,478],{},"android.view.ViewRootImpl","), или статическое поле вашего класса (",[24,481,482],{},"MyClass.sStaticField",[44,484,485,486,492],{},"Ищите в цепочке ",[29,487,488,489,491],{},"контекст (",[24,490,390],{},") активности",", который, например, хранится в статическом поле или долгоживущем синглтоне. Это классическая утечка активности.",[44,494,495,496,499,500,503],{},"Если в цепочке есть ваш ",[24,497,498],{},"Singleton"," или ",[24,501,502],{},"Object"," из кэша — значит, он не очищается при уничтожении экрана.",[226,505,506],{},[20,507,508,509,511,512,515],{},"⚠️ ",[29,510,214],{},": Не все пути до GC Root — это утечки. Если объект действительно нужен для работы приложения (например, сервис), его наличие оправдано. Ищите объекты, которые ",[332,513,514],{},"должны"," были быть уничтожены (закрытые активности, фрагменты).",[15,517,519],{"id":518},"проверка-результата","Проверка результата",[20,521,522,523,526,527,530,531,534],{},"После внесения исправлений в код (например, очистки ссылок в ",[24,524,525],{},"onDestroy()",", использования ",[24,528,529],{},"WeakReference",", замены статических контекстов на ",[24,532,533],{},"ApplicationContext",") повторите шаги 1-4.",[20,536,537],{},[29,538,539],{},"Критерии успеха:",[41,541,542,549,555,561],{},[44,543,544,545,548],{},"На графике Memory Profiler после закрытия проблемного экрана память (Java Heap) возвращается к ",[29,546,547],{},"базовому уровню",", а не растёт.",[44,550,551,552,554],{},"В новом Heap Dump количество экземпляров подозрительного класса (",[24,553,309],{},") значительно сократилось или равно нулю.",[44,556,557,558,560],{},"В анализаторе ",[24,559,325],{}," для этого класса стал близок к нулю.",[44,562,563],{},"Путь до GC Root для этого класса больше не существует или ведёт к объекту, который закономерно живёт всё время работы приложения.",[15,565,567],{"id":566},"возможные-проблемы","Возможные проблемы",[569,570,572,573],"h3",{"id":571},"_1-profiler-не-показывает-процесс-приложения","1. ",[29,574,575],{},"Profiler не показывает процесс приложения",[132,577,578,584],{},[44,579,580,583],{},[29,581,582],{},"Причина",": Приложение собрано в release-конфигурации без debuggable флага, или устройство не авторизовано для отладки.",[44,585,586,589,590,593,594,597],{},[29,587,588],{},"Решение",": Запустите debug-сборку. На устройстве в ",[24,591,592],{},"Настройки → Для разработчиков"," убедитесь, что включена ",[29,595,596],{},"Отладка по USB"," и вы подтвердили RSA-ключ компьютера.",[569,599,601,602],{"id":600},"_2-heap-dump-создаётся-очень-долго-или-падает-с-ошибкой","2. ",[29,603,604],{},"Heap Dump создаётся очень долго или падает с ошибкой",[132,606,607,612],{},[44,608,609,611],{},[29,610,582],{},": Слишком большое количество объектов в куче (десятки тысяч), нехватка памяти на компьютере для анализа.",[44,613,614,616,617],{},[29,615,588],{},":\n",[132,618,619,622,625,628],{},[44,620,621],{},"Упростите сценарий, делайте дамп раньше.",[44,623,624],{},"Закройте другие тяжёлые приложения в эмуляторе/устройстве.",[44,626,627],{},"Увеличьте оперативную память, выделенную эмулятору (в AVD Manager).",[44,629,630,631,634,635,91],{},"Используйте фильтры в анализаторе (поле ",[24,632,633],{},"Filter","), чтобы смотреть только ваши пакеты (например, ",[24,636,637],{},"com.example",[569,639,641,642],{"id":640},"_3-не-могу-найти-проблемный-класс-в-списке-только-системные","3. ",[29,643,644],{},"Не могу найти проблемный класс — в списке только системные",[132,646,647,652],{},[44,648,649,651],{},[29,650,582],{},": Утечка может быть в нативном коде (Native Heap) или в объектах, которые Profiler не может корректно отобразить (например, из-за прозрачных обёрток).",[44,653,654,616,656],{},[29,655,588],{},[132,657,658,667,674],{},[44,659,660,661,666],{},"Переключитесь на вкладку ",[29,662,663],{},[24,664,665],{},"Native"," в Profiler и посмотрите рост native heap.",[44,668,669,670,673],{},"Используйте ",[24,671,672],{},"adb shell dumpsys meminfo \u003Cpackage_name>"," в терминале для более низкоуровневого отчёта.",[44,675,676],{},"Если используете библиотеки с нативным кодом (например, OpenGL, FFmpeg), проверьте их документацию на предмет известных утечек.",[569,678,680,681],{"id":679},"_4-после-исправления-утечки-график-памяти-всё-равно-растёт","4. ",[29,682,683],{},"После исправления утечки график памяти всё равно растёт",[132,685,686,694],{},[44,687,688,690,691,91],{},[29,689,582],{},": У вас не одна, а несколько утечек, или рост связан с закономерным кэшированием данных (например, ",[24,692,693],{},"LruCache",[44,695,696,616,698],{},[29,697,588],{},[132,699,700,707,714],{},[44,701,702,703,706],{},"Сравните несколько Heap Dumps, сделанных с интервалом. Посмотрите, какие классы ",[332,704,705],{},"увеличиваются"," в количестве между дампами.",[44,708,709,710,713],{},"Проверьте, не является ли рост линейным и предсказуемым (например, добавление элементов в ",[24,711,712],{},"ArrayList"," без очистки). Это может быть не утечкой, а бизнес-логикой.",[44,715,716,717,720,721,724],{},"Проанализируйте ",[24,718,719],{},"Allocation Tracker"," (кнопка ",[24,722,723],{},"Record allocations","), чтобы увидеть, где создаются новые объекты.",[569,726,728,729],{"id":727},"_5-путь-до-gc-root-ведёт-через-системный-класс-который-я-не-контролирую","5. ",[29,730,731],{},"Путь до GC Root ведёт через системный класс, который я не контролирую",[132,733,734,743],{},[44,735,736,738,739,742],{},[29,737,582],{},": Некоторые системные классы (например, ",[24,740,741],{},"InputMethodManager",") исторически содержат утечки через неочищаемые ссылки.",[44,744,745,616,747],{},[29,746,588],{},[132,748,749,757,770],{},[44,750,751,752,499,754,756],{},"Проверьте, не держите ли вы сами ссылку на ",[24,753,393],{},[24,755,390],{}," в статическом поле или долгоживущем объекте.",[44,758,759,760,762,763,766,767,188],{},"Для известных системных утечек есть проверенные паттерны: например, в ",[24,761,525],{}," активности вызывать ",[24,764,765],{},"inputMethodManager.isActive = false"," или очищать фокус у ",[24,768,769],{},"EditText",[44,771,772],{},"Поищите конкретный случай (класс + \"memory leak\") в документации Android или на Stack Overflow.",{"title":774,"searchDepth":775,"depth":775,"links":776},"",2,[777,778,779,780,781,782,783,784,785],{"id":17,"depth":775,"text":18},{"id":35,"depth":775,"text":36},{"id":81,"depth":775,"text":82},{"id":172,"depth":775,"text":173},{"id":237,"depth":775,"text":238},{"id":275,"depth":775,"text":276},{"id":402,"depth":775,"text":403},{"id":518,"depth":775,"text":519},{"id":566,"depth":775,"text":567,"children":786},[787,790,792,794,796],{"id":571,"depth":788,"text":789},3,"1. Profiler не показывает процесс приложения",{"id":600,"depth":788,"text":791},"2. Heap Dump создаётся очень долго или падает с ошибкой",{"id":640,"depth":788,"text":793},"3. Не могу найти проблемный класс — в списке только системные",{"id":679,"depth":788,"text":795},"4. После исправления утечки график памяти всё равно растёт",{"id":727,"depth":788,"text":797},"5. Путь до GC Root ведёт через системный класс, который я не контролирую",null,"2026-02-15 20:21:43","Узнайте, как находить и устранять утечки памяти в Android-приложениях с помощью Profiler в Android Studio. Пошаговая инструкция с примерами и скриншотами за 10 минут.","medium",false,"15-20 мин","md",[806,809,812,815],{"question":807,"answer":808},"Как часто нужно делать Heap Dump для поиска утечек?","Достаточно сделать снимок в момент, когда приложение уже работало какое-то время и вы подозреваете рост потребления памяти. Для хронических утечек полезно делать несколько дампов с интервалом в несколько минут и сравнивать их.",{"question":810,"answer":811},"Можно ли профилировать память на release-сборке?","Да, но для отладки утечек лучше использовать debug-сборку, так как в ней больше отладочной информации. Для release-сборки можно использовать `adb shell dumpsys meminfo \u003Cpackage_name>`, но это менее наглядно.",{"question":813,"answer":814},"Разница между Memory Profiler и Allocation Tracker?","Memory Profiler показывает общую картину использования памяти в реальном времени. Allocation Tracker (встроенный в Profiler) фиксирует каждое выделение объекта, что помогает найти конкретное место в коде, где создаётся подозрительный объект.",{"question":816,"answer":817},"Почему после GC память не опускается до нуля?","Это нормально. После сборки мусора в памяти остаются неизбежные объекты ядра Android, ваше приложение и его контексты. Проблема — в постоянном росте этого базового уровня (утечка), а не в его величине.",[819,822,825,828,831],{"name":820,"text":821},"Запустите Profiler и подключите устройство","Откройте Android Studio, запустите приложение на устройстве или эмуляторе. Перейдите в `View → Tool Windows → Profiler` (или `Alt+Shift+F10`). В списке процессов выберите ваш запущенный апк.",{"name":823,"text":824},"Начните запись и выполните сценарий","В панели Profiler нажмите кнопку `Record memory allocations` (иконка с кружком и точкой). Выполните в приложении действие, которое, по вашему мнению, вызывает утечку (например, многократное открытие/закрытие экрана).",{"name":826,"text":827},"Сделайте Heap Dump для анализа","После выполнения действия нажмите кнопку `Dump Java heap` (иконка с кучей мусора). Profiler создаст снимок состояния кучи. Этот процесс может занять несколько секунд.",{"name":829,"text":830},"Проанализируйте результаты в Analyzer","После создания дампа откроется вкладка `Heap Dump`. Изучите список классов, отсортированный по количеству экземпляров (`Instance Count`) или объёму (`Size`). Ищите классы, которые не должны были оставаться в памяти.",{"name":832,"text":833},"Исследуйте пути до GC Root","Выберите подозрительный класс, нажмите `Show in Dominator Tree` или `Show Retained Size`. В правой панели нажмите `Show Path to GC Roots` (через контекстное меню). Это покажет цепочку ссылок, не дающих объекту быть удалённым сборщиком мусора.","PT15M",[836,837,838,839,840,841,842,843,844,845],"профилирование памяти android","утечка памяти android studio","android memory profiler","анализ кучи heap dump android","как найти утечку памяти в приложении","оптимизация памяти android","memory profiling android studio","dump heap android","gc root android","леак детектор android","ru_RU",{},true,"/guides/android/memory-profiling","android",[852,853,854],"/guides/android/debugging-overview","/errors/android/oom","/guides/android/garbage-collection","Гайды Android",{"title":5,"description":800},"guides/android/memory-profiling","В этом гайде вы научитесь использовать встроенный Profiler в Android Studio для анализа использования памяти, обнаружения утечек и оптимизации работы вашего Android-приложения.",[850,860,861,862,863,864,865,866],"производительность","memory","android-studio","debug","profiling","kotlin","java","guide","SvPl12BI_yTXv6F0N5De95WNeG6UPhaa_BueHscWZBM",{"data":870,"body":871},{},{"type":872,"children":873},"root",[874],{"type":875,"tag":20,"props":876,"children":877},"element",{},[878],{"type":879,"value":808},"text",{"data":881,"body":882},{},{"type":872,"children":883},[884],{"type":875,"tag":20,"props":885,"children":886},{},[887,889,894],{"type":879,"value":888},"Да, но для отладки утечек лучше использовать debug-сборку, так как в ней больше отладочной информации. Для release-сборки можно использовать ",{"type":875,"tag":24,"props":890,"children":892},{"className":891},[],[893],{"type":879,"value":672},{"type":879,"value":895},", но это менее наглядно.",{"data":897,"body":898},{},{"type":872,"children":899},[900],{"type":875,"tag":20,"props":901,"children":902},{},[903],{"type":879,"value":814},{"data":905,"body":906},{},{"type":872,"children":907},[908],{"type":875,"tag":20,"props":909,"children":910},{},[911],{"type":879,"value":817},{"data":913,"body":914},{},{"type":872,"children":915},[916],{"type":875,"tag":20,"props":917,"children":918},{},[919,921,926,927,932],{"type":879,"value":920},"Откройте Android Studio, запустите приложение на устройстве или эмуляторе. Перейдите в ",{"type":875,"tag":24,"props":922,"children":924},{"className":923},[],[925],{"type":879,"value":101},{"type":879,"value":443},{"type":875,"tag":24,"props":928,"children":930},{"className":929},[],[931],{"type":879,"value":105},{"type":879,"value":933},"). В списке процессов выберите ваш запущенный апк.",{"data":935,"body":936},{},{"type":872,"children":937},[938],{"type":875,"tag":20,"props":939,"children":940},{},[941,943,948],{"type":879,"value":942},"В панели Profiler нажмите кнопку ",{"type":875,"tag":24,"props":944,"children":946},{"className":945},[],[947],{"type":879,"value":183},{"type":879,"value":949}," (иконка с кружком и точкой). Выполните в приложении действие, которое, по вашему мнению, вызывает утечку (например, многократное открытие/закрытие экрана).",{"data":951,"body":952},{},{"type":872,"children":953},[954],{"type":875,"tag":20,"props":955,"children":956},{},[957,958,963],{"type":879,"value":218},{"type":875,"tag":24,"props":959,"children":961},{"className":960},[],[962],{"type":879,"value":260},{"type":879,"value":964}," (иконка с кучей мусора). Profiler создаст снимок состояния кучи. Этот процесс может занять несколько секунд.",{"data":966,"body":967},{},{"type":872,"children":968},[969],{"type":875,"tag":20,"props":970,"children":971},{},[972,974,979,981,986,988,993],{"type":879,"value":973},"После создания дампа откроется вкладка ",{"type":875,"tag":24,"props":975,"children":977},{"className":976},[],[978],{"type":879,"value":244},{"type":879,"value":980},". Изучите список классов, отсортированный по количеству экземпляров (",{"type":875,"tag":24,"props":982,"children":984},{"className":983},[],[985],{"type":879,"value":309},{"type":879,"value":987},") или объёму (",{"type":875,"tag":24,"props":989,"children":991},{"className":990},[],[992],{"type":879,"value":317},{"type":879,"value":994},"). Ищите классы, которые не должны были оставаться в памяти.",{"data":996,"body":997},{},{"type":872,"children":998},[999],{"type":875,"tag":20,"props":1000,"children":1001},{},[1002,1004,1010,1011,1017,1019,1024],{"type":879,"value":1003},"Выберите подозрительный класс, нажмите ",{"type":875,"tag":24,"props":1005,"children":1007},{"className":1006},[],[1008],{"type":879,"value":1009},"Show in Dominator Tree",{"type":879,"value":499},{"type":875,"tag":24,"props":1012,"children":1014},{"className":1013},[],[1015],{"type":879,"value":1016},"Show Retained Size",{"type":879,"value":1018},". В правой панели нажмите ",{"type":875,"tag":24,"props":1020,"children":1022},{"className":1021},[],[1023],{"type":879,"value":434},{"type":879,"value":1025}," (через контекстное меню). Это покажет цепочку ссылок, не дающих объекту быть удалённым сборщиком мусора.",[1027,1855,2209],{"id":1028,"title":1029,"appliesTo":1030,"author":10,"body":1034,"canonical":798,"code":798,"createdAt":1792,"description":1793,"difficulty":801,"draft":802,"estimatedTime":1794,"extension":804,"faq":1795,"howToSteps":1808,"howToTotalTime":1827,"image":798,"keywords":1828,"locale":846,"meta":1839,"navigation":848,"path":852,"platform":850,"related":1840,"section":1844,"seo":1845,"severity":801,"stem":1846,"summary":1847,"tags":1848,"twitterCreator":798,"twitterSite":798,"type":867,"updatedAt":1792,"__hash__":1854},"content_ru/guides/android/debugging-overview.md","Освойте отладку Android: от ADB до Android Studio",[1031,1032,1033],"Android 5.0+","Android Studio Arctic Fox (2020.3.1)+","ADB 1.0.41+",{"type":12,"value":1035,"toc":1772},[1036,1038,1052,1054,1057,1110,1112,1116,1119,1150,1162,1166,1169,1173,1224,1228,1315,1319,1322,1383,1387,1427,1431,1434,1520,1524,1527,1602,1604,1607,1624,1627,1629,1636,1641,1692,1696,1700,1735,1739,1743,1768],[15,1037,18],{"id":17},[20,1039,1040,1041,363,1044,1047,1048,1051],{},"Отладка — ключевой этап разработки Android-приложений. Без эффективного использования инструментов отладки поиск и исправление ошибок превращаются в хаотичный процесс, отнимающий часы. Это руководство даст вам системное понимание основных инструментов: ",[29,1042,1043],{},"ADB",[29,1045,1046],{},"Logcat"," и ",[29,1049,1050],{},"встроенного отладчика Android Studio",". Вы сможете быстро находить причины падений, анализировать поток данных и тестировать код в реальных условиях на устройстве.",[15,1053,36],{"id":35},[20,1055,1056],{},"Перед началом убедитесь, что у вас установлено:",[41,1058,1059,1070,1083,1089,1107],{},[44,1060,1061,1063,1064,1047,1067,188],{},[29,1062,49],{}," (версия Arctic Fox 2020.3.1 или новее) с компонентами ",[29,1065,1066],{},"Android SDK",[29,1068,1069],{},"Android SDK Platform-Tools",[44,1071,1072,1075,1076,1079,1080,91],{},[29,1073,1074],{},"Устройство на Android"," (версии 5.0 и выше) с включенной опцией ",[29,1077,1078],{},"\"Отладка по USB\""," (находится в ",[332,1081,1082],{},"Настройки → Параметры разработчика",[44,1084,1085,1088],{},[29,1086,1087],{},"USB-кабель"," (желательно качественный, поддерживающий передачу данных).",[44,1090,1091,1092,1095,1096,1099,1100,1103,1104,188],{},"Для ",[29,1093,1094],{},"Windows",": установленные ",[29,1097,1098],{},"драйверы USB"," для вашего устройства. Для ",[29,1101,1102],{},"Linux",": настроенные ",[29,1105,1106],{},"udev-правила",[44,1108,1109],{},"Базовые знания работы с терминалом/командной строкой.",[271,1111],{},[15,1113,1115],{"id":1114},"шаг-1-включите-отладку-по-usb-на-устройстве","Шаг 1: Включите отладку по USB на устройстве",[20,1117,1118],{},"На самом устройстве необходимо активировать режим разработчика и разрешить отладку.",[41,1120,1121,1127,1138,1145],{},[44,1122,1123,1124,188],{},"Перейдите в ",[29,1125,1126],{},"Настройки → Об устройстве",[44,1128,1129,1130,1133,1134,1137],{},"Найдите пункт ",[29,1131,1132],{},"\"Номер сборки\""," и нажмите на него ",[29,1135,1136],{},"7 раз",". Появится уведомление \"Вы стали разработчиком!\".",[44,1139,1140,1141,1144],{},"Вернитесь в главное меню настроек и найдите новый раздел ",[29,1142,1143],{},"\"Параметры разработчика\""," (или \"Для разработчиков\").",[44,1146,1147,1148,188],{},"Внутри включите переключатель ",[29,1149,1078],{},[226,1151,1152],{},[20,1153,508,1154,1157,1158,1161],{},[29,1155,1156],{},"Важно:"," При первом подключении устройства к компьютеру на экране появится диалоговое окно с запросом ",[29,1159,1160],{},"\"Разрешить отладку по USB?\"",". Обязательно поставьте галочку \"Всегда разрешать с этого компьютера\" и нажмите \"OK\".",[15,1163,1165],{"id":1164},"шаг-2-подготовьте-компьютер-установите-драйверыправила","Шаг 2: Подготовьте компьютер: установите драйверы/правила",[20,1167,1168],{},"Без правильных драйверов компьютер не увидит устройство.",[569,1170,1172],{"id":1171},"для-windows","Для Windows:",[41,1174,1175,1200,1210,1213],{},[44,1176,1177,1178],{},"Скачайте драйверы:\n",[132,1179,1180,1194],{},[44,1181,1182,1185,1186,1193],{},[29,1183,1184],{},"Универсальные:"," ",[1187,1188,1192],"a",{"href":1189,"rel":1190},"https://developer.android.com/studio/run/win-usb",[1191],"nofollow","Google USB Driver"," (через менеджер SDK Android Studio).",[44,1195,1196,1199],{},[29,1197,1198],{},"Производительские:"," Драйверы с сайта Samsung (Kies), Xiaomi (Mi PC Suite), Huawei и т.д.",[44,1201,1202,1203,1206,1207,91],{},"Установите драйвер через ",[29,1204,1205],{},"Диспетчер устройств"," (Win + R → ",[24,1208,1209],{},"devmgmt.msc",[44,1211,1212],{},"Найдите неизвестное устройство (обычно с желтым восклицательным знаком) в разделе \"Другие устройства\" или \"Android Device\".",[44,1214,1215,1216,1219,1220,1223],{},"Щелкните правой кнопкой → ",[29,1217,1218],{},"\"Обновить драйвер\""," → ",[29,1221,1222],{},"\"Выполнить поиск драйверов на этом компьютере\""," → укажите папку с распакованным драйвером.",[569,1225,1227],{"id":1226},"для-linux-ubuntudebian","Для Linux (Ubuntu/Debian):",[41,1229,1230,1257,1272],{},[44,1231,1232,1233],{},"Создайте файл правил:\n",[1234,1235,1239],"pre",{"className":1236,"code":1237,"language":1238,"meta":774,"style":774},"language-bash shiki shiki-themes github-light github-dark","sudo gedit /etc/udev/rules.d/51-android.rules\n","bash",[24,1240,1241],{"__ignoreMap":774},[1242,1243,1246,1250,1254],"span",{"class":1244,"line":1245},"line",1,[1242,1247,1249],{"class":1248},"sScJk","sudo",[1242,1251,1253],{"class":1252},"sZZnC"," gedit",[1242,1255,1256],{"class":1252}," /etc/udev/rules.d/51-android.rules\n",[44,1258,1259,1260,1267,1268],{},"Вставьте правила для вашего производителя. Например, для общих устройств Google:\n",[1234,1261,1265],{"className":1262,"code":1264,"language":879},[1263],"language-text","SUBSYSTEM==\"usb\", ATTR{idVendor}==\"0bb4\", MODE=\"0666\", GROUP=\"plugdev\"\n",[24,1266,1264],{"__ignoreMap":774},"\nПолный список vendor ID: ",[1187,1269,1270],{"href":1270,"rel":1271},"https://developer.android.com/studio/run/linux-usb",[1191],[44,1273,1274,1275],{},"Установите права и перезагрузите udev:\n",[1234,1276,1278],{"className":1236,"code":1277,"language":1238,"meta":774,"style":774},"sudo chmod a+r /etc/udev/rules.d/51-android.rules\nsudo udevadm control --reload-rules\nsudo udevadm trigger\n",[24,1279,1280,1292,1306],{"__ignoreMap":774},[1242,1281,1282,1284,1287,1290],{"class":1244,"line":1245},[1242,1283,1249],{"class":1248},[1242,1285,1286],{"class":1252}," chmod",[1242,1288,1289],{"class":1252}," a+r",[1242,1291,1256],{"class":1252},[1242,1293,1294,1296,1299,1302],{"class":1244,"line":775},[1242,1295,1249],{"class":1248},[1242,1297,1298],{"class":1252}," udevadm",[1242,1300,1301],{"class":1252}," control",[1242,1303,1305],{"class":1304},"sj4cs"," --reload-rules\n",[1242,1307,1308,1310,1312],{"class":1244,"line":788},[1242,1309,1249],{"class":1248},[1242,1311,1298],{"class":1252},[1242,1313,1314],{"class":1252}," trigger\n",[15,1316,1318],{"id":1317},"шаг-3-проверьте-подключение-устройства-через-adb","Шаг 3: Проверьте подключение устройства через ADB",[20,1320,1321],{},"Теперь нужно убедиться, что связь установлена.",[41,1323,1324,1335,1349,1365],{},[44,1325,1326,1327,1330,1331,1334],{},"Откройте ",[29,1328,1329],{},"терминал"," (Linux/macOS) или ",[29,1332,1333],{},"Command Prompt/PowerShell"," (Windows).",[44,1336,1337,1338,1341,1342,1345,1346,188],{},"Перейдите в папку с платформ-тулз (обычно ",[24,1339,1340],{},"~/Library/Android/sdk/platform-tools/"," на macOS или ",[24,1343,1344],{},"C:\\Users\\\u003CUser>\\AppData\\Local\\Android\\Sdk\\platform-tools\\"," на Windows) или добавьте её в ",[29,1347,1348],{},"PATH",[44,1350,1351,1352],{},"Выполните команду:\n",[1234,1353,1355],{"className":1236,"code":1354,"language":1238,"meta":774,"style":774},"adb devices\n",[24,1356,1357],{"__ignoreMap":774},[1242,1358,1359,1362],{"class":1244,"line":1245},[1242,1360,1361],{"class":1248},"adb",[1242,1363,1364],{"class":1252}," devices\n",[44,1366,1367,1368,1374,1375,1378,1379,1382],{},"Ожидаемый вывод:\n",[1234,1369,1372],{"className":1370,"code":1371,"language":879},[1263],"List of devices attached\n0123456789ABCDEF    device\n",[24,1373,1371],{"__ignoreMap":774},"\nЕсли вместо ",[24,1376,1377],{},"device"," стоит ",[24,1380,1381],{},"unauthorized",", проверьте диалог на устройстве. Если устройство не отображается — вернитесь к шагу 2.",[15,1384,1386],{"id":1385},"шаг-4-настройте-проект-в-android-studio","Шаг 4: Настройте проект в Android Studio",[41,1388,1389,1392,1404,1410,1420],{},[44,1390,1391],{},"Откройте ваш проект в Android Studio.",[44,1393,1394,1395,1397,1398,1047,1401,188],{},"Убедитесь, что в файле ",[24,1396,70],{}," (уровня модуля) указана актуальная версия ",[29,1399,1400],{},"compileSdk",[29,1402,1403],{},"minSdk",[44,1405,1406,1407,188],{},"На панели инструментов вверху справа найдите выпадающий список ",[29,1408,1409],{},"\"Select Deployment Target\"",[44,1411,1412,1413,1416,1417,188],{},"В открывшемся окне ваше устройство должно отобразиться в разделе ",[29,1414,1415],{},"\"Connected Devices\"",". Выберите его и нажмите ",[29,1418,1419],{},"\"OK\"",[44,1421,1422,1423,1426],{},"Для отладки нажмите кнопку ",[29,1424,1425],{},"\"Debug\""," (иконка жука). Приложение установится и запустится в режиме отладки.",[15,1428,1430],{"id":1429},"шаг-5-используйте-logcat-для-анализа-логов","Шаг 5: Используйте Logcat для анализа логов",[20,1432,1433],{},"Logcat — ваш главный источник информации о том, что происходит в системе и приложении.",[41,1435,1436,1442,1487,1505],{},[44,1437,1438,1439,188],{},"В Android Studio откройте ",[29,1440,1441],{},"View → Tool Windows → Logcat",[44,1443,1444,1445],{},"В верхней части окна Logcat выберите:\n",[132,1446,1447,1453,1470],{},[44,1448,1449,1452],{},[29,1450,1451],{},"Устройство:"," ваше подключенное устройство.",[44,1454,1455,1458,1459,1462,1463,499,1466,1469],{},[29,1456,1457],{},"Процесс:"," процесс вашего приложения (обычно ",[24,1460,1461],{},"com.example.yourapp","). Можно выбрать ",[24,1464,1465],{},"\u003Cyour_package_name>",[24,1467,1468],{},"No Filters"," для всех.",[44,1471,1472,1475,1476,499,1479,1482,1483,1486],{},[29,1473,1474],{},"Уровень логирования:"," установите ",[24,1477,1478],{},"Debug",[24,1480,1481],{},"Verbose"," для максимальной детализации, ",[24,1484,1485],{},"Error"," для только ошибок.",[44,1488,1489,1490],{},"Чтобы быстро найти логи вашего приложения, используйте фильтр:\n",[132,1491,1492,1499],{},[44,1493,1494,1495,1498],{},"По тегу (Tag): введите ",[24,1496,1497],{},"tag:MyAppTag"," (если в коде вы используете конкретный тег).",[44,1500,1501,1502,188],{},"По пакету: введите ",[24,1503,1504],{},"package:com.example.yourapp",[44,1506,1507,1508,1511,1512,1515,1516,1519],{},"Ищите строки с ",[24,1509,1510],{},"E/"," (Error), ",[24,1513,1514],{},"W/"," (Warn) или ",[24,1517,1518],{},"AndroidRuntime"," (для необработанных исключений). Нажмите на строку с ошибкой — Android Studio перейдет в соответствующую строку кода (если исходники доступны).",[15,1521,1523],{"id":1522},"шаг-6-запустите-приложение-в-режиме-отладки","Шаг 6: Запустите приложение в режиме отладки",[20,1525,1526],{},"Это основной способ пошагового анализа.",[41,1528,1529,1536,1541,1547,1570,1599],{},[44,1530,1531,1532,1535],{},"В редакторе кода установите ",[29,1533,1534],{},"точки останова (breakpoints)",": кликните на сером поле слева от номера строки, где хотите остановить выполнение (появится красный кружок).",[44,1537,255,1538,1540],{},[29,1539,1425],{}," (жучок) на панели инструментов.",[44,1542,1543,1544,188],{},"Приложение запустится на устройстве. Как только выполнение дойдет до точки останова, оно ",[29,1545,1546],{},"приостановится",[44,1548,1549,1550],{},"На нижней панели появится окно отладчика:\n",[132,1551,1552,1558,1564],{},[44,1553,1554,1557],{},[29,1555,1556],{},"Frames:"," стек вызовов.",[44,1559,1560,1563],{},[29,1561,1562],{},"Variables:"," текущие значения переменных в контексте.",[44,1565,1566,1569],{},[29,1567,1568],{},"Watches:"," добавьте выражение для отслеживания.",[44,1571,1572,1573],{},"Используйте кнопки управления выполнением:\n",[132,1574,1575,1581,1587,1593],{},[44,1576,1577,1580],{},[29,1578,1579],{},"Resume (F9):"," продолжить до следующей точки останова.",[44,1582,1583,1586],{},[29,1584,1585],{},"Step Over (F8):"," выполнить текущую строку и перейти к следующей.",[44,1588,1589,1592],{},[29,1590,1591],{},"Step Into (F7):"," войти в метод, вызванный на текущей строке.",[44,1594,1595,1598],{},[29,1596,1597],{},"Step Out (Shift+F8):"," выйти из текущего метода.",[44,1600,1601],{},"Вы можете изменять значения переменных прямо в отладчике для тестирования разных сценариев.",[15,1603,519],{"id":518},[20,1605,1606],{},"После выполнения шагов вы должны:",[41,1608,1609,1615,1618,1621],{},[44,1610,1611,1612,188],{},"Видеть свое устройство в списке ",[24,1613,1614],{},"adb devices",[44,1616,1617],{},"Успешно запускать приложение на устройстве из Android Studio.",[44,1619,1620],{},"Видеть логи своего приложения в Logcat, отфильтрованные по пакету.",[44,1622,1623],{},"При постановке точек останова — приостанавливать выполнение кода и изучать состояние переменных.",[20,1625,1626],{},"Если все пункты выполняются — среда отладки настроена корректно.",[15,1628,567],{"id":566},[569,1630,1632,1633,1635],{"id":1631},"проблема-устройство-не-отображается-в-adb-devices-или-в-android-studio","Проблема: Устройство не отображается в ",[24,1634,1614],{}," или в Android Studio.",[20,1637,1638],{},[29,1639,1640],{},"Решение:",[132,1642,1643,1646,1654,1685],{},[44,1644,1645],{},"Переподключите USB-кабель, попробуйте другой порт.",[44,1647,1648,1649,1651,1652,188],{},"На устройстве откройте ",[29,1650,1082],{}," и выключите/включите ",[29,1653,1078],{},[44,1655,1656,1657,1659,1660],{},"Перезагрузите ",[24,1658,1361],{}," сервер:\n",[1234,1661,1663],{"className":1236,"code":1662,"language":1238,"meta":774,"style":774},"adb kill-server\nadb start-server\nadb devices\n",[24,1664,1665,1672,1679],{"__ignoreMap":774},[1242,1666,1667,1669],{"class":1244,"line":1245},[1242,1668,1361],{"class":1248},[1242,1670,1671],{"class":1252}," kill-server\n",[1242,1673,1674,1676],{"class":1244,"line":775},[1242,1675,1361],{"class":1248},[1242,1677,1678],{"class":1252}," start-server\n",[1242,1680,1681,1683],{"class":1244,"line":788},[1242,1682,1361],{"class":1248},[1242,1684,1364],{"class":1252},[44,1686,1687,1688,1691],{},"Для Windows: проверьте в ",[29,1689,1690],{},"Диспетчере устройств",", что устройство определяется как \"Android Composite ADB Interface\" без ошибок. Обновите драйвер вручную.",[569,1693,1695],{"id":1694},"проблема-в-logcat-нет-логов-моего-приложения","Проблема: В Logcat нет логов моего приложения.",[20,1697,1698],{},[29,1699,1640],{},[132,1701,1702,1712,1722,1725],{},[44,1703,1704,1705,1708,1709,188],{},"Убедитесь, что в коде вы используете ",[24,1706,1707],{},"Log.d(tag, message)"," или аналоги, а не ",[24,1710,1711],{},"System.out.println",[44,1713,1714,1715,499,1717,1719,1720,91],{},"Проверьте фильтр Logcat: установите уровень на ",[24,1716,1478],{},[24,1718,1481],{},", попробуйте сбросить фильтр (",[24,1721,1468],{},[44,1723,1724],{},"Убедитесь, что приложение запущено именно на том устройстве, которое выбрано в Logcat.",[44,1726,1727,1728,1731,1732,188],{},"На некоторых устройствах (особенно с MIUI) нужно дополнительно включить ",[29,1729,1730],{},"\"Включить отладку по USB (настройки безопасности)\""," в ",[332,1733,1734],{},"Параметрах разработчика",[569,1736,1738],{"id":1737},"проблема-точки-останова-игнорируются-приложение-не-останавливается","Проблема: Точки останова игнорируются, приложение не останавливается.",[20,1740,1741],{},[29,1742,1640],{},[132,1744,1745,1755,1758,1765],{},[44,1746,1747,1748,1751,1752,1754],{},"Убедитесь, что вы запустили приложение не через ",[29,1749,1750],{},"\"Run\"",", а через ",[29,1753,1425],{}," (кнопка с жучком).",[44,1756,1757],{},"Проверьте, что точка останова активирована (красный кружок, а не серый с обводкой). Серый означает, что код не будет загружен (например, точка в неиспользуемом классе).",[44,1759,1760,1761,1764],{},"Очистите проект (",[29,1762,1763],{},"Build → Clean Project",") и перезапустите отладку.",[44,1766,1767],{},"Если приложение уже запущено, остановите его полностью и запустите заново в режиме отладки.",[1769,1770,1771],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":774,"searchDepth":775,"depth":775,"links":1773},[1774,1775,1776,1777,1781,1782,1783,1784,1785,1786],{"id":17,"depth":775,"text":18},{"id":35,"depth":775,"text":36},{"id":1114,"depth":775,"text":1115},{"id":1164,"depth":775,"text":1165,"children":1778},[1779,1780],{"id":1171,"depth":788,"text":1172},{"id":1226,"depth":788,"text":1227},{"id":1317,"depth":775,"text":1318},{"id":1385,"depth":775,"text":1386},{"id":1429,"depth":775,"text":1430},{"id":1522,"depth":775,"text":1523},{"id":518,"depth":775,"text":519},{"id":566,"depth":775,"text":567,"children":1787},[1788,1790,1791],{"id":1631,"depth":788,"text":1789},"Проблема: Устройство не отображается в adb devices или в Android Studio.",{"id":1694,"depth":788,"text":1695},{"id":1737,"depth":788,"text":1738},"2026-02-16 09:55:18","Полное руководство по отладке Android-приложений. Узнайте, как использовать ADB, Logcat и Android Studio для поиска и исправления ошибок. Пошаговая инструкция для разработчиков.","20-40 мин",[1796,1799,1802,1805],{"question":1797,"answer":1798},"Что такое ADB и зачем он нужен для отладки?","ADB (Android Debug Bridge) — это инструмент командной строки, который позволяет взаимодействовать с устройством Android с компьютера. Он используется для установки приложений, доступа к файловой системе, выполнения shell-команд и, что важно, для запуска отладки.",{"question":1800,"answer":1801},"Как посмотреть логи приложения в Logcat?","В Android Studio откройте View → Tool Windows → Logcat. Там вы увидите системные и прикладные логи в реальном времени. Используйте фильтры по тегу (Tag) или по уровню логирования (Log Level), чтобы сосредоточиться на сообщениях вашего приложения.",{"question":1803,"answer":1804},"Почему мое устройство не отображается в списке `adb devices`?","Чаще всего это связано с отсутствием драйверов (Windows) или udev-правил (Linux), или с тем, что на устройстве не включена опция 'Отладка по USB'. Проверьте настройки разработчика и установите необходимые драйверы.",{"question":1806,"answer":1807},"Как настроить отладку по Wi-Fi вместо USB-кабеля?","Подключите устройство по USB один раз, выполните `adb tcpip 5555`, затем найдите IP-адрес устройства в настройках Wi-Fi и подключитесь командой `adb connect \u003CIP_адрес>:5555`. После этого можно отключать USB.",[1809,1812,1815,1818,1821,1824],{"name":1810,"text":1811},"Включите отладку по USB на устройстве","На устройстве Android перейдите в Настройки → Об устройстве → Номер сборки (нажмите 7 раз, чтобы активировать режим разработчика). Затем вернитесь в Настройки → Параметры разработчика → включите 'Отладка по USB'.",{"name":1813,"text":1814},"Подготовьте компьютер: установите драйверы/правила","Для Windows скачайте и установите драйверы ADB с сайта производителя вашего устройства (Samsung, Xiaomi и др.) или используйте универсальный пакет Google USB Driver. Для Linux создайте файл `/etc/udev/rules.d/51-android.rules` с правилами для вашего производителя (можно найти в официальной документации Android).",{"name":1816,"text":1817},"Проверьте подключение устройства через ADB","Откройте терминал (или Command Prompt) и выполните `adb devices`. В списке должно появиться ваше устройство с статусом `device`. Если статус `unauthorized`, на устройстве появится запрос на разрешение отладки — подтвердите её.",{"name":1819,"text":1820},"Настройте проект в Android Studio","Откройте ваш проект в Android Studio. В панели выбора запускаемого устройства (Run/Debug Configurations) выберите ваше устройство из списка. Убедитесь, что в `build.gradle` (Module) уровень SDK компиляции (compileSdk) и минимальный SDK (minSdk) соответствуют вашей цели.",{"name":1822,"text":1823},"Используйте Logcat для анализа логов","Запустите приложение на устройстве (не обязательно в режиме отладки). Откройте окно Logcat (View → Tool Windows → Logcat). Установите фильтр по тегу вашего приложения (например, `package:mine` или конкретный тег из кода). Ищите сообщения с уровнем `Error` или `Warn`.",{"name":1825,"text":1826},"Запустите приложение в режиме отладки","Установите точки останова (breakpoints) в коде (клик на левом поле редактора рядом с номером строки). Нажмите кнопку 'Debug' (иконка жука) на панели инструментов. Приложение запустится на устройстве, и выполнение остановится на точках останова. Используйте панель отладчика для пошагового выполнения, просмотра переменных и стека вызовов.","PT30M",[1829,1830,1831,1832,1833,1834,1835,1836,1837,1838],"отладка android","debugging android","adb отладка","logcat android studio","как отлаживать приложения android","android studio отладчик","отладка через usb","ошибки android отладка","android debugging tools","настройка отладки android",{},[1841,1842,1843],"/guides/android/adb-commands-cheatsheet","/guides/android/logcat-filtering-tips","/errors/android/device-not-detected-adb","Гайды по Android",{"title":1029,"description":1793},"guides/android/debugging-overview","Это руководство познакомит вас с основными инструментами и техниками отладки Android-приложений. Вы научитесь настраивать среду, использовать ADB, анализировать логи в Logcat и работать с отладчиком Android Studio.",[1849,850,1850,1361,1851,1852,1853],"отладка","debugging","logcat","android studio","разработка","Gb07iFVAAiVw6d_ot1S1FUd6kCoZCeFtVYAtq0nAPjM",{"id":1856,"title":1857,"appliesTo":1858,"author":10,"body":1863,"canonical":798,"code":2153,"createdAt":2154,"description":2155,"difficulty":801,"draft":802,"estimatedTime":2156,"extension":804,"faq":2157,"howToSteps":2167,"howToTotalTime":834,"image":798,"keywords":2183,"locale":846,"meta":2191,"navigation":848,"path":853,"platform":850,"related":2192,"section":2196,"seo":2197,"severity":2198,"stem":2199,"summary":2200,"tags":2201,"twitterCreator":798,"twitterSite":798,"type":2207,"updatedAt":2154,"__hash__":2208},"content_ru/errors/android/oom.md","Решение ошибки OOM на Android: причины и способы устранения",[1859,1860,1861,1862],"Android 10 и новее","Xiaomi HyperOS / MIUI 14+","Samsung One UI 5.1/6.1","Realme UI / ColorOS 13+",{"type":12,"value":1864,"toc":2143},[1865,1869,1876,1879,1883,1909,1913,1917,1920,1965,1970,1974,1977,2009,2011,2015,2018,2107,2111,2114,2140],[15,1866,1868],{"id":1867},"что-означает-ошибка-oom-out-of-memory","Что означает ошибка OOM (Out of Memory)",[20,1870,1871,1872,1875],{},"Ошибка OOM (Out of Memory) или её полная форма ",[24,1873,1874],{},"java.lang.OutOfMemoryError"," сигнализирует о том, что приложение или сама система Android исчерпало доступный объём оперативной памяти (RAM). В этот момент срабатывает системный механизм OOM Killer, который принудительно завершает самый «прожорливый» процесс, чтобы предотвратить зависание всего устройства.",[20,1877,1878],{},"На практике вы мгновенно видите вылет программы, возврат на рабочий стол или системное уведомление «Приложение остановлено». Проблема может возникать как при запуске тяжёлых игр и камер, так и при работе с обычными мессенджерами или браузерами, если фоновые процессы накопили критический объём данных.",[15,1880,1882],{"id":1881},"причины-возникновения","Причины возникновения",[132,1884,1885,1891,1897,1903],{},[44,1886,1887,1890],{},[29,1888,1889],{},"Утечка памяти (Memory Leak)."," Разработчики допустили ошибку в коде: объекты не выгружаются после закрытия экранов или фоновых задач, постепенно занимая всю доступную RAM.",[44,1892,1893,1896],{},[29,1894,1895],{},"Конфликт тяжёлых фоновых процессов."," Несколько ресурсоёмких программ одновременно пытаются загрузить ресурсы, а планировщик Android не успевает корректно распределить приоритеты.",[44,1898,1899,1902],{},[29,1900,1901],{},"Переполненный аппаратный кэш."," Временные файлы приложений и системы блокируют нормальную работу виртуальной машины ART, не позволяя выделять новые блоки памяти.",[44,1904,1905,1908],{},[29,1906,1907],{},"Некорректная работа механизма zRAM."," Android сжимает неиспользуемые данные в оперативной памяти для экономии места. Если этот алгоритм даёт сбой или отключён, свободное место исчезает мгновенно.",[15,1910,1912],{"id":1911},"способы-решения","Способы решения",[569,1914,1916],{"id":1915},"способ-1-очистка-кэша-и-ограничение-фоновой-работы","Способ 1: Очистка кэша и ограничение фоновой работы",[20,1918,1919],{},"Начните с самого безопасного метода, который не затрагивает личные данные и пароли.",[41,1921,1922,1933,1936,1946,1962],{},[44,1923,1326,1924,1219,1927,1219,1930,188],{},[24,1925,1926],{},"Настройки",[24,1928,1929],{},"Приложения",[24,1931,1932],{},"Все приложения",[44,1934,1935],{},"Найдите программу, которая постоянно вылетает с ошибкой.",[44,1937,1938,1939,1942,1943,188],{},"Перейдите в раздел ",[24,1940,1941],{},"Хранилище и кэш"," и нажмите ",[24,1944,1945],{},"Очистить кэш",[44,1947,1948,1949,1219,1952,1955,1956,499,1959,188],{},"Вернитесь назад, откройте ",[24,1950,1951],{},"Дополнительно",[24,1953,1954],{},"Фоновая активность"," (путь может отличаться в зависимости от оболочки One UI, HyperOS или stock Android) и выберите ",[24,1957,1958],{},"Ограничить",[24,1960,1961],{},"Запретить автозапуск",[44,1963,1964],{},"Перезагрузите смартфон.",[226,1966,1967],{},[20,1968,1969],{},"💡 Совет: Не используйте кнопки «Убить все» или «Закрыть всё» в меню недавних приложений. Android спроектирован так, чтобы держать часто используемые процессы в кэше RAM. Принудительная остановка только увеличит нагрузку на процессор при следующем запуске.",[569,1971,1973],{"id":1972},"способ-2-обновление-по-и-сброс-настроек-системных-компонентов","Способ 2: Обновление ПО и сброс настроек системных компонентов",[20,1975,1976],{},"Если проблема возникла после установки крупного обновления системы или новой версии приложения, скорее всего, дело в несовместимости библиотек.",[41,1978,1979,1993,2002],{},[44,1980,1326,1981,1219,1984,1219,1987,1219,1990,188],{},[24,1982,1983],{},"Google Play",[24,1985,1986],{},"Профиль",[24,1988,1989],{},"Управление приложениями и устройством",[24,1991,1992],{},"Обновить всё",[44,1994,1995,1996,1219,1998,2001],{},"Перейдите в системные ",[24,1997,1926],{},[24,1999,2000],{},"Обновление ПО"," и проверьте наличие патчей безопасности.",[44,2003,2004,2005,2008],{},"Если ошибка затрагивает системные приложения (например, «Телефон» или «Сообщения»), зайдите в их настройки и нажмите ",[24,2006,2007],{},"Удалить обновления",". Система вернёт стабильную версию из заводского образа, а затем вы сможете скачать актуальный патч.",[271,2010],{},[569,2012,2014],{"id":2013},"способ-3-сброс-параметров-памяти-через-adb-для-опытных-пользователей","Способ 3: Сброс параметров памяти через ADB (для опытных пользователей)",[20,2016,2017],{},"Когда стандартные меню не помогают, можно принудительно освободить системные ресурсы через компьютер. Этот метод безопасен, если точно следовать инструкции.",[41,2019,2020,2036,2045,2070],{},[44,2021,2022,2023,2026,2027,1219,2029,2032,2033,91],{},"Включите ",[24,2024,2025],{},"Режим разработчика"," на телефоне (",[24,2028,1926],{},[24,2030,2031],{},"О телефоне"," → 7 раз нажмите на ",[24,2034,2035],{},"Номер сборки",[44,2037,2022,2038,2040,2041,2044],{},[24,2039,596],{}," в разделе ",[24,2042,2043],{},"Для разработчиков"," и подключите телефон к ПК.",[44,2046,2047,2048,2069],{},"Откройте терминал на компьютере и выполните команду для очистки системного кэша пакетов:\n",[1234,2049,2051],{"className":1236,"code":2050,"language":1238,"meta":774,"style":774},"adb shell pm trim-caches 999999999999\n",[24,2052,2053],{"__ignoreMap":774},[1242,2054,2055,2057,2060,2063,2066],{"class":1244,"line":1245},[1242,2056,1361],{"class":1248},[1242,2058,2059],{"class":1252}," shell",[1242,2061,2062],{"class":1252}," pm",[1242,2064,2065],{"class":1252}," trim-caches",[1242,2067,2068],{"class":1304}," 999999999999\n","\nЭта команда попросит систему удалить все временные файлы кэша приложений.",[44,2071,2072,2073,2102],{},"Для принудительного сброса служб ввода-вывода введите:\n",[1234,2074,2076],{"className":1236,"code":2075,"language":1238,"meta":774,"style":774},"adb shell cmd package compile -m speed -f\n",[24,2077,2078],{"__ignoreMap":774},[1242,2079,2080,2082,2084,2087,2090,2093,2096,2099],{"class":1244,"line":1245},[1242,2081,1361],{"class":1248},[1242,2083,2059],{"class":1252},[1242,2085,2086],{"class":1252}," cmd",[1242,2088,2089],{"class":1252}," package",[1242,2091,2092],{"class":1252}," compile",[1242,2094,2095],{"class":1304}," -m",[1242,2097,2098],{"class":1252}," speed",[1242,2100,2101],{"class":1304}," -f\n",[226,2103,2104],{},[20,2105,2106],{},"⚠️ Важно: Команда займёт 3–5 минут и может временно снизить производительность. Не отключайте кабель до завершения процесса и убедитесь, что заряд батареи выше 30%.",[15,2108,2110],{"id":2109},"профилактика","Профилактика",[20,2112,2113],{},"Чтобы ошибка OOM не возвращалась, придерживайтесь простых правил использования Android:",[132,2115,2116,2122,2128,2134],{},[44,2117,2118,2121],{},[29,2119,2120],{},"Не перегружайте хранилище."," Оставляйте минимум 15–20% свободного места во внутренней памяти. При нехватке места система не сможет корректно создавать файлы подкачки и работать с временными образами.",[44,2123,2124,2127],{},[29,2125,2126],{},"Следите за автозапуском."," В настройках батареи или разработчика отключайте автозапуск для программ, которые не нужны вам в фоновом режиме (магазины, утилиты для фото, редкие игры).",[44,2129,2130,2133],{},[29,2131,2132],{},"Избегайте «ускорителей памяти»."," Приложения-клинеры часто работают агрессивнее системного планировщика, постоянно запуская и останавливая службы, что провоцирует фрагментацию RAM и постоянные вылеты.",[44,2135,2136,2139],{},[29,2137,2138],{},"Регулярно обновляйте ПО."," Разработчики оболочек и приложений постоянно оптимизируют алгоритмы распределения памяти, особенно для новых версий Android. Установка патчей закрывает уязвимости и устраняет накопленные утечки.",[1769,2141,2142],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":774,"searchDepth":775,"depth":775,"links":2144},[2145,2146,2147,2152],{"id":1867,"depth":775,"text":1868},{"id":1881,"depth":775,"text":1882},{"id":1911,"depth":775,"text":1912,"children":2148},[2149,2150,2151],{"id":1915,"depth":788,"text":1916},{"id":1972,"depth":788,"text":1973},{"id":2013,"depth":788,"text":2014},{"id":2109,"depth":775,"text":2110},"OOM","2026-04-05 22:37:25","Вылетает приложение с ошибкой OOM на Android? Узнайте, как быстро освободить RAM, очистить кэш и вернуть стабильную работу. Пошаговое руководство.","10-15 мин",[2158,2161,2164],{"question":2159,"answer":2160},"Почему появляется OOM на новых смартфонах с 8 ГБ ОЗУ?","Даже при большом объёме RAM ошибка возникает, если одно приложение пытается выделить больше памяти, чем разрешено системой, или если в коде программы допущена утечка ресурсов (memory leak).",{"question":2162,"answer":2163},"Помогут ли сторонние приложения для очистки памяти?","Нет, они часто только ухудшают ситуацию. Современные версии Android самостоятельно управляют процессами, а принудительная очистка заставляет систему заново запускать фоновые службы, увеличивая нагрузку на CPU и RAM.",{"question":2165,"answer":2166},"Как определить, какое именно приложение вызывает сбой?","Откройте «Настройки» → «Приложения» → «Работающие приложения» (или «Статистика памяти»). Если конкретная программа постоянно занимает аномально высокий объём ОЗУ после закрытия, именно она вызывает проблему.",[2168,2171,2174,2177,2180],{"name":2169,"text":2170},"Перезагрузите устройство","Полная перезагрузка принудительно останавливает все зависшие процессы и сбрасывает распределение оперативной памяти.",{"name":2172,"text":2173},"Очистите кэш проблемного приложения","Перейдите в «Настройки» → «Приложения» → выберите вылетающую программу → «Хранилище» → «Очистить кэш». Данные приложения при этом сохранятся.",{"name":2175,"text":2176},"Ограничьте фоновую активность","В настройках приложения включите ограничение фоновой работы или автозапуск, чтобы система не выделяла ресурсы процессу в спящем режиме.",{"name":2178,"text":2179},"Обновите систему и приложения","Установите последние патчи безопасности и обновления ПО через Google Play и системный раздел, так как разработчики регулярно исправляют утечки памяти.",{"name":2181,"text":2182},"Выполните сброс настроек (при необходимости)","Если ошибка сохраняется во всех приложениях, выполните полный сброс через «Система» → «Сброс настроек», предварительно сохранив резервную копию данных.",[2184,2185,2186,2187,2188,2189,2190],"ошибка OOM Android","OutOfMemoryError Android","приложение вылетает нехватка памяти андроид","как исправить OOM error","Android crash out of memory","очистить RAM Android вручную","оптимизация памяти андроид",{},[2193,2194,2195],"/errors/android/app_crash","/guides/android/clear_cache","/guides/android/developer_options","Ошибки Android",{"title":1857,"description":2155},"high","errors/android/oom","Ошибка OOM (Out of Memory) возникает при нехватке оперативной памяти, что приводит к аварийному закрытию приложений. Разберёмся, как диагностировать проблему и применить рабочие методы её устранения.",[2202,2203,26,2204,2205,2206],"Android","память RAM","оптимизация","сбои приложений","memory leak","error","I_xLjqGvw45yoJMskp8ILwmmEB-kUX1mxIhL-7pGy9g",{"id":2210,"title":2211,"appliesTo":2212,"author":10,"body":2217,"canonical":798,"code":798,"createdAt":2641,"description":2642,"difficulty":801,"draft":802,"estimatedTime":2156,"extension":804,"faq":2643,"howToSteps":2653,"howToTotalTime":834,"image":798,"keywords":2666,"locale":846,"meta":2674,"navigation":848,"path":854,"platform":850,"related":2675,"section":855,"seo":2679,"severity":798,"stem":2680,"summary":2681,"tags":2682,"twitterCreator":798,"twitterSite":798,"type":867,"updatedAt":2641,"__hash__":2687},"content_ru/guides/android/garbage-collection.md","Оптимизация сборщика мусора в Android: руководство по настройке",[2213,2214,2215,2216],"Android 10–15 (API 29–35)","Android Studio Iguana+","Kotlin/Java приложения","Устройства с ART-рантаймом",{"type":12,"value":2218,"toc":2631},[2219,2223,2228,2231,2235,2238,2263,2268,2272,2281,2291,2295,2310,2323,2350,2352,2356,2359,2412,2415,2501,2505,2515,2518,2545,2547,2567,2569,2572,2619,2628],[15,2220,2222],{"id":2221},"зачем-разбираться-в-работе-сборщика-мусора","Зачем разбираться в работе сборщика мусора",[20,2224,2225,2226,188],{},"В современных версиях Android за управление оперативной памятью отвечает среда выполнения ART (Android Runtime). Сборщик мусора (Garbage Collector, GC) автоматически находит и удаляет объекты, которые больше не используются приложением. Пока этот процесс полностью автоматизирован, некорректная работа с памятью приводит к заметным «фризам» интерфейса (stop-the-world паузы) и вылетам с ошибкой ",[24,2227,26],{},[20,2229,2230],{},"В этом руководстве вы научитесь отслеживать активность GC, анализировать нагрузку на кучу и применять проверенные методики снижения потребления памяти. После выполнения шагов ваше приложение станет отзывчивее, а потребление ресурсов — предсказуемым.",[15,2232,2234],{"id":2233},"требования-и-подготовка","Требования и подготовка",[20,2236,2237],{},"Чтобы повторить описанные действия, подготовьте рабочее окружение:",[132,2239,2240,2247,2253,2260],{},[44,2241,2242,2243,2246],{},"Установленный ",[29,2244,2245],{},"Android Studio Iguana"," или новее с поддержкой Android SDK 34+.",[44,2248,2249,2250,57],{},"Физическое устройство или эмулятор на базе ",[29,2251,2252],{},"Android 10 (API 29)",[44,2254,2255,2256,2259],{},"Включённые ",[29,2257,2258],{},"Параметры разработчика"," и активная отладка по USB.",[44,2261,2262],{},"Базовое понимание жизненного цикла Activity/Fragment и работы ссылок в Kotlin/Java.",[226,2264,2265],{},[20,2266,2267],{},"💡 Совет: Перед началом профилирования закройте фоновые приложения на тестовом устройстве, чтобы их нагрузка не искажала метрики кучи и не вызывала ложные срабатывания GC.",[15,2269,2271],{"id":2270},"шаг-1-включите-профилирование-памяти-в-android-studio","Шаг 1: Включите профилирование памяти в Android Studio",[20,2273,2274,2275,2277,2278,2280],{},"Откройте ваш проект и перейдите в нижнюю панель IDE. Найдите вкладку ",[29,2276,97],{},". Если она скрыта, откройте её через ",[24,2279,101],{},". Запустите приложение на подключённом устройстве и кликните на карточку процесса вашего приложения в списке активных процессов.",[20,2282,2283,2284,2286,2287,2290],{},"В открывшейся панели выберите раздел ",[29,2285,126],{},". Нажмите кнопку ",[29,2288,2289],{},"Record"," (круглая кнопка с точкой), чтобы начать захват метрик. Выполните сценарий использования, который вызывает подозрения на утечку: быстро открывайте и закрывайте экраны, прокручивайте длинные списки или загружайте изображения. Остановите запись. Вы увидите график, где цветные зоны показывают моменты работы сборщика мусора.",[15,2292,2294],{"id":2293},"шаг-2-сделайте-дамп-кучи-и-найдите-виновников-нагрузки","Шаг 2: Сделайте дамп кучи и найдите «виновников» нагрузки",[20,2296,2297,2298,2301,2302,2305,2306,2309],{},"На том же графике Memory нажмите кнопку ",[29,2299,2300],{},"Dump Java Heap",". Android Studio создаст снимок оперативной памяти в формате ",[24,2303,2304],{},".hprof",". В появившемся окне ",[29,2307,2308],{},"Captures"," выберите свежий дамп.",[20,2311,2312,2313,499,2316,2319,2320,2322],{},"Переключитесь в режим ",[29,2314,2315],{},"Package Tree View",[29,2317,2318],{},"Class View",". Отсортируйте список по колонке ",[29,2321,325],{},". Объекты с наибольшим значением — это то, что удерживает память даже после вызова GC. Обратите внимание на:",[132,2324,2325,2333,2343],{},[44,2326,2327,1047,2329,2332],{},[24,2328,387],{},[24,2330,2331],{},"Drawable"," объекты без оптимизации.",[44,2334,2335,2336,363,2339,2342],{},"Коллекции (",[24,2337,2338],{},"List",[24,2340,2341],{},"Map","), которые постоянно растут без очистки.",[44,2344,2345,2346,2349],{},"Замыкания (lambdas) и ",[24,2347,2348],{},"Handler"," с неявными ссылками на контекст Activity.",[271,2351],{},[15,2353,2355],{"id":2354},"шаг-3-примените-оптимизации-в-коде","Шаг 3: Примените оптимизации в коде",[20,2357,2358],{},"На основе анализа внесите правки в исходный код. Основные приёмы для снижения давления на сборщик мусора:",[41,2360,2361,2372,2394],{},[44,2362,2363,2366,2367,499,2369,2371],{},[29,2364,2365],{},"Переиспользуйте тяжёлые объекты."," Вместо постоянного создания новых ",[24,2368,712],{},[24,2370,387],{}," используйте объектные пулы или библиотеки вроде Glide/Coil, которые кэшируют изображения и управляют их жизненным циклом.",[44,2373,2374,2377,2378,2381,2382,2385,2386,2389,2390,2393],{},[29,2375,2376],{},"Избегайте скрытых выделений в циклах."," Конкатенация строк внутри ",[24,2379,2380],{},"for","/",[24,2383,2384],{},"while"," создаёт множество временных объектов. Замените оператор ",[24,2387,2388],{},"+"," на ",[24,2391,2392],{},"StringBuilder"," или используйте строковые шаблоны Kotlin.",[44,2395,2396,2399,2400,499,2402,2405,2406,2381,2409,188],{},[29,2397,2398],{},"Очищайте ссылки при уничтожении компонентов."," В ",[24,2401,525],{},[24,2403,2404],{},"onCleared()"," (для ViewModel) обнуляйте слушатели, отменяйте корутины и отписывайтесь от ",[24,2407,2408],{},"Flow",[24,2410,2411],{},"LiveData",[20,2413,2414],{},"Пример безопасной работы с данными:",[1234,2416,2419],{"className":2417,"code":2418,"language":865,"meta":774,"style":774},"language-kotlin shiki shiki-themes github-light github-dark","// Плохо: создает новые списки и временные объекты при каждом вызове\nfun processItems(items: List\u003CString>): List\u003CString> {\n    return items.filter { it.isNotEmpty() }.map { it.trim() }\n}\n\n// Хорошо: переиспользует буфер и минимизирует выделение памяти\nfun processItemsOptimized(items: List\u003CString>, reusableList: MutableList\u003CString>) {\n    reusableList.clear()\n    for (item in items) {\n        if (item.isNotEmpty()) {\n            reusableList.add(item.trim())\n        }\n    }\n}\n",[24,2420,2421,2426,2431,2436,2442,2448,2454,2460,2466,2472,2478,2484,2490,2496],{"__ignoreMap":774},[1242,2422,2423],{"class":1244,"line":1245},[1242,2424,2425],{},"// Плохо: создает новые списки и временные объекты при каждом вызове\n",[1242,2427,2428],{"class":1244,"line":775},[1242,2429,2430],{},"fun processItems(items: List\u003CString>): List\u003CString> {\n",[1242,2432,2433],{"class":1244,"line":788},[1242,2434,2435],{},"    return items.filter { it.isNotEmpty() }.map { it.trim() }\n",[1242,2437,2439],{"class":1244,"line":2438},4,[1242,2440,2441],{},"}\n",[1242,2443,2445],{"class":1244,"line":2444},5,[1242,2446,2447],{"emptyLinePlaceholder":848},"\n",[1242,2449,2451],{"class":1244,"line":2450},6,[1242,2452,2453],{},"// Хорошо: переиспользует буфер и минимизирует выделение памяти\n",[1242,2455,2457],{"class":1244,"line":2456},7,[1242,2458,2459],{},"fun processItemsOptimized(items: List\u003CString>, reusableList: MutableList\u003CString>) {\n",[1242,2461,2463],{"class":1244,"line":2462},8,[1242,2464,2465],{},"    reusableList.clear()\n",[1242,2467,2469],{"class":1244,"line":2468},9,[1242,2470,2471],{},"    for (item in items) {\n",[1242,2473,2475],{"class":1244,"line":2474},10,[1242,2476,2477],{},"        if (item.isNotEmpty()) {\n",[1242,2479,2481],{"class":1244,"line":2480},11,[1242,2482,2483],{},"            reusableList.add(item.trim())\n",[1242,2485,2487],{"class":1244,"line":2486},12,[1242,2488,2489],{},"        }\n",[1242,2491,2493],{"class":1244,"line":2492},13,[1242,2494,2495],{},"    }\n",[1242,2497,2499],{"class":1244,"line":2498},14,[1242,2500,2441],{},[15,2502,2504],{"id":2503},"шаг-4-проверьте-результат-в-реальных-условиях","Шаг 4: Проверьте результат в реальных условиях",[20,2506,2507,2508,499,2511,2514],{},"Пересоберите приложение в режиме ",[24,2509,2510],{},"Release",[24,2512,2513],{},"Profile",". Артефакты debug-сборки содержат отладочный код и инструменты, которые искусственно увеличивают размер объектов и искажают поведение GC. Повторно запустите Profiler и выполните тот же сценарий, что и в первом шаге.",[20,2516,2517],{},"Сравните новые графики с предыдущими. Обратите внимание на:",[132,2519,2520,2526,2532],{},[44,2521,2522,2525],{},[29,2523,2524],{},"Частоту срабатываний GC:"," она должна снизиться или сместиться в моменты простоя приложения.",[44,2527,2528,2531],{},[29,2529,2530],{},"Пиковое потребление кучи:"," график должен выглядеть более ровным, без резких «пил».",[44,2533,2534,2537,2538,499,2541,2544],{},[29,2535,2536],{},"Время отклика интерфейса:"," используйте вкладку ",[29,2539,2540],{},"CPU Profiler",[29,2542,2543],{},"Frame Timing",", чтобы убедиться, что кадры не выпадают из целевых 16 мс.",[15,2546,519],{"id":518},[20,2548,2549,2550,2553,2554,1047,2557,2559,2560,499,2563,2566],{},"Убедиться в эффективности проделанной работы можно двумя способами. Во-первых, выполните в терминале ",[24,2551,2552],{},"adb shell dumpsys meminfo \u003Cваш.пакет>"," и сравните значения ",[24,2555,2556],{},"TOTAL PSS",[24,2558,144],{}," до и после изменений. Во-вторых, проверьте логи устройства на наличие сообщений вида ",[24,2561,2562],{},"GC_CONCURRENT",[24,2564,2565],{},"GC_FOR_ALLOC"," — их количество в минуту должно стремиться к нулю при обычном использовании.",[15,2568,567],{"id":566},[20,2570,2571],{},"Даже при следовании инструкции могут возникнуть технические нюансы:",[132,2573,2574,2588,2605],{},[44,2575,2576,2579,2580,2583,2584,2587],{},[29,2577,2578],{},"Дамп кучи занимает слишком много места."," Android Studio предложит загрузить дамп на сервер или использовать потоковый анализатор. Для локального анализа увеличьте лимит памяти IDE в ",[24,2581,2582],{},"studio64.exe.vmoptions"," (флаг ",[24,2585,2586],{},"-Xmx4g",") или ограничьте захват конкретным пакетом.",[44,2589,2590,2593,2594,2381,2597,2600,2601,2604],{},[29,2591,2592],{},"GC запускается слишком часто после оптимизаций."," Это признак фрагментации кучи или нехватки нативной памяти. Перенесите тяжёлые вычисления в ",[24,2595,2596],{},"RenderScript",[24,2598,2599],{},"C++"," через JNI или используйте ",[24,2602,2603],{},"android:largeHeap=\"true\""," в манифесте только для специфичных задач.",[44,2606,2607,2610,2611,2614,2615,2618],{},[29,2608,2609],{},"Профилировщик не показывает данные на Android 14+."," Начиная с Android 13, Google ужесточил доступ к ",[24,2612,2613],{},"/data/local/tmp",". Убедитесь, что вы подписываете APK отладочным ключом и запускаете приложение в режиме ",[24,2616,2617],{},"debuggable=true",", иначе Profiler не сможет подключиться к рантайму.",[226,2620,2621],{},[20,2622,2623,2624,2627],{},"⚠️ Важно: Не пытайтесь форсировать вызов сборщика мусора через ",[24,2625,2626],{},"System.gc()",". В ART это лишь рекомендация, а в продакшн-сборках вызов часто игнорируется. Ручная сборка может вызвать лишние остановки потока и ухудшить отзывчивость интерфейса.",[1769,2629,2630],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":774,"searchDepth":775,"depth":775,"links":2632},[2633,2634,2635,2636,2637,2638,2639,2640],{"id":2221,"depth":775,"text":2222},{"id":2233,"depth":775,"text":2234},{"id":2270,"depth":775,"text":2271},{"id":2293,"depth":775,"text":2294},{"id":2354,"depth":775,"text":2355},{"id":2503,"depth":775,"text":2504},{"id":518,"depth":775,"text":519},{"id":566,"depth":775,"text":567},"2026-04-06 16:27:05","Узнайте, как работает Garbage Collector в Android, и уберите лаги. Пошаговая инструкция по отладке и оптимизации памяти приложений за 15 минут.",[2644,2647,2650],{"question":2645,"answer":2646},"Влияет ли ручная очистка кэша на работу сборщика мусора Android?","Нет, системный кэш и GC работают на разных уровнях. Сборщик мусора управляет только выделенной кучей (heap) запущенных процессов и не реагирует на системные утилиты очистки.",{"question":2648,"answer":2649},"Почему приложение вылетает с ошибкой OutOfMemoryError, если GC работает автоматически?","Сборщик мусора не может освободить объекты, на которые всё ещё ссылаются активные переменные. Это указывает на логическую утечку памяти, которую нужно устранить в коде.",{"question":2651,"answer":2652},"Можно ли отключить Garbage Collector для повышения производительности?","Отключить ART GC невозможно и опасно для системы. Вместо этого используйте объектные пулы, переиспользуйте тяжелые элементы UI и минимизируйте выделение памяти в критичных к FPS циклах.",[2654,2657,2660,2663],{"name":2655,"text":2656},"Включите профилирование памяти","Откройте вкладку Profiler в Android Studio, выберите процесс приложения и начните запись метрик Memory для отслеживания активности GC.",{"name":2658,"text":2659},"Создайте дамп кучи (Heap Dump)","Нажмите кнопку Dump на графике Memory, чтобы получить снимок выделенной памяти, и найдите объекты с наибольшим Retained Size.",{"name":2661,"text":2662},"Оптимизируйте выделение памяти в коде","Замените конкатенацию строк в циклах на StringBuilder, используйте объектные пулы и правильно очищайте ссылки в методах жизненного цикла.",{"name":2664,"text":2665},"Проверьте результат после сборки Release","Пересоберите проект, снова запустите Profiler и убедитесь, что частота вызовов GC и пиковое потребление кучи снизились.",[2667,2668,2669,2670,2671,2672,2673],"сборщик мусора android","garbage collection android оптимизация","как очистить память андроид разработчику","Android Studio Profiler GC","утечки памяти в android приложениях","настройка ART GC Android 14","отладка сборщика мусора",{},[2676,2677,2678],"/guides/android/fix-memory-leaks","/guides/android/android-studio-profiler-basics","/guides/android/enable-developer-options",{"title":2211,"description":2642},"guides/android/garbage-collection","Руководство по мониторингу и настройке работы Garbage Collector в Android. Научитесь снижать нагрузку на кучу, устранять утечки и ускорять интерфейс приложений.",[850,2683,2684,2685,1852,2686,1850],"garbage-collection","оптимизация памяти","разработка под android","art runtime","qRn1HCl8n2qqKifdfJ1zX9IK-bjdOVm3XfTAmPVmZWM"]