【问题标题】:Custom-fit Android app: auto-update and always-on?定制安卓应用:自动更新和永远在线?
【发布时间】:2012-06-18 10:49:11
【问题描述】:

我正在尝试开发一个通常被视为恶意软件的应用,但客户的需求非常具体且合乎逻辑。我们有大约 50-100 部廉价的 Android 手机,它们被固定、插入,应用程序应该通过 tcp 将一些传感器数据发送到远程服务器。这听起来很简单,但有两个功能让我很苦恼(因为我不是经验丰富的 Android 开发人员,也从未植根过手机):

#1 应用程序应始终开启。如果它崩溃,服务器应该得到错误报告(堆栈跟踪),并且应用程序应该在 10 分钟后重新启动一次,然后放弃。此外,操作系统理论上可以杀死该应用程序(尽管我已尽力减少内存使用量)。我也想以某种方式处理它。

#2 如果应用程序可以远程更新或自动更新,而无需任何用户交互(因为没有常规用户),那就太好了。

要实现#1,除了root 手机之外,我没有看到其他解决方案(AlarmsManager 似乎没有像我预期的那样工作,添加另一个应用程序来处理第一个应用程序感觉不对)。我有什么遗漏吗?

我根本不知道如何实现功能 #2。如果我将应用程序投放市场并在安装时选中“使此应用程序始终保持最新”复选框,这会起作用吗?我担心在服务运行时不会发生自动更新,即使它发生了,操作系统在安装更新后也不会重新启动服务(除非实现了功能 #1)。如果我以编程方式下载最新的 .apk 并打开它,我仍然需要用户单击“安装”按钮。我什至正在考虑用某种脚本语言实现可更新部分。

在 Android API 的限制范围内,这些问题有解决方案吗?

编辑:谢谢大家的回答,你们非常有帮助。似乎使 Android 表现为非用户硬件的唯一方法是对其进行 root。这是进行静默自动更新的唯一方法。然后可以通过启用 cron 来实现始终开启(AlarmManager 显然不会在服务因崩溃而终止的情况下触发该事件,但它可以被另一个琐碎的、不可崩溃的服务用来保持第一个运行)。

【问题讨论】:

    标签: android auto-update


    【解决方案1】:

    对于#1,您可以使用前台服务。我不知道您需要多久获取一次传感器数据,但是 AlarmManager 有什么问题?我看不出生根对#1有什么帮助。如果不生根或构建固件,您就无法真正做到#2。如果您将您的应用程序安装为系统应用程序(在/system/app 中),您可以使用隐藏的PackageManager 以静默方式安装新版本。使用 Market/Play 自动更新应该也可以,但您无法控制更新计划。而且,是的,它不会重新启动您的服务,但如果您使用 AlaramManager,这应该不是问题。

    总而言之,现有的 Android 并不完全是一个可以让您完全控制的嵌入式系统,因此根据您愿意花费多少时间/精力,您可能需要对其进行一些自定义(或找到一个自定义 ROM接近您的要求)。

    【讨论】:

    • AlarmManager:我为 ELAPSED_REALTIME(每分钟一次)设置了警报,只要我的应用程序正在运行,它就会触发,但是当我崩溃应用程序(通过抛出异常)或杀死它时停止触发与任务管理器。也许我做错了?
    • 你确定 GooglePlay 会为了更新我的应用而杀掉它吗?它的服务运行一个睡眠检查发送循环。如果是这种情况,并且不需要用户单击按钮,那正是我正在寻找的(但我找不到任何有关此的信息,而且我不打算上传一些东西只是为了检查和见)。
    • 很抱歉,google play 不会杀死你的应用程序来更新,你必须自己做。关于警报管理器——你必须编写一个服务,而不是普通的应用程序,并将该服务标记为 STICKY,这样系统就会知道它应该继续运行。
    • 如果你强制关闭/杀死一个Android进程,警报将被清除。这就是安卓的工作方式。 Sleep-check-whatever 循环是浪费电池的反模式,所以你绝对应该避免它。 Market/Play 行为确实没有记录,但是上传一个测试应用来试用它有多难?您以后可以随时取消发布。
    • while (true) sleep(1000) 与 1000 毫秒定时器事件相比如何浪费更多电池?我不关心这里的电池寿命,但我看不出有什么区别。那么 while (true) lock(mutex) mutex.wait(1000) 和另一个线程偶尔的 mutex.notify() 呢?
    【解决方案2】:

    回复:问题 #2,您可以查看一些 open-source(根据 Apache 软件许可证 2.0 许可)选项,看看它是如何工作的。

    1. https://github.com/lazydroid/auto-update-apk-client是自动更新服务的android客户端(我隶属于),它体积小,易于实现,并且支持在root设备上静默更新。

    2. https://github.com/commonsguy/cwac-updater 由 Mark Murphy 编写,但它可能需要您运行自己的更新服务器,而我不确定静默更新。

    【讨论】:

    • 谢谢,我去看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多