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

Документы API менеджера политик устройств и обзор android 5.0 оба упоминают кое-что о приложении владельца устройства. Как я могу настроить свое приложение в качестве владельца устройства?

Изменить: Есть ли другие способы, кроме рута и NFC, если доступно, пожалуйста, поделитесь.

5 ответов

Решение

На самом деле, кроме NFC и рутинга, есть способ установить приложение в качестве приложения для владельца устройства. Вы можете использовать инструмент командной строки dpm из adb shell,

Использование:

usage: dpm [subcommand] [options]
usage: dpm set-device-owner <COMPONENT>
usage: dpm set-profile-owner <COMPONENT> <USER_ID>

dpm set-device-owner: Sets the given component as active admin, and its package as device owner.
dpm set-profile-owner: Sets the given component as active admin and profile owner for an existing user.

ОБНОВЛЕНИЕ: dpm утилита действительно проста на самом деле. Его цель - создать новый файл с именем device_owner.xml под /data/system/device_owner.xml который ссылается на приложения владельца устройства / профиля.

Затем платформа Android читает этот файл, чтобы проверить, какое приложение считается владельцем устройства или приложением владельца профиля.

На рутованном устройстве вы действительно можете создать этот файл самостоятельно, но так как dpm инструмент делает это, вам лучше использовать его (принцип СУХОЙ):

Например, через Runtime.exec() команда:

Runtime.getRuntime().exec("dpm set-device-owner com.foo.deviceowner/.DeviceAdminRcvr");

Также обратите внимание, что этот инструмент работает только в том случае, если для пользователя не установлена ​​учетная запись (убедитесь, что учетная запись не настроена в Настройках> Учетные записи) перед его использованием.

Источник и дополнительная информация в инструменте командной оболочки Android: Диспетчер политик устройств

Если вы являетесь пользователем root на своем устройстве, вы можете воспользоваться этим методом, чтобы стать владельцем устройства.

Сначала создайте файл device_owner.xml со следующим содержанием:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<device-owner package="your.owner.app.package.id" name="Your app name" />

Теперь сделайте следующие шаги

  1. adb push device_owner.xml /sdcard/

  2. adb shell

  3. su

  4. cp /sdcard/device_owner.xml /data/system/

  5. cd /data/system/

  6. chown system:system device_owner.xml

  7. перезагружать

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

Обновить:

На моей приставке Android 7.1.2 (AOSF и root) я обнаружил пару вещей, которые развивались с течением времени.

  1. exec("dpm set-device-owner ...") броски и исключения, если <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" /> объявлен в AndroidManifest.xml. Но это приносит другие проблемы, больше об этом здесь.
  2. Файл /data/system/device_policy.xml больше не появляется Вместо этого сейчас /data/system/device_policy_2.xml и схема немного отличается. Бег dpm set-device-owner com.myDomain.myPackage/.myComponent через оболочку adb генерирует файл как:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<root>
    <device-owner package="com.myDomain.myPackage" name="" component="com.myDomain.myPackage/com.myDomain.myPackage.myComponent" userRestrictionsMigrated="true" />
</root>

Только что попробовал, и dpm команда требует права root на реальных устройствах (например, Samsung T550), в противном случае произойдет сбой SecurityException, adb shell предоставляет только root на эмуляторы Android. Так что сначала вам придется рутировать устройство.

Вы также можете использовать рефлексивность, позвонив DevicePolicyManager метод называется setProfileOwner который был спрятан в документации SDK.

Не забудьте отменить его, иначе у вас возникнут конфликты с Google Play;)

Другие вопросы по тегам