2

我有一个自助服务终端模式的 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 命令集中删除?提到它的帖子已经很老了。

感谢您提供的任何见解。确认我对我的情况的“我现在几乎搞砸了”的评估也会有所帮助。我讨厌那种只见树木不见森林的唠叨感觉。

4

1 回答 1

2

我想知道您为什么要在安装较新版本之前卸载该应用程序。根据我对我们自己的设备所有者应用程序的了解,如果没有 root 访问权限并手动删除一些 xml 文件,根本不可能卸载它。

但是当满足以下先决条件时,您应该能够更新当前设备所有者:

  • 新应用程序与旧应用程序具有相同的包名称
  • 新应用程序使用与旧应用程序相同的密钥来签署apk。
  • 版本代码至少比已安装版本高1 ,以便将新版本识别为前一个版本的更新。

然后您应该能够通过正常的应用安装操作安装较新版本(将 APK 下载到设备并通过文件直接在设备上安装,从 adb shell,...)。

于 2021-01-28T09:35:26.477 回答