Каждый может за 60 минут сделать своё MDM (Mobile Device Management) решение и удалённо управлять мобильным устройством. Такие продукты обычно лицензионные, при этом не всегда отечественные. В статье — инструкция, как его сделать самому, вместе с QR кодом для установки KNOX настроек, на самом наглядном и простом для демонстрации примере — WebKiosk.

И главное, что для этого нужна лишь учётная запись Google и не более того.

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

  1. Контроля использования. Как бы family link для сотрудников компании, чтобы работали, а не развлекались, и это достигается через администрирование политик (ограничения)

  2. Безопасности, так как мобильное устройство и информация на нём — это актив

  3. Централизованного администрирования и настройки под задачу

Для примера рассмотрим создание WebKiosk и это будет преимущественно реализация пунктов 1 и 3. Что такое WebKiosk? Это когда устройство предназначено для показа в браузере Chrome одного единственного сайта и не допускает иных вариантов использования. Используется для создания простых информационных панелей, когда ваше приложение реализовано через web.

Можно такое решение не покупать, а сделать самому на основе приложения (Android Device Policy), встроенного в Android, который с помощью облачного Android Management API (AMAPI) можно активировать в режиме Device Owner и управлять устройством как нам заблагорассудится. Google когда-то позиционировал эту инициативу как Managing Android Devices without an App. Приложение-агент делать не надо, используйте встроенный.

В инструкции по ссылке приводятся примеры в code lab notebook, но мы поступим ещё проще и будем выполнять все действия по настройке и управлению устройством в Android Management API reference, так как есть возможность выполнять методы с параметрами своего проекта.

Заходим в Cloud Console Google и нажимаем CREATE PROJECT, выбираем уникальное имя проекта, пункт «Parent organization or folder» оставляем No Organization.

Создаём проект в Cloud Console Google
Создаём проект в Cloud Console Google

Далее идём в Android Management API reference в enterprises.create и вызываем метод, указывая projectId, полученный выше, принимаем agreement и задаём имя для enterprise.

Создаём enterprise с помощью API Explorer
Создаём enterprise с помощью API Explorer

Сохраняем значениеname, которое в нашем примере «enterprise/LC02au7btq».
В дальнейшем его можно будет получить, вызывая метод enterprises.list.

Под кнопкой Execute в API Explorer ответы сервера
Под кнопкой Execute в API Explorer ответы сервера

Я обещал, что примером будет создание Web Kioska, а значит идём в метод enterprises.webApps.create и создаём WebApp, который будет это делать.

Сохраняем name получившегося webapp
Сохраняем name получившегося webapp

Методом enterprises.policies.patch создаём политику, назовём её policy1, настроек устройства, в которых установим уровень яркости, увеличим screen timeout, чтобы экран слишком быстро не затемнялся, используем наш web app, установив его в режим киоска. Для него же установим chrome. Ниже описание для enterprises/LC02au7btq/policies/policy1

{
  "displaySettings": {
    "screenBrightnessSettings": {
      "screenBrightnessMode": "BRIGHTNESS_FIXED",
      "screenBrightness": 200
    },
    "screenTimeoutSettings": {
      "screenTimeoutMode": "SCREEN_TIMEOUT_ENFORCED",
      "screenTimeout": "6000s"
    }
  },
  "applications": [
    {
      "packageName": "
com.google.enterprise.webapp.xf628ed5cb1794fe7",
      "installType": "KIOSK",
      "defaultPermissionPolicy": "GRANT"
    },
    {
      "packageName": "
com.android.chrome",
      "installType": "FORCE_INSTALLED",
      "defaultPermissionPolicy": "GRANT",
      "managedConfiguration": {
        "urlBlocklist": [
          "*"
        ],
        "urlAllowlist": [
          "
www.hermitagemuseum.org"
        ]
      },
    }
  ]
}

Теперь пришло время создать  enrollment token с помощью соответствующего метода enterprises.enrollmentTokens.create. Обязательно начинаем с указания политики, которую создали ранее (enterprises/LC02au7btq/policies/policy1), иначе процесс регистрации устройства не пройдёт. Второй параметр, который достаточно задать для создания enrollment token — это время его существования, которое определяется полем duration, - я поставлю значение 150000000s, так чтобы хватило лет на пять (максимум десять).

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

