Usage stats android что это

Show app usage with UsageStatsManager

Dec 23, 2016 · 4 min read

Android 5.0 Lollipop introduced lots of goodness for us Android developers, but here’s something you might have missed: UsageStatsManager .

Recently I had to build an app manager at work which tracks the usage of the installed apps on the device to advice the user of which he should uninstall. To achieve this goal I had to learn about something new: UsageStatsManager .

What is UsageStatsManager?

UsageStatsManager is a new API introduced in Android 5.0 Lollipop (API Level 21) which allows us to retrieve statistics about the usage of the apps installed on the device.

That’s not everything you can do with UsageStatsManager . I focused on the app usage but you can also get useful data like UsageEvents or ConfigurationStats . The former are events happened on the device, like a configuration change or an app moving to the foreground/background, or even the end of a day, while the latter contains basically just a Configuration object plus various info about when it happened. I won’t deep dive into this though, since the API design is quite similar and once you get how it works for UsageStats , dealing with UsageEvents and ConfigurationStats will be the same.

Getting started with UsageStatsManager: requesting permission

Let’s start by declaring a permission in our Manifest before being able to access the user’s usage data:

The reason behind the use of the tools:ignore instruction is the permission: being a system level one, Android Studio will highlight it with a red line… but we know what we are doing, aren’t we?

Your code will still compile fine even if you don’t add this instruction since its main purpose is reminding us that just declaring it won’t be enough, the user will have to grant it from the dedicated settings page.

Because we’re talking about a system-level permission, the check for the PACKAGE_USAGE_STATS permission might be a little different from what you know:

In case this is false, you can might want to provide a shortcut to the related settings screen (which you can find in Settings > Security > Apps with usage access):

Next, we can finally access our the UsageStatsManager !

At this point you might notice that Android Studio is giving you a warning: that’s because the constant USAGE_STATS_SERVICE was actually introduced on API 22.

So if you want to use this on API 21, you’ll need to pass the string value, which is “usagestats”. You’ll get another warning in Android Studio, but yeah, about that: ¯\_(ツ)_/¯

Finally: querying for the usage data

Once you handled the permission and the user decided you’re trustworthy, you can retrieve usage stats by calling the method queryUsageStats(int intervalType, long beginTime, long endTime) which will return a list of UsageStats .

I’d advice you to move this call on a worker thread since the queryUsageStats method can take enough time to cause your UI to drop some frames if you don’t move it off the main thread.

Wait, what’s an intervalType? Well, the system collects and aggregates the data over 4 different intervals (defined by a constant int value which is contained in the class UsageStatsManager ) and they are:

Keep in mind that the system records are limited in time, so you’ll be able to retrieve app usage data for up to 7 days for interval daily, up to 4 weeks for interval weekly, up to 6 months for monthly and finally up to 2 years for yearly.

There’s a fifth option to mention: INTERVAL_BEST will choose the best fitting interval between the four above based on the timespan you’ve chosen. Note that even if the time frame you picked lasts five minutes, if you picked INTERVAL_WEEKLY as intervalType you will get all the stats inside that interval.

Not sold with the idea of getting a list with hundreds, maybe thousands of entries? There’s also a utility method to retrieve app usage stats, which is queryAndAggregateUsageStats(long beginTime, long endTime) . This will merge for us all the instances of UsageStats retrieved for a package and returns a map with a String (the package name) as key and the merged UsageStats as value.

Читайте также:  Android all running processes

If you’re wondering why we don’t need to pass an interval type this time, well, that’s because it will always use INTERVAL_BEST, no matter which start and end time values you picked.

queryAndAggregateUsageStats(long beginTime, long endTime) could be a better choice if you just want to get the absolute value of the total foreground time or the last time that app was used, since the merging basically sums the foreground time of the different UsageStats objects and it keeps the most recent lastTimeUsed value.

What does a UsageStats contain?

Inside a UsageStats you’ll be able to find the beginning time and ending time for that stat, the amount of time in foreground during that timespan and the last time it was used. Of course there’s also the package name of the app.

Finally, if you’re on API 23 or higher, you can also use the method isAppInactive(String packageName) in the UsageStatsManager class, which tells us whether an app is currently active or not (according to the official documentation an app is considered inactive if it’s not used for a period of time which can last several hours or days).

