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

2024-01-24

我们将在偏远的现场部署数百部现成的 Android 手机,以实现无人值守操作。作为科学研究项目的一部分,他们将运行我们开发的应用程序,用于接收、处理附近蓝牙传感器的数据并将数据转发到中央服务器。这些设备将能够访问互联网;我们与手机/应用程序进行双向通信。

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

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

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


据我所知,(仍然)不可能在现成的 Android 设备上进行完全无人值守的应用程序更新,因此我研究了 root 设备的可能性。经过一天的搜索、阅读和实验,我们找到了一种可行的方法,它为我们提供了所需的所有远程控制功能以及更多功能。所涉及的步骤和设置的粗略概述可能会帮助其他有类似需求的人:

  • root 设备(具体情况因设备而异,因此您必须搜索如何为您的特定设备执行此操作)
  • 配置(或重新配置,取决于生根过程的效果)设备设置(例如,wifi)以使其发挥最低限度的功能
  • 进入Google设置>安全并取消选中“改进有害应用程序检测”和“扫描设备是否存在安全威胁”选项(否则,远程安装应用程序时手机将需要屏幕确认)
  • 确保开发者选项已启用;我读到该位置可能因 Android 版本或设备制造商而异,但一个常见的位置是“设置”>“电话”>(滚动到底部)内部版本号 - 在“内部版本号”项目上点击 7 次以启用“开发人员选项”
  • 在“设置”>“开发者选项”中启用 USB 调试(即使我们永远不会与手机建立 USB 连接,而是通过 TCP 进行所有调试;无论是通过 USB 还是 TCP,此选项的行为似乎更像“启用 adb 调试”)
  • 安装 ssh 服务器或 sshd 应用程序(有很多;我选择了SSH服务器 https://play.google.com/store/apps/details?id=com.icecoldapps.sshserver现在并配置它(为该服务器添加 1 个服务器和 1 个用户)
  • 从计算机或其他设备上的终端窗口,使用您在 SSH 服务器中设置的服务器所使用的任何端口通过 ssh 连接到手机:
   $ ssh 192.168.1.217 -p 34567     # e.g., a local network IP address
  • 通过发出以下命令为 adb over TCP 配置设备(这样做,无需先通过 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 - 需要 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 或在网络上搜索有关可以使用 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 命令的简单脚本完全自动化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无人值守的现场部署 Android 手机的远程应用程序更新和重启? 的相关文章

  • java.lang.IllegalArgumentException:此组件要求您指定有效的 android:textAppearance 属性

    我的布局文件之一中有一个 com google android material button MaterialButton 组件 当我使用最新版本的 Material Components 库 com google android mat
  • 在 Android 上通话结束时启动活动

    我想在通话结束时启动一项活动 找不到任何对此的参考 我该怎么做 我还没有尝试过这个 但我假设你可以运行一些服务 始终在后台运行 它利用电话状态监听器 http developer android com reference android
  • Android 中多个蓝牙连接的自定义 UUID

    我有一个 Android 设备作为服务器连接到多个蓝牙 Android 客户端 我了解 UUID 的概念以及它的独特之处 我的问题是 我可以为连接到我的服务器的所有客户端使用相同的 UUID 吗 如果没有 我如何以编程方式为我的客户端生成
  • 检查 WebView 元素时的 UiAutomator 错误

    I have recently started automation testing in android and was using UiAutomator tool for inspecting UI elements Surprisi
  • 如何自定义菜单项的背景颜色?

    我正在尝试定制Toolbar的弹出菜单 现在我无法设置菜单项的背景颜色 我的 styles xml 如下所示
  • 如何获取每个StorageVolume的可用大小和总大小?

    背景 谷歌 悲伤 计划破坏存储权限 https www xda developers com android q storage access framework scoped storage 这样应用程序将无法使用标准文件 API 和文件
  • 如何正确释放Android MediaPlayer

    我正在尝试向我的 Android 应用程序添加一个按钮 当点击该按钮时它会播放 MP3 我已经让它工作了 但没有办法释放 mediaPlayer 对象 因此即使在我离开活动后它仍然会继续播放 如果我在react 方法之外初始化MediaPl
  • Android 初学者:Android gridview 中的触摸事件

    我正在使用以下代码来使用 gridview 执行操作 稍作修改http developer android com resources tutorials views hello gridview html http developer a
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 没有支持 FEATURE_CAMERA_EXTERNAL 的 Android 设备

    根据this doc https source android com devices camera external usb cameras一些 Android 设备允许使用 Camera2 API 访问外部 USB 摄像头 我检查了大约
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