Android device model api

Как правильно идентифицировать Android-устройства

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

Зачем нужна идентификация

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

В задачах, опирающихся на идентификацию, встречаются: аналитика возвратов, персонализация контента и рекламы, предотвращение мошенничества.

Среди последних можно выделить несколько актуальных проблем:

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

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

Основные способы идентификации

Использование аппаратных идентификаторов

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

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

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

Генерация UUID с первым запуском

Данный способ схож с использованием cookie: создаем файл со сгенерированной строкой, сохраняем его в песочнице нашего приложения (например с помощью SharedPreferences), и используем как идентификатор. Недостаток тот же, что и у cookie — вся песочница удаляется вместе с приложением. Еще она может быть очищена пользователем явно из настроек.

При наличии у приложения разрешений к хранилищу вне песочницы можно сохранить идентификатор где-то на устройстве и постараться поискать его после переустановки. Будет ли в тот момент нужное разрешение у приложения — неизвестно. Этот идентификатор можно использовать как идентификатор установки приложения (app instance ID).

Использование идентификаторов, предоставляемых системой

В документации для разработчиков представлен идентификатор ANDROID_ID. Он уникален для каждой комбинации устройства, пользователя, и ключа, которым подписано приложение. До Android 8.0 идентификатор был общим для всех приложений, после — уникален только в рамках ключа подписи. Этот вариант в целом годится для идентификации пользователей в своих приложениях (которые подписаны вашим сертификатом).

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

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

Добавляем строчку в файл манифеста нужного модуля:

И вот так достаем идентификатор:

В коде происходит следующее: мы делаем запрос к данным из определенного ContentProvider-a, что поставляется с сервисами Google. Вполне возможно, что Google закроет к нему доступ простым обновлением сервисов. И это даже не обновление самой операционки, а пакета внутри нее, т.е. доступ закроется с обычным обновлением приложений из Play Market.

Но это не самое плохое. Самый большой недостаток в том, что такие фреймворки, как Xposed, позволяют с помощью расширений в пару кликов подменить как ANDROID_ID, так и GSF_ID. Подменить локально сохраненный идентификатор из предыдущего способа сложнее, поскольку это предполагает как минимум базовое изучение работы приложения.

Приложение Device ID Changer в связке с Xposed позволяет подменять практически любой идентификатор. В бесплатной версии — только ANDROID_ID

Создание цифрового отпечатка (fingerprint) устройства

Идея device-fingerprinting не новая, и активно используется в вебе. У самой популярной библиотеки для создания отпечатка — FingerprintJS — 13 тысяч звезд на GitHub. Она позволяет идентифицировать пользователя без использования cookie.

Рассмотрим идею на примере (цифры взяты приблизительные для иллюстрации).

Возьмем ежедневную аудиторию какого-нибудь Android-приложения. Допустим она составляет 4 миллиона. Сколько среди них устройств марки Samsung? Гораздо меньше, примерно 600 тысяч. А сколько среди устройств Samsung таких, что находятся под управлением Android 9? Уже около 150 тысяч. Выделим среди последних такие, что используют сканер отпечатков пальцев? Это множество устройств еще меньше, ведь у многих планшетов нет сканера отпечатков пальцев, а современные модели опираются на распознавание лица. Получим 25000 устройств. Добавляя больше условий и получая больше информации, можно добиться множеств малых размеров. В идеальном случае — с единственным элементом внутри, что и позволит идентифицировать пользователя. Чем больше пользователей можно различить, тем выше энтропия этой информации.

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

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

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

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

Таким образом, метод будет работать при правильном соотношении стабильности и уникальности источников энтропии.

Какой метод выбрать

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

Разумный вариант — использовать сторонние решения с открытыми исходниками. В этом случае за изменениями в политике конфиденциальности будет следить сообщество, вовремя поставляя нужные изменения. За столько лет существования проблемы до сих пор нет популярной библиотеки для ее решения, как это есть для веба. Но среди того, что можно найти на android-arsenal, можно выделить две, обе с открытым исходным кодом.

Android-device-identification — библиотека для получения идентификатора. Судя по коду класса, ответственного за идентификацию, используются аппаратные идентификаторы, ANDROID_ID, и цифровой отпечаток полей из класса Build. Увы, проект уже 2 года как не поддерживается, и в настоящий момент скорее неактуален. Но, возможно, у него еще будет развитие.

Fingerprint-android — совсем новая библиотека. Предоставляет 2 метода: getDeviceId и getFingerprint. Первый опирается на GSF_ID и ANDROID_ID, а второй отдает отпечаток, основанный на информации с аппаратного обеспечения, прошивки и некоторых стабильных настроек устройства. Какая точность у метода getFingerprint — пока неясно. Несмотря на это библиотека начинает набирать популярность. Она проста в интеграции, написана на Kotlin, и не несет за собой никаких зависимостей.

Читайте также:  Metatrader 5 android как пользоваться для чайников

В случае, когда импортирование сторонних зависимостей нежелательно, подойдет вариант с использованием ANDROID_ID и GSF_ID. Но стоит следить за изменениями в обновлениях Android, чтобы быть готовым к моменту, когда доступ к ним будет ограничен.