I want more code!

You can find a sample I built on GitHub.

Thanks to Roberto Orgiu for proofreading this article.

Источник

Как проверить, если » android.разрешение.Статистика использования пакета » разрешение дано?

Я пытаюсь получить статистику запуска приложений, а на Lollipop это возможно с помощью UsageStatsManager класс, как таковой (исходное сообщение здесь):

открытие действия, которое позволит пользователю подтвердить предоставление вам этого разрешения:

получение статистики, сводные :

в проблема

Я не могу проверить, если разрешение, которое вам нужно («android.разрешение.PACKAGE_USAGE_STATS») предоставляется. Все, что я пробовал до сих пор, всегда возвращается, что отрицается.

код работает, но проверка разрешений не работает хорошо.

что я пробовал

вы можете проверить наличие разрешения, предоставляемого с помощью этого:

оба всегда возвращали, что он получил отказ (даже когда Я предоставил разрешение как пользователь).

глядя на код UsageStatsManager, я попытался придумать этот обходной путь:

это сработало, но это все еще обходной путь.

вопрос

почему я не получаю правильный результат проверки разрешения?

что нужно сделать, чтобы проверить это лучше?

3 ответов

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

специальные разрешения, которые предоставляются Пользователем в Системных настройках (доступ к статистике использования, доступ к уведомлениям, . ) обрабатываются AppOpsManager, который был добавлен в Android 4.4.

обратите внимание, что помимо предоставления вам доступа в Системных настройках вам обычно требуется разрешение в манифесте Android (или каком-либо компоненте), без которого ваше приложение даже не отображается в Системных настройках. Для статистики использования вам нужно android.permission.PACKAGE_USAGE_STATS разрешение.

существует не так много документации об этом, но вы всегда можете проверить источники Android для его. Решение может показаться немного избитым, потому что некоторые константы были добавлены позже к AppOpsManager , и некоторые константы (например, для проверки различных разрешений) по-прежнему скрыты в частных API.

это говорит вам, если разрешение было предоставлено пользователем. Обратите внимание, что с уровня API 21 существует константа AppOpsManager.OPSTR_GET_USAGE_STATS = «android:get_usage_stats» .

Я проверил этот чек на леденец (включая 5.1.1), и он работает так, как ожидалось. Он говорит мне, дал ли пользователь явное разрешение без какого-либо сбоя. Существует также метод appOps.checkOp() что может бросить SecurityException .

второй аргумент checkOpNoThrow is uid , а не pid .

изменение кода, чтобы отразить, что, кажется, исправить проблемы, которые другие имели:

Источник

Как использовать UsageStatsManager?

Задний план

Google отвергла функцию « getRecentTasks » класса «ActivityManager». Теперь все, что он делает, – это получить список приложений, которые открылось текущим приложением.

Я даже написал сообщение об этом здесь, в StackOverflow , но я заметил, что это невозможно.

Проблема

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

Класс называется «UsageStatsManager», и я предполагаю, что функция « queryUsageStats » выполняет эту работу.

Кроме того, похоже, что у него есть новое разрешение («android.permission.PACKAGE_USAGE_STATS»), которое является системным разрешением, но написано, что:

Объявление разрешения подразумевает намерение использовать API, и пользователь устройства может предоставить разрешение через приложение «Настройки».

Вот еще одна ссылка об этой новой функциональности.

Что я нашел

Я просмотрел код Android и заметил, что «Контекст» имеет USAGE_STATS_SERVICE, который в JavaDocs говорит следующее:

Читайте также:  Камера для андроида с таймером

Странно то, что не только он говорит «строка состояния», но и имя пакета не соответствует (должно быть «android.app.usage.UsageStatsManager»).

Я также добавил правильное разрешение:

И вот код, который я использую:

В самом эмуляторе я перешел в «Настройки» -> «Безопасность» -> «Приложения с доступом к использованию» и включил мое приложение.

Однако при запуске кода все, что я получаю, это пустой список …

Вопрос

Как вы используете UsageStatsManager?

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

Что происходит при попытке использовать этот класс, пока пользователь еще не подтвердил его?

Как я могу заставить код вернуть мне реальный список приложений?

