В новом ядре используется механизм исключений (exceptions ).

Исключительная ситуация (в которой может быть выброшено исключение) - нетипичная ситуация, при которой не имеет смысла продолжать выполнение базового алгоритма.


Примеры

Если пользователь отправил форму с пустым полем Имя , то это - не исключительная ситуация. Это обычная ожидаемая ситуация, которая должна быть обработана соответствующим образом.

Если же при вызове метода API для изменения элемента инфоблока был указан пустой id элемента, то это исключительная ситуация. Она не ожидаема и продолжать изменение элемента не имеет смысла.

Если метод ожидает id пользователя, а вы передаёте строку, то это - исключение, так как метод не знает что делать со строкой в данном случае.

Если метод GetList принимает фильтр timestamp , а разработчик написал tymestamp , то это будет исключением.


Иерархия исключений

Все исключения D7 наследуются от встроенного в PHP класса \Exception , который присутствует в PHP начиная с версии 5.1. У данного класса есть не переопределяемые методы getMessage() , getCode() , getFile() , getLine() , getTrace() , getTraceAsString() , а так же переопределяемый метод __toString() .

Есть понятие иерархии исключений. Оно нужно для того, чтобы можно было их (исключения) обработать, посмотреть какое из них сработало и в зависимости от этого предпринять какие-то действия. Общая схема иерархии имеет вид:

  • \Exception
    • - базовый класс всех системных исключений
      • - базовый класс всех исключений файлового ввода-вывода
        • - исключение при удалении файла
        • - отсутствие требуемого файла
        • - исключение при открытии файла
        • - не корректный путь
        • - файл не открыт
      • - ошибка в конфигурации
      • - ошибка безопасности
        • - исключения ошибок подписи.
      • - базовый класс исключений, связанных с входящими параметрами методов
        • - параметр должен быть не пустым
        • - параметр вне допустимого диапазона
        • - параметр не допустимого типа
      • - базовый класс для исключений БД
        • - исключение при соединении
        • - исключение при выполнении запроса
      • - вызывается, если функционал не поддерживается
      • - вызывается, если функционал должен поддерживаться, но пока не реализован
    • - исключение выводится когда свойства объекта не валидны.
    • - выводит исключение когда объект не существует.
    • - исключение выводится, если объект не может быть создан.
    • - исключение в загрузчике

Bitrix\Main\SystemException базовый класс всех системных исключений, от которого наследуются все остальные исключения. Данный класс переопределяет конструктор системного класса \Exception . Если системный класс на вход принимает сообщение и код ошибки:

В Bitrix Framework это делается таким образом:

/** * Searches connection parameters (type, host, db, login and password) by connection name * * @param string $name Connection name * @return array|null * @throws \Bitrix\Main\ArgumentTypeException * @throws \Bitrix\Main\ArgumentNullException */ protected function getConnectionParameters($name) {}

Игнорирование исключений

Иногда необходимо чтобы произошедшая ошибка не приводила к прерыванию выполнения скрипта. Пример такой реализации можно рассмотреть в самом продукте в виде работы административной страницы модуля CDN.

Если включён CDN, то вверху страницы отображается информация о расходе трафика. В коде это реализовано так:

