Тестирование — важная часть разработки Android, позволяющая сгладить все ошибки, ошибки и проблемы с производительностью, которые могут скрываться в вашем приложении, прежде чем вы опубликуете его для широкой публики.
Каждый раз, когда вы сталкиваетесь с ошибкой, Android генерирует сообщение об ошибке, а затем либо отображает это сообщение как часть Logcat Monitor Android Studio, либо как диалог на устройстве, которое вы используете для тестирования своего приложения.
Эти сообщения об ошибках обычно короткие и точные, и на первый взгляд могут показаться не такими уж полезными. Тем не менее, эти сообщения на самом деле содержат всю информацию, необходимую для возобновления проекта — вам просто нужно знать, как их расшифровать!
В этой статье мы подробно рассмотрим 13 сообщений об ошибках, с которыми вы, скорее всего, столкнетесь при разработке любого приложения для Android. Мы рассмотрим, что на самом деле означает каждое из этих сообщений об ошибках, рассмотрим все возможные причины, по которым вы можете столкнуться с каждой ошибкой, и, самое главное, поделитесь пошаговыми инструкциями о том, как их можно устранить.
Распознавание сообщений об ошибках
При тестировании приложения вы можете встретить широкий спектр сообщений об ошибках, начиная от серьезных ошибок, которые могут привести к сбою приложения при первой установке на целевое устройство, до более мелких ошибок, которые со временем снижают производительность вашего приложения. ,
В зависимости от типа возникшей ошибки Android отобразит сообщение об ошибке на устройстве, которое вы используете для тестирования своего приложения, или в Android Studio.
Распознать сообщения об ошибках, которые появляются на физическом устройстве или AVD, легко — вам просто нужно обращать внимание на любые диалоги, которые появляются на экране вашего устройства! Однако обнаружить ошибки, которые появляются в Android Studio, может быть сложно, так как Logcat Monitor записывает огромное количество информации, упрощая пропустить важные сообщения об ошибках.
Самый простой способ убедиться, что вы не пропустили ни одного сообщения об ошибке, — это открыть раскрывающийся список «Подробный отчет» в Logcat Monitor и установить для него значение « Ошибка» , которое отфильтровывает все, кроме сообщений об ошибках.
1. R.layout.main не может быть найден / не может найти символ R
Эта ошибка возникает, когда Android Studio не может правильно сгенерировать ваш файл R.java , и он часто может возникать из ниоткуда — в одну минуту все будет работать нормально, а в следующую минуту каждая часть вашего проекта не будет скомпилирована. Что еще хуже, когда Android Studio обнаруживает ошибку R.layout
, она обычно R.layout
все ваши файлы ресурсов макета как содержащие ошибки, что затрудняет определение того, с чего начать поиск источника ошибки.
Часто наиболее эффективное решение является самым простым: очистить и перестроить свой проект. Выберите « Построить»> «Очистить проект» на панели инструментов Android Studio, подождите несколько минут, а затем соберите свой проект, выбрав « Построить»> «Перестроить проект» .
Если один цикл очистки / восстановления не работает, попробуйте повторить этот процесс несколько раз, поскольку некоторые разработчики сообщают о положительных результатах после выполнения нескольких циклов очистки / восстановления в быстрой последовательности.
Если вы столкнулись с этой ошибкой после перемещения некоторых файлов и каталогов, возможно, ошибка R.layout
вызвана несоответствием между кэшем Android Studio и текущим макетом вашего проекта. Если вы подозреваете, что это может быть так, выберите « Файл»> «Неправильно использовать кэши / перезапустить»> «Неправильно» и «Перезапустить » на панели инструментов Android Studio.
Проблемы с именами ваших ресурсов также могут помешать правильному созданию файла R.java , поэтому убедитесь, что у вас нет нескольких ресурсов с одинаковыми именами и что ни одно из имен ваших файлов не содержит недопустимых символов. Android Studio поддерживает только строчные буквы z, 0-9, точки с R.layout
и подчеркивания, и один недопустимый символ может вызвать ошибку R.layout
во всем проекте, даже если вы фактически не используете этот ресурс в своем проекте!
Если вы R.layout
и R.layout
ошибку, но Android Studio по-прежнему отображает ошибку R.layout
, вам может потребоваться завершить цикл очистки / перестроения, прежде чем Android Studio правильно зарегистрирует ваши изменения.
2. Слишком много полевых ссылок… .Макс 65,536
Когда вы компилируете свое приложение, APK содержит исполняемые файлы байт-кода в форме файлов байт-кода Dalvik Executable (DEX). Спецификация DEX гласит, что один файл DEX может ссылаться максимум на 65 536 методов, и если вы обнаружите ошибку « Слишком много полей…», это означает, что ваше приложение превысило этот предел. Обратите внимание, что это ограничение количества методов, на которые ссылается ваш проект, а не количества методов, которые определяет ваш проект.
Если вы столкнулись с этой ошибкой, то вы можете:
- Уменьшите количество ссылок в вашем проекте. Одним из наиболее эффективных способов обрезки ссылок на ваши методы является проверка зависимостей вашего приложения, поскольку они часто являются одними из самых значительных источников ссылок на методы.
- Настройте свое приложение для использования более одного файла DEX, включив мультидекс.
Процесс включения поддержки multidex зависит от версии Android, поддерживаемой вашим проектом.
Если вы ориентируетесь на Android 5.0 или выше, то первым делом откройте файл build.gradle уровня модуля и установите для multiDexEnabled
значение true
:
1
2
3
4
|
android {
defaultConfig {
minSdkVersion 21
multiDexEnabled true
|
Однако, если ваш minSdkVersion
равен 20 или ниже, вам нужно добавить multiDexEnabled true
а затем добавить библиотеку поддержки multidex в качестве зависимости проекта:
1
2
3
|
dependencies {
compile ‘com.android.support:multidex:1.0.1’
}
|
Следующий шаг зависит от того, переопределяете ли вы класс Application
.
Если ваш проект переопределяет класс Application
, откройте Manifest и добавьте в тег <application>
:
1
2
3
4
5
6
|
<application
android:name=»android.support.multidex.MultiDexApplication» >
…
…
…
</application>
|
Если ваш проект не переопределяет класс Application
, вам нужно вместо этого расширить MultiDexApplication
:
1
|
public class MyApplication extends MultiDexApplication
|
Наконец, если вы переопределяете класс Application
но не можете изменить базовый класс, вы можете включить multidex, переопределив метод attachBaseContext()
и вызвав MultiDex.install(this)
, например:
1
2
3
4
5
|
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
|
3. Пожалуйста, выберите действительный каталог JDK
Если вы получаете ошибку JDK всякий раз, когда пытаетесь создать свое приложение, это означает, что Android Studio пытается найти, где JDK установлен на вашем компьютере разработчика.
Чтобы исправить эту ошибку:
- Выберите Файл> Структура проекта … на панели инструментов Android Studio.
- Выберите SDK Location из меню слева.
- Убедитесь, что установлен флажок Использовать встроенный JDK .
Если это не решит проблему, вернитесь обратно в Файл> Структура проекта …> Расположение SDK и вручную введите полный путь к файлу JDK. Если вы не уверены, где на компьютере разработчика установлен JDK, вы можете узнать об этом, открыв терминал (Mac) или командную строку (Windows) и введя следующую команду:
1
|
/usr/libexec/java_home
|
4. Ошибка установки APK
Хотя AVD отлично подходят для тестирования вашего приложения на широком спектре различного аппаратного и программного обеспечения, вы всегда должны тестировать свое приложение хотя бы на одном физическом смартфоне или планшете Android. Тем не менее, Android Studio распознает подключенное устройство Android как известно.
Если вы подключили свое устройство к своей машине для разработки, но при попытке установить APK появляется сообщение об ошибке установки APK или ваше устройство даже не отображается в окне « Выбор цели развертывания», попробуйте выполнить следующие исправления:
Убедитесь, что отладка по USB включена.
Откройте настройки вашего устройства, затем выберите « Параметры разработчика» и убедитесь, что отладка по USB включена. Если вы не видите « Параметры разработчика» в меню « Настройки» , выберите « О телефоне» и продолжайте нажимать « Номер сборки», пока не появится уведомление « Вы являетесь разработчиком» . Вернитесь к главному экрану настроек , и вы увидите, что параметры разработчика были добавлены.
Проверьте экран вашего смартфона или планшета.
Иногда вашему устройству может потребоваться дополнительный ввод, прежде чем он подключится к вашей машине для разработки. Например, он может попросить вас выбрать между различными режимами или явно авторизовать соединение.
Убедитесь, что у вас установлен правильный драйвер USB.
Если вы разрабатываете для Windows, вам необходимо загрузить соответствующий OEM-драйвер USB для вашего устройства. Если вы являетесь пользователем Nexus, вы можете загрузить драйвер Google USB через Android SDK Manager в Android Studio.
Убедитесь, что ваше устройство соответствует минимальным требованиям SDK вашего проекта.
Вы найдете минимальный SDK вашего проекта в файле gradle.build уровня модуля и сможете проверить, какая версия Android установлена на вашем устройстве, открыв его Настройки и перейдя в раздел « О телефоне ».
Попробуйте перезапустить процесс adb (Android Debug Bridge).
Откройте окно терминала или командной строки, а затем измените каталог ( cd
), чтобы он указывал на окно инструментов вашей платформы , например:
1
|
cd /Users/Downloads/adt-bundle-mac/sdk/platform-tools
|
Затем завершите и перезапустите процесс adb, введя следующие команды, одну за другой:
1
|
./adb kill-server
|
1
|
./adb start-server
|
Перезапустите все!
Если ничего не помогло, попробуйте отключить, а затем снова подключить устройство, перезапустить устройство, перезапустить Android Studio и, в крайнем случае, перезапустить компьютер для разработки.
5. INSTALL_FAILED_INSUFFICIENT_STORAGE
Если вы столкнулись с этой ошибкой при попытке установить проект, это означает, что целевому устройству не хватает памяти.
Если вы пытаетесь установить свой проект на AVD, то вам следует проверить, сколько места выделено именно этому AVD:
- Запустите AVD Manager.
- Найдите рассматриваемый AVD и щелкните соответствующий значок « Изменить этот AVD» .
- В открывшемся окне нажмите « Показать дополнительные настройки» .
- Прокрутите до раздела « Память и хранение ».
В этом разделе перечислены различные типы памяти, выделенные для этого конкретного AVD. Если какое-либо из этих значений необычно низкое, вы должны увеличить их, чтобы более точно отразить память, доступную для вашего типичного смартфона или планшета на Android:
- ОЗУ. Объем оперативной памяти, доступной эмулируемому устройству.
- В.М. Куча. Сколько кучи (т. Е. Памяти) выделяется виртуальной машине (ВМ) эмулируемого смартфона или планшета.
- Внутреннее хранилище. Объем несъемной памяти, доступной эмулируемому устройству.
- SD Card. Объем доступной съемной памяти. Если вы хотите использовать виртуальную SD-карту, управляемую Android Studio, выберите « Управляемый Studio» и введите размер виртуальной SD-карты, которую вы хотите создать (минимальное рекомендуемое значение составляет 100 МБ). Кроме того, вы можете управлять «пространством» SD-карты в файле, выбрав « Внешний файл» и указав местоположение, которое вы хотите использовать.
Если в памяти вашего AVD нет ничего странного или вы пытаетесь установить приложение на физическом смартфоне или планшете Android, то эта ошибка обычно означает, что ваше скомпилированное приложение слишком велико. Приложение, которое занимает значительную часть памяти устройства во время установки, никогда не выйдет из строя.
Если вам нужно значительно уменьшить размер вашего APK, попробуйте следующие методы:
-
Используйте ProGuard для удаления неиспользуемых классов, полей, методов и атрибутов. Чтобы включить ProGuard, откройте файл build.gradle уровня модуля и добавьте следующее:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
buildTypes {
release {
//Enable ProGuard//
minifyEnabled true
//Since we want to reduce our APK size as much as possible, I’m using the settings from the proguard-android-optimize.txt file//
proguardFiles getDefaultProguardFile(‘proguard-android-optimize.txt’), ‘proguard-rules.pro’
}
}
}
|
- Используйте инструмент aapt, чтобы оптимизировать чертежи со сжатием без потерь, или используйте программу, предназначенную для уменьшения размера ваших файлов PNG ( zopflipng , pngcrush , OptiPNG , TinyPNG или pngquant ) или размера ваших файлов JPEG ( packJPG ). Кроме того, вы можете попробовать заменить файлы PNG и JPEG изображениями в формате WebP .
- Не забудьте удалить все связанные с отладкой функции из версии выпуска вашего приложения. Android не требует этой информации для запуска, поэтому он просто занимает ненужное место.
- Обыщите свой проект для любых дублирующих ресурсов. Даже легкие ресурсы, такие как дублирующиеся строки, вносят вклад в ваш окончательный размер APK.
- Используйте Lint для определения любых ресурсов, на которые нет ссылок нигде в вашем коде, и удалите эти ресурсы. Чтобы запустить Lint, выберите « Анализ»> «Проверить код» на панели инструментов Android Studio.
- Включите
shrinkResources true
ресурсов, добавивshrinkResources true
в файл build.gradle вашего проекта. - Если вам нужно использовать варианты одного и того же изображения, то используйте одно и то же базовое изображение и настраивайте его во время выполнения, а не добавляйте несколько версий одного и того же изображения в свой проект. Например, вы можете применять разные цвета к изображению, используя
android:tint
иtintMode
, и вы можете вращать изображение, используяandroid:fromDegrees
,android:toDegrees
,android:pivotX
иandroid:pivotY
. -
Оптимизируйте свои библиотеки. Попробуйте удалить все ненужные библиотеки или библиотеки с большим объемом памяти из вашего проекта. Если вам действительно нужно использовать большую библиотеку, то проверьте, есть ли способ оптимизировать эту библиотеку для мобильной среды, поскольку код внешней библиотеки часто не написан для мобильных устройств. Также следует помнить, что многие библиотеки содержат большое количество локализованных строк. Если ваше приложение официально не поддерживает эти библиотеки, вы можете уменьшить размер библиотеки, сказав Gradle не включать эти строки в ваш скомпилированный APK. Чтобы указать языки, которые официально поддерживает ваше приложение, откройте файл build.gradle уровня модуля и используйте атрибут
resConfigs
. Например, здесь мы указываем, что мы хотим включить только англоязычные строки в наш проект:
1
2
3
|
android {
defaultConfig {
resConfigs «en»
|
-
Подумайте, содержит ли ваш APK большой объем контента, который отдельный пользователь может загружать, но никогда не использовать. Например, устройство с экраном hdpi мало используется для
xxxhdpi
! Один из наиболее эффективных способов уменьшить размер вашего APK — это разделить его на несколько APK, поэтому, когда пользователь загрузит ваше приложение, он получит APK, содержащий только код и ресурсы, которые имеют смысл для его конкретного устройства. Более подробную информацию о создании APK, предназначенных для различных плотностей экрана и конкретных ABI (двоичных интерфейсов приложений), вы найдете в официальных документах по Android.
6. ActivityNotFoundException
startActivity(Intent)
ActivityNotFoundException
возникает, когда происходит startActivity(Intent)
вызова startActivity(Intent)
или одного из его вариантов, поскольку Activity
не может выполнить данное Intent
.
Самая распространенная причина исключения ActivityNotFoundException
— забыть объявить действие в своем манифесте, поэтому откройте свой манифест и убедитесь, что вы объявили все свои действия. Вам также следует проверить, правильно ли вы объявили каждое действие, используя либо полное имя класса, либо точку остановки в качестве сокращения имени пакета. Например, оба из следующих допустимы:
1
|
<activity android:name=».MainActivity»>
|
1
|
<activity android:name=»com.jessicathornsby.myapplication.MainActivity»>
|
Если вы не можете обнаружить никаких проблем с вашим манифестом, то есть несколько других потенциальных причин ActivityNotFoundExceptions
. Во-первых, если вы столкнулись с этой ошибкой после перемещения класса Activity
из одного пакета в другой, возможно, вы перепутали Android Studio и вам просто нужно почистить и перестроить свой проект.
Исключение ActivityNotFoundException
также может быть вызвано, если ошибка в целевом Activity
загружается неправильно. Чтобы проверить, происходит ли это в вашем проекте, поместите код намерения в блок try-catch:
1
2
3
4
5
6
7
8
|
try {
//Your code here//
} catch ( ActivityNotFoundException e) {
e.printStackTrace();
}
|
Запустите ваше приложение еще раз, а затем посмотрите на Logcat Monitor в Android Studio, чтобы увидеть, нет ли в нем каких-либо исключений, которые могут препятствовать созданию целевой активности. Если это так, то устранение этих ошибок должно решить и ActivityNotFoundException
.
7. ClassCastException
Ошибка ClassCastException
связана с функцией преобразования типов Java, которая позволяет преобразовывать переменные одного типа в другой. Вы сталкиваетесь с ClassCastException
когда пытаетесь привести объект к классу, экземпляром которого он не является. Например, оба следующих фрагмента кода приведут к ClassCastException
:
1
2
|
Object x = new Integer(0);
System.out.println((String)x);
|
1
|
ImageView image = (ImageView)context.findViewById(R.id.button);
|
Это сообщение об ошибке содержит информацию о строке, которая вызывает ошибку ClassCastException
, поэтому перейдите к этой части вашего проекта, проверьте, какие объекты ClassCastException
туда, и устраните любое несоответствие.
Если вы не можете определить проблему с приведением типов, подумайте, недавно ли вы переместили некоторые Views
в файлы ресурсов макета, так как некоторые пользователи сообщали о возникновении ClassCastException
после перестановки своих Views
. Если вы подозреваете, что это может быть причиной вашего ClassCastException
, то попросите Android Studio ClassCastException
файлы макета с нуля, выполнив цикл очистки / восстановления. Это заставляет Android Studio правильно зарегистрировать последние изменения макета, что должно разрешить ваше ClassCastException
.
8. NullPointerException
В Java, когда вы объявляете ссылочную переменную, вы фактически создаете указатель на объект. Вы можете объявить, что объект в данный момент указывает на неизвестный фрагмент данных, назначая нулевое значение для ссылки на этот объект. Нулевые значения могут быть полезны при кодировании некоторых шаблонов проектирования, но если вы встретите исключение NullPointerException (NPE), то это означает, что вы пытались использовать ссылку, указывающую на нулевое значение, как если бы она ссылалась на объект. Поскольку в том месте, куда указывает эта ссылка, нет кода для выполнения, вы получаете NPE.
NPE обычно сопровождается информацией о том, где было обнаружено это исключение, поэтому монитор Logcat должен содержать точную строку, где произошла эта ошибка. Перейдите к этой области вашего проекта и определите нулевую ссылку. Затем вам нужно будет найти место, где должно быть установлено значение, и установить его.
Метод findViewById
также может возвращать значение NULL, если запрошенное View
не может быть найдено, поэтому, если ваш NPE находится в строке, содержащей findViewById
, убедитесь, что вы инициализировали макет, содержащий это View
. Также обратите внимание на любые орфографические ошибки или опечатки, которые могли проникнуть в ваш вызов findViewById
, поскольку они также могут привести к NPE.
Чтобы избежать появления NPE в вашем проекте, убедитесь, что все ваши объекты инициализированы, прежде чем пытаться их использовать, и всегда проверяйте, что переменная не равна нулю, прежде чем запрашивать метод или поле у этого объекта.
9. Приложение не отвечает ошибка
Это ошибка, которая появляется в виде диалога на устройстве Android или AVD, которое вы используете для тестирования своего приложения. Ошибка « Приложение не отвечает» (ANR) возникает, когда пользовательский интерфейс вашего приложения зависает и не реагирует на ввод данных пользователем более пяти секунд. Обычно это происходит потому, что ваше приложение пытается выполнять длительные или интенсивные операции в основном потоке пользовательского интерфейса Android.
В Android основной поток пользовательского интерфейса отвечает за отправку всех событий пользовательского ввода в соответствующие виджеты пользовательского интерфейса и за обновление пользовательского интерфейса вашего приложения. Однако этот поток может обрабатывать только одну задачу за раз, поэтому, если вы заблокируете основной поток с помощью каких-либо длительных или интенсивных операций, ваш пользовательский интерфейс будет полностью не отвечать до тех пор, пока эта задача не будет завершена.
Если во время тестирования приложения вы сталкиваетесь с сообщением ANR, вам определенно нужно взглянуть на работу, которую вы выполняете в главном потоке. Однако, если вы явно не сталкиваетесь с этой ошибкой, а заметили, что ваше приложение иногда чувствует себя вялым или медленным, это указывает на то, что вы находитесь на грани ошибки ANR, и еще раз вы должны взглянуть на состояние вашего потока пользовательского интерфейса.
Чтобы устранить ошибки ANR (и ошибки, близкие к ANR), необходимо определить все операции, которые могут выполняться медленно или требующие значительной вычислительной мощности, а затем переместить их из основного потока. Вы делаете это, создавая рабочий поток, в котором эти операции могут выполняться с нулевым риском блокировки основного потока пользовательского интерфейса.
Существует несколько способов создания дополнительных потоков, но самое простое решение — использовать AsynTask
, поскольку этот класс уже содержит собственный рабочий поток и onPostExecute()
вызов onPostExecute()
, который можно использовать для связи с основным потоком пользовательского интерфейса Android.
Однако AsyncTasks лучше подходят для выполнения коротких фоновых операций, поэтому, если вам нужно выполнить длительную операцию, вам следует вместо этого использовать Service
или IntentService
.
Хотя перенос длительных и интенсивных задач из основного потока будет иметь наибольшее влияние на производительность вашего приложения, рекомендуется выполнять как можно меньше работы с основным потоком пользовательского интерфейса. Даже выполнение небольшого количества ненужного кода в главном потоке может повлиять на отзывчивость вашего приложения, поэтому, как только вы успешно переместили все свои длительные и интенсивные операции, вы должны посмотреть, есть ли еще код, который вы можете отодвинуть основной поток.
10. Только исходный поток, создавший иерархию представлений, может касаться его представлений.
В Android вы можете обновить свой интерфейс только из основного потока. Если вы попытаетесь получить доступ к элементам пользовательского интерфейса из любого другого потока, то вы столкнетесь с этой ошибкой.
Чтобы решить эту проблему, определите часть фоновой задачи, которая пытается обновить пользовательский интерфейс, и переместите ее в runOnUiThread
, например:
1
2
3
4
5
6
7
8
9
|
runOnUiThread(new Runnable() {
@Override
public void run() {
//Update your UI//
}
});
|
Кроме того, вы можете использовать обработчик или выполнять фоновую работу в AsyncTask, так как вы можете общаться с основным потоком, используя метод обратного вызова onPostExecute()
. Наконец, если вы обнаружите, что регулярно переключаетесь между потоками, то вы можете захотеть заглянуть в RxAndroid , поскольку эта библиотека позволяет вам создавать новый поток, планировать работу, выполняемую в этом потоке, а затем публиковать результаты в основном потоке, все с помощью всего лишь нескольких строк кода.
11. NetworkOnMainThreadException
Это исключение выдается, когда ваше приложение пытается выполнить сетевые операции в главном потоке, такие как отправка запросов API, подключение к удаленной базе данных или загрузка файла. Поскольку сетевые операции могут быть трудоемкими и трудоемкими, они с высокой вероятностью блокируют основной поток, поэтому Android 3.0 (Honeycomb) и выше выдает эту ошибку всякий раз, когда вы пытаетесь сделать сетевой запрос в основном потоке.
Если вы обнаружите NetworkOnMainThreadException
, найдите сетевой код, который выполняется в вашем основном потоке, и переместите его в отдельный поток.
Если вам нужно часто делать сетевые запросы, вы можете взглянуть на Volley , HTTP-библиотеку, которая запускает собственные фоновые потоки, так что все сетевые запросы по умолчанию выполняются вне основного потока.
12. Активность просочилась в окно, изначально добавленное сюда
Эта ошибка возникает при попытке показать диалог после выхода из действия. Если вы столкнулись с этой проблемой, то откройте Activity и убедитесь, что вы правильно onDestroy()
диалог, вызвав onPause()
методе onDestroy()
или onPause()
вашей Activity, например:
1
2
3
4
5
6
7
8
|
@Override
protected void onDestroy()
{
super.onDestroy();
if(pDialogue!= null)
pDialogue.dismiss();
}
|
13. OutofMemoryError
Эта ошибка возникает, когда ваше приложение делает запрос памяти, который система не может удовлетворить. Если вы столкнулись с этим сообщением об ошибке, начните с исключения наиболее распространенных ошибок управления памятью. Убедитесь, что вы забыли отменить регистрацию всех своих широковещательных приемников и что вы остановили все свои службы; убедитесь, что вы не держите ссылки в каких-либо статических переменных-членах, и что вы не пытаетесь загружать большие растровые изображения.
Если вы исключили все очевидные причины OutOfMemoryError
, то вам нужно будет глубже изучить и проанализировать, как именно ваше приложение распределяет память, поскольку есть вероятность, что есть несколько областей, в которых вы можете улучшить управление памятью вашего приложения.
В Android Studio есть целая область, предназначенная для того, чтобы помочь вам проанализировать использование памяти вашим приложением, поэтому начните с выбора View> Tools Window на панели инструментов Android Studio. На этом этапе вы увидите либо опцию Android Monitor, либо Android Profiler , в зависимости от установленной версии Android Studio.
Мы уже обсуждали работу с монитором памяти на этом сайте, но поскольку Android Profiler является новым дополнением к Android Studio, давайте кратко рассмотрим его основные функции.
Когда вы открываете Android Profiler, он начинает автоматически записывать три фрагмента информации.
Поскольку мы заинтересованы в том, как наше приложение использует память, щелкните раздел « Память », чтобы запустить « Профилировщик памяти» .
Memory Profiler состоит из временной шкалы, которая отображает различные виды памяти, в настоящее время выделяемые вашим приложением, например, Java , native и stack . Над этим графиком вы найдете ряд значков, которые вы можете использовать для запуска различных действий:
- Принудительное событие сбора мусора.
- Сделайте снимок Hprof памяти приложения. Это снимок всех объектов в куче вашего приложения, включая вид объектов, выделяемых вашим приложением, количество выделенных объектов и объем занимаемого этими объектами пространства.
- Запись выделения памяти. Записывая распределения памяти вашего приложения при выполнении определенных действий, вы можете определить конкретные операции, которые занимают слишком много памяти.
Чтобы определить части вашего приложения, которые отвечают за OutOfMemoryError
, потратьте некоторое время на взаимодействие с вашим приложением и OutOfMemoryError
, как изменяется распределение памяти вашего приложения в ответ на различные действия. После того как вы определили раздел вашего проекта, который вызывает проблему, потратьте некоторое время на его изучение на предмет утечек памяти, а также любых недостатков, связанных с использованием памяти.
Вывод
В этой статье мы рассмотрели 13 сообщений об ошибках, с которыми вы, скорее всего, столкнетесь при разработке для Android. Мы обсудили все различные факторы, которые могут способствовать возникновению этих ошибок, и шаги, которые необходимо предпринять для их устранения.
Если вас преследует сообщение об ошибке, которое мы не рассмотрели, то первым шагом должно быть копирование / вставка всего сообщения об ошибке в Google, поскольку это часто приводит к появлению тем и сообщений в блогах, где люди обсуждают, как решить проблему. эта конкретная ошибка.
И, если вы не можете найти решение где-либо в Интернете, вы всегда можете обратиться к сообществу Android за помощью, отправив свой вопрос в Stack Overflow .
Пока вы здесь, ознакомьтесь с некоторыми другими нашими публикациями по разработке приложений для Android!