Я думаю, что документация была просто короткой для материала календаря. Я не думаю, что он работает с 2014 года; Однако я могу ошибаться.

Чтобы получить доступ к фактическому списку UsageStats, вам нужно будет создать объект Calendar с правильным месяцем, днем ​​и годом. Точно как MRK сказал в другом ответе. Я скопировал и исправил ошибки в коде MRK, чтобы любой, кто видит это в будущем, мог это увидеть.

-Credit MRK; (Он случайно просто положил cal вместо beginCal и endCal)

Код для параметров доступа к использованию приведен ниже. 🙂

Я создал образец того, как использовать UsageStats в моем Github. Надеюсь, это может помочь кому-то

Отвечая на ваш последний вопрос «Как я могу заставить код вернуть мне реальный список приложений?». QueryUsageStats принимает время начала и окончания в миллисекундах, а не значение года в int.

Это должно вернуть список UsageStats для 2012 и 2013 годов (помните, что время окончания не ограничивается диапазоном конечных результатов).

Использование UsageStats приведет к неправильной информации, когда пользователь откроет ящик уведомлений или на заблокированном экране. Вы должны использовать UsageStatsManager.queryEvents () и искать последнее событие с типом события MOVE_TO_FOREGROUND.

На самом деле есть пример приложения, включенного в пример кода AOSP : developers/samples/android/system/AppUsageStatistics/

Он включает все биты, необходимые для использования UsageStats в приложении:

Объявление разрешения в AndroidManifest.xml

Показать настройки для разрешения доступа к UsageStatsManager

Query UsageStatsManager для статистики.

Создание списка приложений на основе UsageStats

Подводя итог и применим к вашему примеру:

  • Кажется, вы правильно запросили разрешения и получили разрешения на доступ к статистике использования.
  • Вы правильно получаете системную службу UsageStats .
  • Тем не менее, период запроса, который вы запрашиваете, является коротким: Аргументы beginTime и endTime измеряются в миллисекундах с эпохи. Экземпляры Calendar могут дать вам это значение с помощью getTimeinMillis() . То, что вы ошибочно делаете, – это предоставить только цифры года ( 2015 и 2017 если вы запустите программу сегодня). Эти значения интерпретируются как миллисекунды с эпохи, и, таким образом, интервал составляет всего лишь 2 миллисекунды, а в 1970-е годы.

Вместо следующего фрагмента кода, который вы опубликовали, скопируйте приведенный ниже пример:

Источник

Android — запрещенные приемы

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

ВПО может состоять из десятков тысяч строк исходного кода, если не больше. Поэтому для ориентира в этом море кода будем рассматривать следующие характеристики:

используемый язык программирования;

набор привилегий, которые доступны ПО;

процедура предоставления удаленного доступа;

особенности реализации программного обеспечения (если есть).

Disclamer: Статья не претендует на полноту описываемой информации и предоставляет информацию только в образовательных целях.

Вредоносное программное обеспечение и ОС

Как известно, система Android своим ядром обязана Linux. И как свой прародитель, ОС Android считалась неприступной для вредоносного программного обеспечения. По мере развития системы в нее добавлялись новые функции, которые должны были еще больше обезопасить систему. Среди них:

песочница для каждого отдельного приложения;

организация доступа к ресурсам ОС за счет большого количества правил SELinux подсистемы;

использование нотификации для пользователей с перечнем необходимых для работы приложения привилегий.

