Как удалить XLogs с Андроида: что это за вирус?
Если вы увидели у себя XLogs на Андроид, что это? Как удалить вирус и больше его не видеть?
Разберемся по порядку. Пользователи Android устройств стали сталкиваться с такой проблемой: ранее не известная вирусная программа XLog заражает смартфоны и планшеты.
Защита Google Play чаще остальных предупреждает о возможном риске для устройства. Но откуда берется вирус и как от него избавиться как можно быстрее?
Что это за вирус такой?
XLog или XLogs — это сравнительно новый вирус, созданный для получения и отслеживания действий пользователя системы Android. Главной задачей этого трояна является получение информации из контактов, СМС и установленных программ на устройстве, а также регистрация серфинга и истории поисков.
Обратите внимание:
Все собранные данные проходят через обработку и на устройство в итоге проникают рекламные баннеры. Также вирус XLog может вшиваться в уже установленные программы, даже если ранее был установлен антивирус.
Как вирус появляется на Андроиде?
Вирус попадает на устройство через скаченные программы, текстовые файлы и ненадежные приложения из Google Play. Если операционная система уже заражена, то она открывает так называемый портал, который создал вирус, для других троянов.
Обратите внимание:
Как его удалить?
Для того, чтобы удалить вирус, нужно произвести несколько действий:
- Зайти в Google Play, в меню выбрать пункт «Play Защита» и сделать активацию. Такая защита произведет сканирование вашего устройства и отобразит ненадежные программы с кодом, идентичным вирусному. Также если программы, которые показаны после сканирования вам не известны и сомнительны, то удаляйте их. А если программа, по вашему мнению, надежна, то свяжитесь с ее администраторами и расскажите о сложившейся ситуации.
- Скачайте антивирус для сканирования. Это может быть Касперский, Dr.Web и другие. На Play Маркет их много, на любой вкус.
- Произведите удаление всех файлов из папки загрузки (Downloads).
- В пункте «Безопасность» найдите «Администрирование». Все это находится в настройках устройства смартфона. Просмотрите список процессов, у которых есть доступ «Админ» и снимите все метки с незнакомых и сомнительных.
- Разрешения на смартфоне также очистите от ненужных. Это могут быть СМС, аккаунты к социальным сетям или файлы мультимедиа.
- Произведите смену паролей от основных аккаунтов социальных сетей, почты и сервисов Google.
Если все, что выше сказано, не помогло, то произведите «Сброс» настроек.
Обратите внимание:
Все эти действия должны помочь вам избавиться от вирусных утилит. Теперь вы знаете, что это — XLogs на Андроид и знаете, как удалить вирус. Если остались вопросы, спрашивайте в комментариях. Постараемся разобраться.
Источник: stink3r.ru
Гайд по отладке Android-приложения: ищем баги и читаем логи
Иногда в приложении встречаются ошибки, которые нельзя увидеть даже после запуска. Например, код компилируется, проект запускается, но результат далёк от желаемого: приложение падает или вдруг появляется какая-то ошибка (баг). В таких случаях приходится «запасаться логами», «брать в руки отладчик» и искать ошибки.
Часто процесс поиска и исправления бага состоит из трёх шагов:
- Воспроизведение ошибки — вы понимаете, какие действия нужно сделать в приложении, чтобы повторить ошибку.
- Поиск места ошибки — определяете класс и метод, в котором ошибка происходит.
- Исправление ошибки.
Если приложение не падает и чтение логов ничего не даёт, то найти точное место ошибки в коде помогает дебаггер (отладчик) — инструмент среды разработки.
Чтобы посмотреть на логи и воспользоваться дебаггером, давайте напишем простое тестовое (и заведомо неправильное) приложение, которое даст нам все возможности для поиска ошибок.
Это будет приложение, которое сравнивает два числа. Если числа равны, то будет выводиться результат «Равно», и наоборот. Начнём с простых шагов:
- Открываем Android Studio.
- Создаём проект с шаблоном Empty Activity.
- Выбираем язык Java, так как его, как правило, знают больше людей, чем Kotlin.
Нам автоматически откроются две вкладки: activity_main.xml и MainActivity.java. Сначала нарисуем макет: просто замените всё, что есть в activity_main.xml, на код ниже:
Можете запустить проект и посмотреть, что получилось:
Теперь оживим наше приложение. Скопируйте в MainActivity этот код:
В этом коде всё просто:
- Находим поля ввода, поле с текстом и кнопку.
- Вешаем на кнопку слушатель нажатий.
- По нажатию на кнопку получаем числа из полей ввода и сравниваем их.
- В зависимости от результата выводим «Равно» или «Не равно».
Запустим приложение и введём буквы вместо чисел:
Нажмём на кнопку, и приложение упадёт! Время читать логи. Открываем внизу слева вкладку «6: Logcat» и видим:
Читать логи просто: нужно найти красный текст и прочитать сообщение системы. В нашем случае это java.lang.NumberFormatException: For input string: «f». Указан тип ошибки NumberFormatException, который говорит, что возникла какая-то проблема с форматированием числа. И дополнение: For input string: «f». Введено “f”. Уже можно догадаться, что программа ждёт число, а мы передаём ей символ.
Далее в красном тексте видно и ссылку на проблемную строку: at com.example.appdebugging.MainActivity$1.onClick(MainActivity.java:26). Проблема в методе onClick класса MainActivity, строка 24. Можно просто кликнуть по ссылке и перейти на указанную строку:
int firstInt = Integer.parseInt(first.getText().toString());
Конечно, метод parseInt может принимать только числовые значения, но никак не буквенные! Даже в его описании это сказано — и мы можем увидеть, какой тип ошибки этот метод выбрасывает (NumberFormatException).
Здесь мы привели один из примеров. Типов ошибок может быть огромное количество, все мы рассматривать не будем. Но все ошибки в Logcat’е указываются по похожему принципу:
- красный текст;
- тип ошибки — в нашем случае это NumberFormatException;
- пояснение — у нас это For input string: «f»;
- ссылка на строку, на которой произошла ошибка — здесь видим MainActivity.java:26.
Исправим эту ошибку и обезопасим себя от некорректного ввода. Добавим в наши поля ввода android_inputType=»number», а остальной код оставим без изменений:
Теперь можем вводить только числа. Проверим, как работает равенство: введём одинаковые числа в оба поля. Всё в порядке:
На равенство проверили. Введём разные числа:
Тоже равно. То есть приложение работает, ничего не падает, но результат не совсем тот, который требуется. Наверняка вы и без дебаггинга догадались, в чём ошибка, потому что приложение очень простое, всего несколько строк кода. Но такие же проблемы возникают в приложениях и на миллион строк. Поэтому пройдём по уже известным нам этапам дебаггинга:
- Воспроизведём ошибку: да, ошибка воспроизводится стабильно с любыми двумя разными числами.
- Подумаем, где может быть ошибка: наверняка там, где сравниваются числа. Туда и будем смотреть.
- Исправим ошибку: сначала найдём её с помощью дебаггера, а когда поймём, в чём проблема, — будем исправлять.
И здесь на помощь приходит отладчик. Для начала поставим точки останова сразу в трёх местах:
Чтобы поставить или снять точку останова, достаточно кликнуть левой кнопкой мыши справа от номера строки или поставить курсор на нужную строку, а затем нажать CTRL+F8. Почему мы хотим остановить программу именно там? Чтобы посмотреть, правильные ли числа сравниваются, а затем определить, в какую ветку в нашем ветвлении заходит программа дальше. Запускаем программу с помощью сочетания клавиш SHIFT+F9 или нажимаем на кнопку с жучком:
Появится дополнительное окно, в котором нужно выбрать ваш девайс и приложение:
Вы в режиме дебага. Обратите внимание на две вещи:
- Точки останова теперь помечены галочками. Это значит, что вы находитесь на экране, где стоят эти точки, и что дебаггер готов к работе.
- Открылось окно дебага внизу: вкладка «5: Debug». В нём будет отображаться необходимая вам информация.
Введём неравные числа и нажмём кнопку «РАВНО?». Программа остановилась на первой точке:
- Сразу подсвечивается синим строка, где программа остановлена: в окне кода на 28-й строке и в левом окне отладчика (там даже можно увидеть, какой метод вызван, — onClick).
- В правом, основном окне отладчика, всё гораздо интереснее. Здесь можно увидеть инстансы наших вью (answer, first, second), в конце которых серым текстом даже отображаются их id. Но интереснее всего посмотреть на firstInt и secondInt. Там записаны значения, которые мы сейчас будем сравнивать.
Как видим, значения именно такие, какие мы и ввели. Значит, проблема не в получении чисел из полей. Давайте двигаться дальше — нам нужно посмотреть, в правильную ли ветку мы заходим. Для этого можно нажать F8 (перейти на следующую строку выполнения кода). А если следующая точка останова далеко или в другом классе, можно нажать F9 — программа просто возобновит работу и остановится на следующей точке. В интерфейсе эти кнопки находятся здесь:
Остановить дебаггер, если он больше не нужен, можно через CTRL+F2 или кнопку «Стоп»:
В нашем случае неважно, какую кнопку нажимать (F9 или F8). Мы сразу переходим к следующей точке останова программы:
Ветка правильная, то есть логика программы верна, числа firstInt и secondInt не изменились. Зато мы сразу видим, что подпись некорректная! Вот в чём была ошибка. Исправим подпись и проверим программу ещё раз.
Мы уже починили два бага: падение приложения с помощью логов и некорректную логику (с помощью отладчика). Хеппи пас (happy path) пройден. То есть основная функциональность при корректных данных работает. Но нам надо проверить не только хеппи пас — пользователь может ввести что угодно. И программа может нормально работать в большинстве случаев, но вести себя странно в специфических состояниях. Давайте введём числа побольше и посмотрим, что будет:
Не сработало — программа хочет сказать, что 1000 не равна 1000, но это абсурд. Запускаем приложение в режиме отладки. Точка останова уже есть. Смотрим в отладчик:
Числа одинаковые, что могло пойти не так? Обращаем внимание на тип переменной — Integer. Так вот в чём проблема! Это не примитивный тип данных, а ссылочный. Ссылочные типы нельзя сравнивать через ==, потому что будут сравниваться ссылки объектов, а не они сами.
Но для Integer в Java есть нюанс: Integer может кешироваться до 127, и если мы вводим по единице в оба поля числа до 127, то фактически сравниваем просто int. А если вводим больше, то получаем два разных объекта. Адреса у объектов не совпадают, а именно так Java сравнивает их.
Есть два решения проблемы:
- Изменить тип Integer на примитив int.
- Сравнивать как объекты.
Не рекомендуется менять тип этих полей в реальном приложении: числа могут приходить извне, и тип лучше оставлять прежним. Изменим то, как мы сравниваем числа:
if (firstInt.equals(secondInt)) answer.setText(«Равно»); > else answer.setText(«Не равно»); >
Всё работает. Наконец-то! Хотя… Давайте посмотрим, что будет, если пользователь ничего не введёт, но нажмёт на кнопку? Приложение опять упало… Смотрим в логи:
Опять NumberFormatException, при этом строка пустая. Давайте поставим точку останова на 26-й строке и заглянем с помощью отладчика глубже.
Нажмём F8 — и перейдём в глубины операционной системы:
Интересно! Давайте обернём код в try/catch и посмотрим ошибке в лицо. Если что, поправим приложение. Выделяем код внутри метода onClick() и нажимаем Ctrl+Alt+T:
Выбираем try / catch, среда разработки сама допишет код. Поставим точку останова. Получим:
Запускаем приложение и ловим ошибку:
Действительно, как и в логах, — NumberFormatException. Метод parseInt выбрасывает исключение, если в него передать пустую строку. Как обрабатывать такую проблему — решать исключительно вам. Два самых простых способа:
- Проверять получаемые строки first.getText().toString() и second.getText().toString() на пустые значения. И если хоть одно значение пустое — говорить об этом пользователю и не вызывать метод parseInt.
- Или использовать уже готовую конструкцию try / catch:
Теперь-то точно всё в порядке! Хотя профессиональным тестировщикам это приложение никто не отдавал: поищете ещё ошибки? 🙂
Источник: gb.ru
Log collection что это за программа на андроид
Лог (Log) – это специальный файл, в котором указывается последовательность действий пользователя и программы. Определение довольно сложное, но если говорить проще, то в данном файле может содержаться информация о дате и времени конкретного запроса, IP-адресе, местоположении пользователя, используемом браузере или приложении.
Подобные файлы часто передаются разработчикам в случае непредвиденной ошибки программы. Это позволяет программистам более детально изучить проблему и найти оптимальное решение. Просто так получить логи не получится. Для этого придется использовать специальную программу на компьютере. Но перед этим на смартфоне включается отладка по USB.
Кто не знает, то все действия выполняются в разделе «Для разработчиков».
Затем телефон через кабель USB подключается к ПК. На компьютере запускается утилита ADB, и вводится команда adb logcat –v threadtime > c:log.txt. После завершения работы можно будет открыть текстовый файл и просмотреть необходимые сессии.
Источник: mi-faq.ru
Log collection что это за программа на андроид
Страницы
среда, 26 сентября 2012 г.
Логирование в Android
Важный этап любой разработки приложений – это логирование. Не существует серьезных проектов, которые были бы написаны хотя бы без одного бага. Чтобы отследить все перемещения и изменения объектов в приложении используется лог. Например: запросы и ответы от сервера, значения массивов и коллекций, вывод обработчиков ошибок и другое. Рассмотрим, как реализовать логирование в приложение так, чтобы это было удобно.
В Android существует свой класс для работы c логами: android . util . Log . Его мы и будем использовать для вывода информации в LogCat DDMS . Но мы его немного модифицируем для более удобного использования.
Во-первых, каждый раз, когда мы выводим в лог какую-нибудь информацию, затрачивается небольшое количество времени. Если выводить в лог очень часто, то это время может сказаться на производительности приложения. Поэтому, перед публикацией нашего приложения, необходимо все наши логи отключить. А если их достаточно много? В этой статье мы рассмотрим класс, позволяющий отключить все логи изменив всего один параметр.
Во-вторых, публикация приложения невозможна, если в манифесте приложения установлен парметр android_debuggable=»true», который мы использовали для того, чтобы отследить какие-либо участки кода в приложении. В статье я приведу пример, как в зависимости от этого параметра, выводить или не выводить информацию в лог.
В-третьих, иногда необходимо переопределить вывод лога не в консоль, а в другой поток вывода. На примере данной статьи мы попробуем разработать приложение, которое будет выводить наш лог в файл на SD -карте.
Разработка
Создадим новый класс для логирования: LogSystem , с одним атрибутом класса, который будет отвечать за возможность вывода информации в лог.
public final class LogSystem < private static boolean mLoggingEnabled = true; private LogSystem() < >public static void setDebugLogging(boolean enabled) < mLoggingEnabled = enabled; >>
Переопределим все методы вывода андроидовского класса Log :
public static int v(String tag, String msg) < int result = 0; if (mLoggingEnabled) < result = Log.v(tag, msg); >return result; > public static int v(String tag, String msg, Throwable tr) < int result = 0; if (mLoggingEnabled) < result = Log.v(tag, msg, tr); >return result; > public static int d(String tag, String msg) < int result = 0; if (mLoggingEnabled) < result = Log.d(tag, msg); >return result; > public static int d(String tag, String msg, Throwable tr) < int result = 0; if (mLoggingEnabled) < result = Log.d(tag, msg, tr); >return result; > public static int i(String tag, String msg) < int result = 0; if (mLoggingEnabled) < result = Log.i(tag, msg); >return result; > public static int i(String tag, String msg, Throwable tr) < int result = 0; if (mLoggingEnabled) < result = Log.i(tag, msg, tr); >return result; > public static int w(String tag, String msg) < int result = 0; if (mLoggingEnabled) < result = Log.w(tag, msg); >return result; > public static int w(String tag, String msg, Throwable tr) < int result = 0; if (mLoggingEnabled) < result = Log.w(tag, msg, tr); >return result; > public static int w(String tag, Throwable tr) < int result = 0; if (mLoggingEnabled) < result = Log.w(tag, tr); >return result; > public static int e(String tag, String msg) < int result = 0; if (mLoggingEnabled) < result = Log.e(tag, msg); >return result; > public static int e(String tag, String msg, Throwable tr) < int result = 0; if (mLoggingEnabled) < result = Log.e(tag, msg, tr); >return result; >
Мы разработали управляемый лог. Атрибут mLoggingEnabled указывает приложению, надо ли выводить сообщение или нет.
Для того чтобы использовать наш класс, достаточно только вызвать любой соответствующий статический метод.
Рассмотрим следующий пример. Мы хотим отследить весь жизненный цикл приложения.
Debuggable
Для того чтобы выводить или не выводить информацию в лог в зависимости от значения аттрибута android:debuggable, необходимо в методе onCreate () главного Activity написать:
boolean isDebuggable = (0 != (getApplicationInfo().flags LogSystem.setDebugLogging(isDebuggable);
Лог в файл
Для логирования в файл на SD -карте, сначала необходимо добавить permission в манифест приложения:
Теперь доработаем класс LogSystem , чтобы можно было выводить лог в файл.
private static final String PATH = «sdcard/log.dat»;
public static int logInFile(String tag, String msg) < int result = 0; File file = new File(PATH); try < if (!file.exists()) < file.createNewFile(); >String timeLog = new SimpleDateFormat(«dd.MM.yy hh:mm:ss»).format(new Date()); BufferedWriter bw = new BufferedWriter(new FileWriter(file, true)); bw.append(timeLog+» (» + tag + «)t» + msg + «n»); bw.close(); result = 1; > catch (IOException e) < e.printStackTrace(); >return result; >
Мы добавили статический атрибут, который будет указывать путь к файлу нашего лога на SD-карте. И разработали метод для записи информации в этот файл.
Модернизируем наше приложение с учетом новых изменений. Заменим LogSystem.i(TAG, «onCreate()»); в методе onCreate() нашего Activity на LogSystem.logInFile(TAG, » onCreate ()»);
Пример записи в логе будет следующий:
19.09.12 14:12:01 (MainActivity) onCreate ()
Возможные доработки
- Другой способ вывода в файл
Если мы хотим использовать статические методы v (), d (), e (), i (), w () для вывода сразу в файл, то можно изменить класс LogSystem следующим образом (на примере метода e ()):
public static int logInFile(int priority, String tag, String msg) < int result = 0; File file = new File(PATH); try < if (!file.exists()) < file.createNewFile(); >String timeLog = new SimpleDateFormat(«dd.MM.yy hh:mm:ss»).format(new Date()); BufferedWriter bw = new BufferedWriter(new FileWriter(file, true)); bw.append(priority + «t» + timeLog + » (» + tag + «)t» + msg + «n»); bw.close(); result = 1; > catch (IOException e) < e.printStackTrace(); >return result; > public static int e(String tag, String msg) < int result = 0; if (mLoggingEnabled) < result = logInFile(Log.ERROR, tag, msg); >return result; >
- Усовершенствование методов вывода
Так же возможно усовершенствовать методы вывода, например, дополнительным параметром int placeForLog , который показывал бы, куда выводить лог
public static int e(String tag, String msg, int placeForLog) < int result = 0; if (mLoggingEnabled) < switch (placeForLog) < case 0: result = logInFile(Log.ERROR, tag, msg); break; case 1: result = Log.e(tag, msg); break; >return result; >
Источник: snowpard-android-ru.blogspot.com