{
  "name": "enterprises/LC02au7btq/enrollmentTokens/YUItZ4iuvgmTBpI8Ft6AgJ1H1GLzuwv8cCCYX2hbePU",
  "value": "BZKCJTMFTHYNMESDIIXQCDIS",
  "duration": "150000000s",
  "expirationTimestamp": "2030-06-12T17:06:10.560207Z",
  "policyName": "enterprises/LC02au7btq/policies/policy1",
  "qrCode": "{\"
android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME\":\"com.google.android.apps.work.clouddpc/.receivers.CloudDeviceAdminReceiver\",\"android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM\":\"I5YvS0O5hXY46mb01BlRjq4oJJGs2kuUcHvVkAPEXlg\",\"android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION\":\"https://play.google.com/managed/downloadManagingApp?identifier=setup\",\"android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE\":{\"com.google.android.apps.work.clouddpc.EXTRA_ENROLLMENT_TOKEN\":\"BZKCJTMFTHYNMESDIIXQCDIS\"}}"
}

В принципе, в поле qrcode уже находится qr код, на основе которого можно сделать его графическое представление. На Welcome screen, сделав пять тапов по экрану, нужно  его отсканировать, и после вы получите устройство в списке, который можно увидеть методом enterprises.devices.list. Если у вас не Samsung, то на этом можно остановиться.

Можете попробовать, чтобы увидеть результат, потом просто сделаете factory reset. Ссылка на managed Google Play изменена на другую https://howtomdm.ru/adpc.apk, потому что в РФ уже пару лет с доступом к нему бывают какие-то необъяснимые проблемы
Можете попробовать, чтобы увидеть результат, потом просто сделаете factory reset. Ссылка на managed Google Play изменена на другую https://howtomdm.ru/adpc.apk, потому что в РФ уже пару лет с доступом к нему бывают какие-то необъяснимые проблемы

Однако в статье я не просто так упоминал KNOX Service Plugin, ведь если вы делаете Kiosk, то ваши планшеты будут всё время на зарядке и это не очень хорошо для батареи, поэтому надо включить battery protection, чтобы зарядка прекращалась на 80%. А ещё удобно сделать так, чтобы планшет включался при подаче питания и выключался, когда его нет.

Ручная настройка battery protection, но мы настроим с помощью KSP
Ручная настройка battery protection, но мы настроим с помощью KSP

Я как-то писал в статье Магия KNOX и её разоблачение: изучаем OEMConfig от Samsung о возможности применения такого рода политик при первоначальном развертывании любого MDM через KME Direct. Но я посмотрел и понял, что в конечном итоге эта программа дает возможность сгенерировать QR код со своими ссылками на XML-схему описания политик и на нужные apk, поэтому можно не утруждаться и работать с json-схемой напрямую.

{"additionalScanCount":0,"profileID":"0","serviceType":"PCT","organizationName":"Android AMAPI","management":{"agent":{"href":"https://howtomdm.ru/adpc.apk","adminComponent":"com.google.android.apps.work.clouddpc/.receivers.CloudDeviceAdminReceiver","packageName":"com.google.android.apps.work.clouddpc","signatures":["I5YvS0O5hXY46mb01BlRjq4oJJGs2kuUcHvVkAPEXlg="],"version":"0"},"payload":{"mdmProfileCustomData":"{\"kmeUri\":\"\",\"com.google.android.apps.work.clouddpc.EXTRA_ENROLLMENT_TOKEN\":\"BZKCJTMFTHYNMESDIIXQCDIS\",\"CAPTIVE_PORTAL_MODE\":0,\"android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED\":\"true\",\"android.app.extra.PROVISIONING_SKIP_OWNERSHIP_DISCLAIMER\":\"false\"}"},"secondaryAgents":[{"packageName":"com.samsung.android.knox.kpu","signatures":["NN8Oep8c8YkuRcBWtJc82BzPFIpAUNEa6krFpl-QCkI="],"href":"https://howtomdm.ru/knox_service_plugin_v1.4.99.apk","version":"0"}],"skipSetupWizardForWPC":"false","adminIntegratedFlow":true},"appContent":[{"href":"https://howtomdm.ru/XML_template_for_KSP_Ver1.4.99.xml","packageName":"com.samsung.android.knox.kpu"}],"selfUpdateAgentHref":"https://howtomdm.ru/KES_v2.2.59.apk"}

