Ищете решение для обновления приложения владельца устройства без сброса настроек

У меня есть планшетное приложение Android без Playstore в режиме киоска (которое мы устанавливали на устройства с помощью установки оболочки adb). Режим киоска достигается за счет комбинации нескольких методов DevicePolicyManager, установки пользовательских ограничений и, наконец, установки его в качестве владельца устройства с помощью следующей команды оболочки:

shell dpm set-device-owner com.dps.myapp/.DeviceAdminReceiver

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

shell am force-stop com.dps.myapp
shell pm uninstall com.dps.myapp
install -r C:\\dpsworkspace\\application\\

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

Мое решение включает в себя комбинацию следующего:

1 - добавление android:testOnly="true" в манифест, чтобы можно было отключить владельца устройства перед установкой обновления

2- добавление нового действия (DeactivateDeviceOwnerActivity) в приложение, которое можно запустить с помощью команды оболочки adb, которая отменяет некоторые параметры DevicePolicyManager и выполняет также

DevicePolicyManager.clearDeviceOwnerApp(getApplicationContext().getPackageName());

3- изменив мои команды оболочки stop/uninstall/reinstall на следующие:

shell am force-stop com.dps.myapp
shell am start -n com.dps.myapp/.DeactivateDeviceOwnerActivity
shell pm uninstall com.dps.myapp
install -t C:\\dpsworkspace\\application\\

Все это прекрасно работает, и я без проблем проверил дальнейшие обновления этой версии приложения. У меня вопрос, все ли это перебор? Есть ли более простой способ сделать это? Больше всего меня беспокоит то, что я мог упустить из виду то, что могло бы помочь мне избежать принудительного сброса настроек.

Все решения, которые я нашел здесь, в основном утверждают, что текущая версия приложения не может быть переведена в состояние, не являющееся владельцем устройства, из-за отсутствующего атрибута манифеста android:testOnly="true" и отсутствия уже встроенного действия для выполнения работы. что будет делать новый DeactivateDeviceOwnerActivity.

Я видел упомянутую команду dpm "remove-active-admin", но эта команда, по-видимому, отсутствует ни в одной установке Android, которая у меня есть... кроме того, для работы она требует наличия атрибута manifest., Была ли эта команда удалена из набора команд adb? Посты, которые упоминают это, довольно старые.

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

1 ответ

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

Но вы сможете обновить текущего владельца устройства при выполнении следующих предварительных условий:

  • Новое приложение имеет то же имя пакета , что и старое.
  • Новое приложение использует те же ключи для подписи apk, что и старое.
  • Код версии как минимум на 1 выше , чем у установленной версии, чтобы новая версия распознавалась как обновленная по сравнению с предыдущей.

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

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