Если у вас есть вопросы или дополнения — делитесь ими в комментариях. А на этом все, спасибо за внимание!

Источник

Android Management API

The Android Management API is available as part of Android Enterprise, an initiative providing developers with tools to build solutions for organizations to manage their Android device fleets. The program is intended for enterprise mobility management providers (EMMs). To deploy a production solution that uses the Android Management API, EMMs need to follow the steps outlined in Release your solution.

You can use the Android Management API to support the work profile, fully managed device, and dedicated device solution sets.

See the Quickstart guide to try out the API.

How it works

The Android Management API supports the full enterprise mobility management lifecycle, from initial customer enrollment to setting up and managing devices.

As an EMM developer, you supply your customers with an on-premise or cloud-based EMM console. In your console, your customers generate device enrollment tokens and create management policies. They use the tokens to enroll devices and apply management policies to the devices they enrolled.

In the backend, your console uses the Android Management API to create enrollment tokens, policies, and other management resources. During enrollment, each device installs the API’s companion app, Android Device Policy. When policies are linked to a device in the API, Android Device Policy automatically enforces the policy settings on the device.

API resources

This section describes the primary resources used in the Android Management API.

Enterprises

An enterprises resource typically represents a single organization. You create an enterprise as part of an online setup flow that your customers use to bind their organization with your EMM solution. Policies, enrollment tokens, and devices belong to an enterprise.

Policies

The Android Management API follows a policy-driven model. A policies resource contains a group of device and app management settings that govern the behavior of a device. The range and flexibility of the settings supported in policies allow you to set up devices for a variety of different use cases.

See Create a policy for more information.

Enrollment tokens

You use enrollmentTokens to bind devices to an enterprise—a process called enrollment and provisioning. Enrollment tokens can optionally contain extra details (e.g. corporate WiFi credentials), a policyName linked to a policies resource, and a user account identifier.

After creating an enrollment token, you can pass the token to a device using one of several different provisioning methods. Devices install Android Device Policy as part of the provisioning process. If a policyName is specified in the enrollment token, then the policy will be applied immediately after provisioning is complete.

The Android Management API simplifies user management—you can enroll a device with or without specifying a user in the enrollment token.

  • If you don’t specify a user, a new user will be created automatically.
  • If you specify an existing user, the existing user will be associated with the device. You can associate a user with up to 10 devices.

See Provision a device for more information.

Devices

A devices resource is created when a device is successfully enrolled. The resource contains read-only details about a device, including its associated user, policy, and management mode.

Читайте также:  Обои 480х800 для андроид

Device management is carried out through policy, but you can use enterprises.devices.issueCommand to lock, reboot, or reset the password on a device. To wipe a device, call enterprises.devices.delete .

Get started

Test out the API—use the Quickstart guide to set up a device in minutes. Ensure that you understand the steps required to release your solution in a production environment before using the developer’s guide and API reference on this site to build your solution.

Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Источник

Android device model api

DeviceAPI-Android is the android implementation of device_api — an initiative to allow full automation of device activities. For a full list of release notes, see the change log

device_api-android shells out to a number of android command line tools. You will need to make sure the android sdk is installed and you have the following commands on your path:

Add the device_api-android gem to your gemfile — this will automatically bring in the device_api base gem on which the android gem is built.

You’ll need to require the library in your code:

Try connecting an android device with usb, and run:

You might need to set your device to developer mode, and turn on usb debugging so that the android debug bridge can detect your device.

Connecting and disconnecting from Remote Devices

You can connect to devices via their IP address and port number. The syntax is:

This should add a device to the already connected devices, which you can query with DeviceAPI::Android.devices. You can disconnect from a device like so:

Once connected, the IP address and port number combination becomes the serial for the device, and you can execute commands such as adb shell through specifying the IP address/port number instead of the serial number. For both Android.connect and Android.disconnect, if port number is not specified, and ip address is only specified, port number defaults to 5555. (Note that Android.disconnect doesn’t automagically disconnect you from a connection with a port number that is not 5555 when it is called without a port argument)

You can also use the disconnect method on a Android device object, without any arguments to disconnect a device. It will throw an error if the device is not connected.

You can use device.is_remote? to determine if the device is a remote device, e.g. it has a ipaddress and port as an adb serial, and can attempt to be connected to.

Here are some of the errors you may encounter as well as a example of what can cause them:

DeviceAPI::Android::ADB::DeviceAlreadyConnectedError — raised when DeviceAPI::Android.connect is called on an currently connected device.

DeviceAPI::Android::DeviceDisconnectedWhenNotARemoteDevice — raised when we are attempting to call disconnect on a non-remote device.

DeviceAPI::Android::ADBCommandError — raised when we cannot connect to a device, e.g. adb times out.

There are two methods for detecting devices:

This returns an array of objects representing the connected devices. You get an empty array if there are no connected devices.

This looks for a device with a matching serial_id and returns a single device object.

When device-api detects a device, it returns a device object that lets you interact with and query the device with various android tools.

Источник

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