additionalScanCount в схеме нужен для случаев, когда QR код схема слишком длинная, и его вы хотите разбить на два и более. Система считывания для KME, которая выскакивает при рисовании крестика на welcome screen, от Android Setup Wizard умеет и такое. Ссылку от Google на Android Device Policy я заменил на свою, скачав apk и тоже положив на свой сервер для этих экспериментов, а то бывали странные проблемы с доступностью managed Google play (в сетях мобильных операторов по какой-то причине он не доступен). Затем в эту структуру надо поместить свой EXTRA_ENROLLMENT_TOKEN, - в нашем случае это значение BZKCJTMFTHYNMESDIIXQCDIS, которое мы берём из ответа при создании enrollment token. Для того, чтобы задать настройки, которые я описал выше и возможные только на Samsung, редактируем эту xml схему. Посмотрите по ссылке схему Knox Service Plugin и возможно заинтересует что-то из других вариантов конфигурации. Их много.

Для Battery Protection Mode ставим значение true для элементов XML схемы KSP:

doPoliciesIsControlled,
doDeviceCustomizationIsControlled,
profileDeviceBatteryProtection

Автовключение при подаче питания:

doPoliciesIsControlled,
doSettingsIsControlled,
DoSettingsAutoStartUp

Автовыключение при отключении питания:

doPoliciesIsControlled,
doSettingsIsControlled,
DoSettingsPowerOFF

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

Берем расширение Chrome QR code Generator, делаем QR из KME Direct json схемы, рисуем крестик на welcome screen (для KME Direct для QR кода крестик, а не традиционные пять тапов), сканируем и таким образом добавляем свои устройства под управлением нашего Google Cloud AMAPI MDM. По сути всё создание MDM свелось к созданию проекта в облачной консоли Google, а далее мы пользуемся сервисом API Explorer для Android Management API reference, чтобы вызывать нужные нам методы для настройки.

Не очень удобно? Согласен, но для решения на коленке вполне работает при небольшом парке устройств. И это вполне рабочий MDM, хоть и непривычный в администрировании. А KSP настройки я добавил лишь затем, чтобы совсем не лишний раз их прорекламировать. Далее заходим в метод enterprises.devices.list и видим свои устройства где-то в таком виде:

{
      "name": "enterprises/LC02au7btq/devices/3dcc372425a4586e",
      "managementMode": "DEVICE_OWNER",
      "state": "ACTIVE",
      "appliedState": "ACTIVE",
      "policyCompliant": true,
      "enrollmentTime": "2025-09-10T16:00:35.954Z",
      "lastStatusReportTime": "2025-09-10T16:01:09.301Z",
      "lastPolicySyncTime": "2025-09-10T16:00:41.034Z",
      "appliedPolicyVersion": "1",
      "apiLevel": 35,
      "hardwareInfo": {
        "brand": "samsung",
        "hardware": "qcom",
        "deviceBasebandVersion": "X356BXXU1AYF1,X356BXXU1AYF1",
        "manufacturer": "samsung",
        "serialNumber": "R32Y2002AWX",
        "model": "SM-X356B",
        "euiccChipInfo": [
          {
            "eid": "89043051202500836224027828986680"
          }
        ]
     },
      "ownership": "COMPANY_OWNED"
}

В реальности это выглядит так. Web Kiosk.
В реальности это выглядит так. Web Kiosk.

Посылаются команды на устройство методом enterprises.devices.issueCommand. Можно делать wipe, reboot и прочие вещи. Политики обновляются через тот же метод patch, которым и создавались и этого достаточно для ознакомительной статьи. Переходим к заключению.

Заключение

Эта статья поможет тем, кто хочет не только в теории, но и на практике расширить кругозор на тему, что такое mobile device management. Возможно для некоторых это послужит поводом для создания собственного MDM на основе Android Management API, и такие примеры я встречал.

Вопрос в том, чтобы на имеющемся API сделать для себя удобный интерфейс по управлению, когда агент уже встроен в ОС и его писать не нужно. Кроме того,  я продемонстрировал простое в использовании решение для использования тонкой настройки устройства посредством Knox Service Plugin, если он еще не поддерживается напрямую в вашем MDM.