Однако и это не помогло на 100% защитить систему. Почему? Наиболее распространенный способ инфицирования данной ОС — использование патченного софта и социальная инженерия. Причем обычно пользователям предлагается работать с интерфейсом, который неотличим от системного — то есть любое приложение ОС Android может использовать нотификации и Intent`ы, которыми пользуется сама ОС.

ВПО под Android развивается отчасти по пути open source: в сеть периодически попадают исходные коды вредоносов, которое использовалось злоумышленниками, что в свою очередь помогает менее квалифицированным «вирусописателям» ускорить создание своих зловредов. Попробуем раздобыть эти исходники из публичных источников.

Читайте также:  Как подключить андроид через hdmi кабель

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

Anubis

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

Набор требуемых привилегий на самом деле зашкаливает. Приведем часть AndroidManifest :

Похоже, что приложение будет системным, а также будет практически 24/7 мониторить активность пользователя и получать необходимые данные для своих целей. ОС не должна препятствовать деятельности этого приложения, если пользователь согласился с таким набором привилегий.

ВПО представляет собой троян, который может предоставлять доступ к зараженному устройству. Это осуществляется через создание сервиса, который имеет говорящее название «ServiceRAT». Регистрируется он стандартно — через манифест. Часть исходника самого сервиса:

Никаких изысков, используем http для передачи данных, и «шифруем» всё через RC4. Можно бы было придраться к code style, но похоже, что злоумышленники не парятся о подобном. Сам вредонос работает классически — получает зашифрованные данные от сервера и выполняет:

Если смотреть код управления устройством полностью, то глаз зацепится за вот такой фрагмент:

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

Вывод: данный зловред никаких интересных «трюков» не использует. Разрешенные действия, которые описаны полностью в манифесте подчиняют практически полностью всю ОС. Все функции реализованы в рамках стандартного использования функций ОС и её библиотек. Отсутствует code style.

Cerber

Ещё один зловред, исходный код которого утёк в сеть. Недавняя новость о его функционале. Данная малвара имеет интересную особенность: практически все функции реализованы в отдельном файле, видимо разработчик таким образом хотел вынести весь алгоритм и иметь возможность обфусцировать его автоматическими средствами. Возможно, так было бы удобнее еще добавлять дополнительный функционал, но если задуматься, вероятно это один из методов обхода механизма проверки приложений для Google Play, так как вредонос достаточно часто светится в официальном магазине.

Используемый язык программирования: Java. Набор привилегий:

Объявления привилегий нет, у приложения всего лишь один Intent. Фрагмент исходника обработчика:

Как было упомянуто ранее, основной алгоритм ВПО записан в отдельный модуль. Отследить работу алгоритма можно по объекту » tt «. Автор вредоноса также не особенно переживает за поддержку данного кода, все объекты не имеют четкого именования. Видимо, данный модуль не планировали использовать долго.

Функционал вредоноса не ограничивается отправкой СМС, в нем так же есть работа с апдейтом модуля приложения:

Дополнительный файл «system.apk», к сожалению, отсутствует среди исходников, но вероятно он загружался с управляющего сервера. Удаленного доступа данный вредонос не предоставляет совсем. Весь функционал реализуется на основании конфига, который автоматически выполняет операции, которые ему передал злоумышленник на этапе запуска.

Вывод: ВПО работает только с СМС, которые проксируются в лог и пересылаются на конкретный номер. Снова полное отсутствие code style.

DefensorId

Еще одно ВПО, которое распространялось на ОС Android. Относительно свежую новость о нем можно найти здесь. Снова язык программирования — Java, похоже зловреды категорически не хотят использовать Kotlin.

Набор запрашиваемых привилегий:

ВПО славится тем, что может работать с пользовательским интерфейсом и воровать данные пользователя. Для подобного функционала в ОС Android необходимо обладать специальными привилегиями, которые выдаются только специальному функционалу — «Расширенные возможности ввода» (ACCESSIBILITY). Ниже приведен фрагмент кода, который старается такие привилегии запросить для возможности рисовать свой Intent поверх других приложений:

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

Вывод: Код создавался более опытным программистом, есть осмысленное именование объектов. Функционал реализуется за счет возможностей самой ОС и применяется для социальной инженерии.

Вывод

Код вредоносного программного обеспечения в большинстве случаев не выходит за рамки обычного программирования для ОС Android. Более того, можно сказать, что большинство ВПО пишется самоучками, которые собирают функции по официальной документации. В коде отсутствует четкое определение объектов их функционала, нет обработки данных от пользователя, так как реализация функционала пишется «чтобы работало». По итогу «недокументированные функции ОС» — это лишь умелые манипуляции злоумышленников по вводу пользователя в заблуждение.

Также приглашаем на открытый вебинар на тему «Рисуем свой график котировок в Android». На занятии участники вмеcте с экспертом:
— рассмотрят основные инструменты для рисования;
— изучат возможности классов Canvas, Path, Paint;
— нарисуют кастомизируемый график котировок и добавим в него анимаций.
Присоединяйтесь!

Источник

Оцените статью