远程应用程序更新和重新启动无人值守现场部署的android手机



我们将向偏远地区部署数百部现成的安卓手机,以便无人值守。他们将运行我们开发的一个应用程序,用于接收、处理和转发来自附近蓝牙传感器的数据到中央服务器,这是一个科学研究项目的一部分。这些设备可以上网;我们与手机/应用程序有双向通信。

我们将需要更新我们的应用程序随着时间的推移,如果不是为了修复错误,那么新的功能。如果能够在没有用户交互的情况下远程强制重启(或重启)更新,这将是非常有用的。访问每个站点并手动完成更新,在时间、精力和金钱上都将是非常昂贵的。

什么编程方法或第三方应用程序或技术可以使这成为可能?理想情况下,我们希望避免手机扎根,但如果这是唯一的方法,那么我们肯定会这样做。

从多年来的许多帖子到SO和其他地方(例如https://stackoverflow.com/a/22134318),这似乎不是(或没有)可能与开箱即用,无根的android -这(仍然)是真的吗?我们正在寻找代码、产品或操作指南来实现这一点——越简单越好,欢迎所有建议!

据我所知,在现成的android设备上进行完全无人值管的应用更新(仍然)是不可能的,所以我研究了在根深蒂固的设备上可能发生的事情。经过一天的搜索、阅读和实验,我们找到了一种可行的方法,给了我们所需的所有遥控器,甚至更多。一个大致的步骤和设置大纲可能会帮助其他有类似需求的人:

  • 根设备(具体情况因设备而异,所以你必须搜索如何为你的特定设备做)
  • 配置(或重新配置,取决于生根过程的影响)设备设置(例如,wifi),使其最低限度的功能
  • 进入谷歌设置>安全,取消勾选"提高有害应用检测"one_answers"扫描设备安全威胁"选项(否则,手机在远程安装应用时将需要屏幕确认)
  • 确保开发者选项是启用的;我读到位置可能因android版本或设备制造商而异,但一个常见的位置是设置>手机>(滚动到底部)构建编号-在构建编号项上点击7次以启用开发人员选项
  • 在设置>开发者选项中启用USB调试(即使我们永远不会将USB连接到手机,并且将通过TCP进行所有调试;这个选项似乎更像"启用adb调试",无论是通过USB还是TCP)
  • 安装ssh服务器或sshd应用程序(有很多;我现在选择SSH服务器并配置它(为该服务器添加1个服务器和1个用户)
  • 从计算机或其他设备的终端窗口中,使用ssh连接到手机,使用您在ssh服务器中设置的任何端口:
   $ ssh 192.168.1.217 -p 34567     # e.g., a local network IP address
  • 通过发出以下命令为TCP配置adb设备(这样做,不需要先通过USB连接):
   $ su
   $ setprop service.adb.tcp.port 5555
   $ stop adbd
   $ start adbd
   $ exit
   Note that the first time you issue the su command, the device
   will prompt for an on-screen tap to permit the SSH Server 
   app to run with elevated privileges -- this is a one-time 
   configuration that you must perform before you deploy to the field! 
   Note also that you specify which port adb will use -- you could 
   use something other than the default 5555.
  • 可选地,将adb授权密钥的文本文件放在设备上(/data/misc/adb/adb_keys——requires su),以预授权一台或多台计算机,您希望能够从这些计算机连接和管理远程设备——参见下面的进一步讨论
  • 从Android Studio的终端选项卡(或从安装了adb的任何终端),使用adb连接到设备,理想情况下使用设备的公共IP地址(下面更多):
   $ adb connect 93.184.216.34     # a public IP address
   # or, if you aren't set up yet for public access, a local address
   $ adb connect 192.168.1.217     # a local network IP address
   Note that you will get another on-screen prompt, this time
   to permit this computer to connect unless one of the
   following is true:
   a) you have previously connected to this device at this IP
      address from this computer and you check the option to
      permanently allow this connection, or
   b) you created an adb_keys file containing the key for the
      computer you are currently connecting from
   If you get the prompt, you must confirm it on-screen with
   a finger tap; if you select the option to permanently allow
   this connection, the /data/misc/adb/adb_keys file will be
   created and/or updated with the key for this connection

由于目标是配置电话,使其不需要任何屏幕上的用户交互,因此您需要确保将其部署到带有adb_keys文件的字段,该文件包含远程连接时它将看到的密钥。最简单的方法就是联系一次,手工,电脑将使用的设备进行远程管理和使用的IP地址,电话将会部署时,因为关键是不同的,通过一个本地网络比在互联网上(我想比我更有见识的人澄清所有的这一切,我只是报告我看过/所学到的今天把所有这一切放在一起)。

如果您希望管理多台计算机上的电话,您应该提前确定所有这些计算机的密钥,并将它们放在您在安装过程中安装的/data/misc/adb/adb_keys文件中。这将"预授权"所有与文件中密钥匹配的计算机的adb连接。

这就是设置。使用这个设置来实际管理应用程序更新非常简单,只需要adb。以下是您可以用来管理远程设备的adb命令的最小列表——键入adb——help或在web上搜索更多关于您可以使用adb做的许多事情(请注意,大多数但不是所有的命令都是'adb shell'命令,无论是用于活动管理器('adb shell am')还是包管理器('adb shell pm'):

 # terminate your currently-running app
 $ adb shell am force-stop com.example.appname
 # uninstall your app completely
 $ adb shell pm uninstall com.example.appname
 # or, to keep the app's data and cache use the -k option
 $ adb shell pm uninstall -k com.example.appname
 # install your app from your local computer to the remote device
 $ adb install /local/path/to/the/app.apk
 # start your app by invoking it's main/startup activity
 $ adb shell am start -n com.example.appname.Main

我只在一个电话上这样做;我会在接下来的几天里重复这个问题,如果需要的话,我会修改这个答案。虽然每个电话的设置有点涉及,将花费几分钟,一旦配置,它看起来好像我们的数百个电话的更新可以完全自动化作为一个简单的脚本adb命令。

最新更新