我有一个自助服务终端模式的 Android 非 Playstore 平板电脑应用程序(我们一直在使用 adb shell install 在设备上安装它)。Kiosk 模式是通过多种 DevicePolicyManager 方法的组合、设置用户限制、最后通过使用以下 shell 命令将其设置为设备所有者来实现的:
shell dpm set-device-owner com.dps.myapp/.DeviceAdminReceiver
这很好用,很好地满足了我客户的需求,让用户除了使用我们的应用程序来执行他们的工作之外,不能在平板电脑上做任何事情。当我使用设备所有者创建此信息亭版本时,我“假设”我将能够像过去一样将未来的更新推送到应用程序(从而避免在每次后续更新之前必须将设备重置为出厂设置),方法是使用以下shell 命令停止应用程序,卸载它,然后安装新版本:
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 shell 命令启动,该命令反转一些 DevicePolicyManager 设置并执行
DevicePolicyManager.clearDeviceOwnerApp(getApplicationContext().getPackageName());
3-将我的停止/卸载/重新安装 shell 命令更改为以下内容:
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 命令集中删除?提到它的帖子已经很老了。
感谢您提供的任何见解。确认我对我的情况的“我现在几乎搞砸了”的评估也会有所帮助。我讨厌那种只见树木不见森林的唠叨感觉。