$cdn_config = CBitrixCloudCDNConfig::getInstance()->loadFromOptions(); $APPLICATION->SetTitle(GetMessage("BCL_TITLE")); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); if (is_object($message)) echo $message->Show(); if (CBitrixCloudCDN::IsActive()) { try { if ($cdn_config->getQuota()->isExpired()) $cdn_config->updateQuota(); $cdn_quota = $cdn_config->getQuota(); if ($cdn_quota->getAllowedSize() > 0.0 || $cdn_quota->getTrafficSize() > 0.0) { CAdminMessage::ShowMessage(array("TYPE" => "PROGRESS", "DETAILS" => "

".GetMessage("BCL_CDN_USAGE", array("#TRAFFIC#" => CFile::FormatSize($cdn_quota->getTrafficSize()), "#ALLOWED#" => CFile::FormatSize($cdn_quota->getAllowedSize()),))."

Добавление выбранного приложения в список исключений брандмауэра Windows — стандартная процедура на компьютерах, работающих под управлением ОС Windows. Выполнение данной операции подразумевает наличие администраторского доступа к ресурсам системы.

Инструкция

Для выполнения процедуры добавления выбранной программы в список исключений файрвола Windows в версии ХР вызовите главное системное меню, нажав кнопку «Пуск», и перейдите в пункт «Настройка». Раскройте ссылку «Панель управления» и перейдите на вкладку «Брандмауэр Windows». Выберите закладку «Исключения» открывшегося диалогового окна и нажмите кнопку «Добавить программу».

Выделите нужное приложение в списке (при отображении программы) и подтвердите выполнение выбранного действия, нажав кнопку OK. Воспользуйтесь кнопкой «Обзор» при отсутствии необходимого приложения в списке и укажите путь к исполняемому файлу выбранной программы. Воспользуйтесь командой «Открыть» и сохраните сделанные изменения, нажав кнопку OK (для Windows XP).

Вызовите главное меню ОС Windows версии 7, нажав кнопку «Пуск», и перейдите в пункт «Панель управления». Раскройте ссылку «Система и безопасность» и разверните узел «Брандмауэр Windows». Выберите раздел «Разрешение запуска программ через брандмауэр Windows» и откройте ссылку «Разрешить другую программу…» Выберите нужное приложение в каталоге или воспользуйтесь кнопкой «Обзор» для указания пути к исполняемому файлу выбранной программы. Сохраните сделанные изменения, нажав кнопку OK (для Windows 7).

Альтернативным методом выполнения той же процедуры может служить использование команды netsh с контекстом firewall для изменения параметров настройки брандмауэра Windows. Обратите внимание на то, что в некоторых случаях закладка «Общие» может быть неактивной. Это означает, что изменения параметров настройки брандмауэра запрещены групповой политикой или недостаточно прав пользователя для выполнения такой операции. Следует также помнить, что программа файрвола в Windows Server 2003 по умолчанию не включена.

Большинство пользователей активно используют антивирусы, чтобы обеспечить безопасность системы, паролей, файлов. Хорошее антивирусное ПО всегда может обеспечить защиту на высоком уровне, вот только многое зависит еще и от действий юзера. Многие приложения дают возможность выбора, что сделать с вредоносной, по их мнению, программой или файлами. Но некоторые не церемонятся и сразу удаляют подозрительные объекты и потенциальные угрозы.

Проблема в том, что каждая защита может сработать впустую, посчитав опасной безвредную программу. Если пользователь уверен в безопасности файла, то ему стоит попытаться поставить его в исключение. Во многих антивирусных программах это делается по-разному.

Чтобы добавить папку в исключения антивируса, нужно немного покопаться в настройках. Также, стоит учитывать, что у каждой защиты свой интерфейс, а это значит, что путь добавления файла может отличатся от других популярных антивирусов.

Kaspersky Anti-Virus

Avast Free Antivirus

Avira

360 Total Security

Антивирус 360 Total Security многим отличается от других популярных защит. Гибкий интерфейс, поддержка русского языка и большое количество полезных инструментов доступны вместе с эффективной защитой, которую можно настроить под свой вкус.


Так же делается и с папкой, но для этого выбирается «Добавить папку» .

Вы выбираете в окне то, что вам нужно и подтверждаете. Так можно поступить и с приложением, которое вы хотите исключить. Просто укажите его папку и она не будет проверяться.

ESET NOD32

Защитник Windows 10

Стандартный для десятой версии антивирус по большинству параметров и функциональных возможностей не уступает решениям от сторонних разработчиков. Как и все рассмотренные выше продукты, он тоже позволяет создавать исключения, причем внести в этот список можно не только файлы и папки, но и процессы, а также конкретные расширения.

  1. Запустите Защитник и перейдите к разделу «Защита от вирусов и угроз» .
  2. Далее воспользуйтесь ссылкой «Управление настройками» , расположенной в блоке «Параметры защиты от вирусов и других угроз» .
  3. В блоке «Исключения» нажмите на ссылку «Добавление или удаление исключений» .
  4. Нажмите по кнопке «Добавить исключение» ,


    определите в выпадающем списке его тип


    и, в зависимости от выбора, укажите путь к файлу или папке


    либо введите имя процесса или расширение, после чего нажмите по кноке, подтверждающей выбор или добавление.

Внимание! Описанные ниже настройки есть на каждом телефоне Xiaomi, но в зависимости от модели их месторасположение может немного отличаться. Но если их не выполнить, телефон не будет записывать звонки. Если у вас возникнут трудности, обращайтесь к нам, поможем.

  1. Откройте в списке программ Безопасность (или Центр безопасности) > Разрешения > Управление автозапуском, и включите приложение ЗвонкиОнлайн. Также в некоторых прошивках в этом же центре безопасности нужно разрешить приложению запись звонков.
  2. Откройте настройки телефона, далее Дополнительно. Выберите раздел Батарея и производительность и а) найдите меню Фоновый режим . Установите уровень ограничения Стандартный . Далее нажмите Приложения , потом на ЗвонкиОнлайн и назначьте ему Нет ограничений . б) В меню Экономия энергии > Выбрать приложения Нет ограничений . в) В меню Активность приложений (Выбор приложений) нажмите на ЗвонкиОнлайн и выберите Нет ограничений. г) Если не нашли таких настроек в одном из этих меню, просмотрите остальные подменю. В одном из них точно есть.
  3. Еще рекомендуем дополнительно закрепить приложение, чтобы оно точно не закрылось при ручном запуске процедуры очистки приложений пользователем телефона. Находясь на рабочем столе телефона, нажмите сенсорную кнопку открытия списка запущенных приложений (обынчо самая левая кнопка на лицевой стороне телефона), далее потяните наше приложение вниз, далее нажмите на замочек (кнопку Закрепить).

Смартфоны Meizu

  1. Откройте в списке программ Безопасность (или Центр безопасности) , во вкладке Разрешения разрешите автозапуск нашего приложения. Также во вкладке Энергосбережение нужно разрешить нашему приложению постоянную работу в фоне.
  2. Вернитесь на рабочий стол телефона, откройте список запущенных приложений (потяните экран от нижней части вверх), зажмите наше приложение, чтобы в заголовке появился значок замка (на некоторых моделях нужно потянуть приложение вниз вместо удержания).

Смартфоны Asus

  1. Если на телефоне стоит системное приложение Менеджер автозапуска (Auto start manager/mobile manager/или похожее) , откройте его, в нем разрешите автозапуск нашего приложения. Также разрешите работу в фоновом режиме и отключите энергосбережение для нашего приложения (если есть такие настройки).
  2. Если на телефоне стоит системное приложение Мобильный диспетчер , откройте его, зайдите в Диспетчер автозапуска , там разрешите нашему приложению Автозапуск.

Если используете функцию очистки/ускорения, тогда обязательно добавить наше приложение в список исключений (защищенные приложения) там же в Мобильном диспетчере, иначе после ускорения/очистки приложение будет остановлено телефоном!

Смартфоны Lenovo

  1. На некоторых моделях бывает предустановлено приложение SecureIT. Если в списке программ есть такое, откройте его, и в разделе Ускорение (Speed-up) добавьте наше приложение в список исключений отключения.
  2. На некоторых моделях бывает предустановлено приложение Lenovo Power (или Power/Power Manager). Если такое приложение установлено, нужно в нем выключить энергосбережение, а также разрешить нашему приложение постоянную работу в фоне.

Смартфоны Fly

  1. Зайдите в настройках телефона в Энергосбережение (или батарея/диспетчер питания и т.п.) ивыключите энергосбережение, если оно включено.
  2. На некоторых моделях бывает предустановлено приложение Clean Master, которое мешает нормальной работе других приложений. Если такое приложение установлено, нужно в нем разрешить постоянную работу нашего приложения (добавить в исключения). Если будут наблюдаться проблемы с работой нашего приложение, рекомендуем удалить Clean Master.

Смартфоны ZTE

  1. Если на телефоне установлено фирменное ZTE приложение Mi-assistant (еще одно названиеПомощник ), то откройте его, далее Ускорение > Белый список, включите в нем наше приложение ЗвонкиОнлайн. Далее нажмите на иконку настроек, а там Приложения в автозагрузке. Включите наше приложение, если было выключено (если уже включено, оставьте как есть).
  2. Если на телефоне предустановено приложение 360 security , откройте его, далее в меню нажмите Настройки , в секции Ускорение и энергосбережение нажмите Избранное , там добавьте наше приложение. Или можете просто удалить этот 360 security, если не пользуетесь им.

Смартфоны LeEco

  1. Откройте встроенное приложение Диспетчер телефона.
  2. Нажмите Управление Энергосбержением , далее Зашита приложений - добавьте туда ЗвонкиОнлайн.
  3. Выйдите в основное меню и нажмите Безопасность и конфиденциальность , далее Управлением автозапуском и добавьте туда наше приложение.

Смартфоны Nokia (для телефонов с версией Android до 8.1)

После установки нашего приложения на телефон, откройте его, и в настройках поставьте Режим Записи в MIC.

Смартфоны TP-Link

После установки нашего приложения на телефон, зайдите в настройки телефона, далее пункт Батарея , далее:

  1. Выключите режим энергосбережения , если включен.
  2. Нажмите Управление режимом ожидания приложений , добавьте там приложение ЗвонкиОнлайн (разрешите ему работу в режиме ожидания).
  3. Нажмите Режим энергосбережения для приложений , там снимите для нашего приложения все ограничения.

Остальные производители / общее

1. Зайдите в настройках телефона в Энергосбережение (или батарея/диспетчер питания и т.п.) и выключите энергосбережение, если оно включено.

На некоторых телефонах может стоять отдельное системное приложение для настройки энергосбережения, в котором тоже нужно все отключить.

2. На некоторых смартфонах может стоять системное приложение под названием Безопасность/Разрешения/Менеджер приложений или похожее. Если такое приложение есть, откройте его и дайте все разрешения нашему приложению (автозапуск, работу в фоне, запись звонков).

3. На некоторых телефонах могут быть установленые различные приложения по оптимизации/очистке памяти и т.п. Данные приложения обычно мешают нормальной работе приложений по записи звонков, поэтому нужно удалить эти приложения или правильно их настроить.
Проверьте, что все работает

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

Please enable JavaScript to view the 3 ноября 2015 в 10:43

Android 6.0: Doze Mode, App Standby, Runtime Permissions. Всё, что необходимо знать каждому разработчику

  • Разработка мобильных приложений ,
  • Разработка под Android ,
  • Тестирование мобильных приложений

В этой статье мы рассмотрим три самых важных изменения в новом Android, которые не могут быть проигнорированы ни одним разработчиком, который поставил у себя в проекте targetSdk = 23 и выше.
Doze Mode - режим «отключки», в который переходят все устройства на Marshmallow после некоторого времени обездвижения без зарядки.

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

Runtime Permissions - новая модель запроса разрешений. Теперь мы, как разработчики, каждый раз обращаясь, например, к микрофону устройства, должны проверять, есть ли у нашего приложения разрешение на доступ к нему.

В Google в новом релизе Android сделали очень важный шаг в сторону оптимизации работы батареи. Все мы знаем, как пользователи любят повонять в комментариях высказываниями: «Дурацкие Google Play Services» жрут 25% батареи моего ******* S III, гопники, верните мне мой драгоценный айфон, нет сил, терпеть издевательства от Гугл". Только вот эти пользователи не ставили себе никогда Battery Historian и не в курсе, что жрут батарею бесплатные игры от сомнительных авторов и такие же сделанные на коленке живые обои, например. Но пользователь этого не знает, и как бороться с кучей левых приложений, беспощадно съедающих батарею, он не в курсе.

Ну теперь пользователям об этом заботиться и не придется. С приходом двух новых режимов Doze Mode и App Standby операционная система перекрывает кислород всем чрезмерно жрущим заряд приложениям. Как? Читаем далее:

Doze Mode

Когда устройство на Android Marshmallow лежит без движения и без зарядки, спустя час оно переходит в Doze Mode. Режим отключки, когда почти все приложения перестают жрать батарею.

Это происходит не сразу, а по шагам:

ACTIVE - Устройство используется или на зарядке
INACTIVE - Устройство недавно вышло из активного режима (пользователь выключил экран, выдернул зарядку и т.п.)
...30 минут
IDLE_PENDING - Устройство готовится перейти в режим ожидания
...30 минут
IDLE - Устройство в режиме бездействия
IDLE_MAINTENANCE - Открыто короткое окно, чтобы приложения выполнили свою работу

Мы можем продебажить наши приложения, переключаясь последовательно между этими шагами с помощью:
$ adb shell dumpsys deviceidle step

В момент, когда устройство переходит в состояние IDLE:

  • Доступ приложению к сети отключен, пока приложение не получит high-priority GCM-push.
  • Система игнорирует Wake lock’и. Приложения могут сколько угодно пытаться запросить пробуждение процессора - они их не получат.
  • Alarm’ы запланированные в AlarmManager не будут вызываться, кроме тех, которые будут обновлены с помощью setAndAllowWhileIdle().
  • Система не производит поиска сетей Wi-Fi.
  • NetworkPolicyManagerService: пропускает только приложения из белого списка.
  • JobSchedulerService: все текущие задачи отменяются. Новые откладываются до пробуждения.
  • SyncManager: все текущие отменяются, новые откладываются до пробуждения.
  • PowerManagerService: только задачи приложений из белого списка вызовутся.

Соответственно, если наше приложение чат, то мы можем отправить с сервера push с полем priority = high .
А если у нас приложение будильник, то мы должны обязательно вызвать для Alarm setAndAllowWhileIdle() или setExactAndAllowWhileIdle() .

Во многих других случаях мы вообще не должны об этом переживать, после того, как пользователь возьмет устройство в руки, все заснувшие alarm"ы и SyncAdapter"ы проснутся и сделают свою работу. (Да-да я знаю, что после выхода из doze mode все начинает синкаться и даже Nexus 9 минуты две тормозит)

App Standby

Но не только при попадании устройство в Doze Mode наши приложения будут лишены возможности разряжать батарею. Второй режим под название App Standby отправляет в такую же изоляцию приложения, которые не подходят под условия:
  • Пользователь явно запустил приложение.
  • Приложение имеет процесс, работающий в данный момент на переднем плане (Activity или foreground service, или используется другой activity или foreground service’ом).
  • Приложение создало уведомление, которое висит в списке уведомлений.
  • Пользователь принудительно добавил приложение в список исключений оптимизации в настройках системы

Исключения

Возможно сейчас разработчики коммерческих voip нервно начали продумывать, как запретить обновляться своим пользователям на пугающий своей жесткостью Android Marshmallow. Но не волнуйтесь, есть специальный Whitelist, в который пользователь руками может добавить исключения. Приложениям из Whitelist не страшны ни Doze Mode ни App Standby.

Чтобы проверить, попало ли наше приложение в Whitelist вызываем метод isIgnoringBatteryOptimizations() .

Пользователь может сам руками добавить/удалить из списка в настройках Settings > Battery > Battery Optimization
Но мы можем его сами попросить с помощью интента ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS или запросив пермишен REQUEST_IGNORE_BATTERY_OPTIMIZATIONS , который покажет диалог на автоматическое добавление в вайтлист с разрешения пользователя.

Runtime Permissions

Мы подобрались к самому известному изменению в Android Marshmallow. Более того это изменение требует от нас наибольшего вовлечения в перелопачивание кода приложения. Кратко говоря: халява кончилась.

Да-да, каждый раз, когда наше приложение обращается, например, с запросом на местоположение пользователя, мы должны проверить, есть ли у приложения разрешение от пользователя на это действие. Если есть - обращаемся к нужным нам системным ресурсам, если нет - запрашиваем. Так же пользователь может навсегда приложению запретить доступ, тогда единственный наш шанс - это попросить его самого зайти в настройки и снять запрет, показав ему объясняющее сообщение, зачем нам нужен доступ.

Стоит отметить, что Permissions в Android делятся на два типа:

  1. Нормальные разрешения , вроде доступа к сети и bluetooth.
  2. Опасные разрешения . В этот список входят разрешения на: календарь, камеру, контакты, местоположение, микрофон, телефон, сенсоры, смс и внешнее хранилище

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

Итак, последовательность наших шагов:

  • Описать только PROTECTION_NORMAL запросы в manifest
  • Пользователь их все подтвердит при установке
  • Когда приложению нужен доступ к одному или нескольким разрешениям из группы опасных, проверить, нет ли разрешения
  • Если разрешения нет - запросить
  • Если разрешения не будет - объяснить, на что это повлияет
  • Если разрешение получено - продолжить работу

Чтобы проверить доступность разрешения дергаем ContextCompat.checkSelfPermission (Context context, String permission) .
Чтобы запросить разрешения, показав системный диалог, вызываем ActivityCompat.requestPermissions() ;
Результат этого запроса придет в асинхронный колбэк в активити onRequestPermissionsResult() , в нем мы узнаем решение пользователя по каждому из запрошенных разрешений.

Запрашивать лишь те разрешения, которые действительно нужны. До сих пор в Google Play находятся разработчики, которые запрашивают все подряд

Если есть возможность, вместо запроса воспользоваться внешним Intent. Например, для фото или видео часто нет смысла встраивать камеру в приложение, гораздо проще воспользоваться внешним приложением

Запрашивать разрешение, только перед тем, когда оно понадобится. Запрашивать при старте приложения все разрешения нелогично (из тех, которые нам нужны), их смысл как раз в том, что мы запрашиваем их в контексте их использования.Например, пользователю становится понятно зачем его банковскому клиенту доступ к контактам - чтобы выбрать одного при шаринге по ФИО

Пояснять пользователю, для чего запрашивается разрешение. Если пользователь все же запретил приложению доступ, а без него оно не может, оно должно максимально понятно объяснить, что без этого разрешения оно работать дальше не будет