【问题标题】:Auto-Update for (private) Android apps(私有)Android 应用程序的自动更新
【发布时间】:2011-05-17 13:07:00
【问题描述】:

我正在开发一个非公开的 Android 应用程序,即该应用程序不会在全球 Android 市场上提供。该应用程序将安装在有限数量的客户端上,例如通过使用 apk 文件。 如何在此应用中启用自动更新功能?

我看到了不同的潜在选择(我不知道这些在技术上是否难以实现,甚至无法实现,或者是否有任何可以重复使用的现有功能):

  • 在每次启动时,应用程序都会测试是否存在新版本(通过请求服务器),如果存在则下载新的 apk 并将其自身替换为新版本。
  • 使用(或开发?)一个独立的应用程序或服务来承担更新检查和替换过程。
  • 使用(或开发?)具有自动更新选项的私人市场应用程序。此选项类似于第二个选项,但更通用:市场应用程序将连接到存储库,即它将处理任意数量的(私有)应用程序。

我更喜欢选项一,因为自动更新功能包含在需要较少开发工作的应用程序中。

【问题讨论】:

  • and replaces itself with the new version 这需要root权限。可能会为此提供任何解决方案。我相信在默认的 android 固件中,用户需要交互才能安装应用程序。如果没有 root 或自定义固件,就无法模拟它。
  • 当然需要用户交互来批准更新 - 这也适用于市场上的所有产品。如果你真的想强制他们,旧版本可能会在检测到新版本可用后拒绝工作。
  • Google 应该提供从私有托管的 APK 自动更新应用程序的功能,因此每个人都不需要使用自定义更新程序重新发明轮子。
  • 试试这个:github.com/commonsguy/cwac-updater 它相当容易使用。
  • 有一个很好的服务可以帮助你的应用保持更新。看看push-link.com

标签: android google-play auto-update


【解决方案1】:

janjonas,在我工作的公司中,我们在使用 Windows Mobile 6.x 时遇到了类似的问题,我们使用的解决方案几乎与 EboMike 指出的相同:

主应用程序根据 WebService 检查它是否已更新。如有必要,它会接收当前版本和下载新版本的 URL。然后主应用程序启动 Updater 应用程序,传递 URL,然后退出。

更新程序通过 HTTP 下载新程序,向用户显示下载的百分比。用户可以随时以受控方式取消下载,更新程序可以注册此取消。

由于下载了新应用,更新程序运行新应用并退出。

【讨论】:

    【解决方案2】:

    我认为选项一对您来说是最少的工作量,实际上也是最干净的一个,因为它将通过使用 Android 内置包安装程序的正确渠道,其中包括用户通知和用户中止选项如果需要,安装。

    您已经概述了所有内容 - 检查服务器上的新版本(最好让用户选择关闭它),如果有新版本,您可以链接到 URL使用 APK(IIRC 将使用浏览器的下载管理器下载它),或者您可以使用您的应用程序下载它,然后将意图指向您的本地文件。从技术上讲,使用 HTTP 链接的工作量更少而且更干净——你让操作系统做的越多越好——除非有理由不这样做。

    【讨论】:

    • 感谢您的回答。我将尝试选项一:该应用程序下载一个 apk 文件并开始安装过程。如其他 cmets 所述,需要用户交互来确认更新。这个问题stackoverflow.com/questions/3938926/… 展示了如何启动下载的apk文件。
    【解决方案3】:

    对于 Google Play 以外的任何应用程序,仍然需要启用“安装非市场应用程序”。如果未启用,安装过程将要求它并将用户重定向到应用程序设置,然后用户可以安装应用程序。

    根据您的需要,您可以委托给第三方库。

    【讨论】:

      【解决方案4】:

      我们将用于完成此操作的一些权限如下:

      <uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      

      让我解释一下...最后一个,WRITE_EXTERNAL_STORAGE,是不言自明的。使用 ACCESS_SUPERUSER 我们将告诉系统我们打算使用 root 权限。将来需要 READ_EXTERNAL_STORAGE 才能让您的应用读取 SD 卡上的文件。

      假设您已经下载了文件并且所有这些设备都可以植根(客户端数量有限,不在 Play 上等),您可以这样做:

      String filePath = Environment.getExternalStorageDirectory().toString() + "/your_app_directory/your_app_filename.apk";
      Process installProcess = null;
      int installResult = -1337;
      
      try {
          installProcess = Runtime.getRuntime().exec("su -c pm install -r " + filePath);
      } catch (IOException e) {
          // Handle IOException the way you like.
      }
      
      if (installProcess != null) {
          try {
              installResult = installProcess.waitFor();
          } catch(InterruptedException e) {
              // Handle InterruptedException the way you like.
          }
      
          if (installResult == 0) {
              // Success!
          } else {
              // Failure. :-/
          }
      } else {
          // Failure 2. :-(
      }
      

      【讨论】:

      • 您好 Nikola,我按照您的步骤操作,但未安装 apk。 “installProcess.waitFor()”返回值 255,安装失败。你知道解决办法吗?
      • @SantoshSah:我不知道是什么原因造成的,但退出代码告诉你你已经知道的——安装不成功。设备是否已植根?
      【解决方案5】:

      这可能是一个非常蹩脚的方法,但对于某些公司来说,如果你认为它适用,这可能很容易实现。

      • 创建一个密码屏幕 (passwordActivity),要求输入密码才能访问应用程序。
      • 输入密码后,引发标志(使用 sharedpreferences 将布尔值从 false 设置为 true)
      • 将 .apk 文件放到 Google 商店中。
      • 在所有人安装应用后更改密码,并在 Google Play 商店发布新的更新。

      由于软件会缓存标志值,即使更改密码也不会显示密码屏幕。它只会在新安装时显示,因此可能需要重复该过程。

      注意:如果没有数百名用户使用该应用程序,此方法可能更适合。而且不要忘记这种方法也不安全。总而言之,如果您正在寻找一种方法来保持应用程序的私密性并且没有安全问题,这就是我的建议。

      【讨论】:

        【解决方案6】:

        更新应用 确保您已经在位置下载了新的 apk

        void installNewVersion(String location) {
        
         Intent intent = new Intent(Intent.ACTION_VIEW);
         intent.setDataAndType(Uri.fromFile(new File(location + "app-debug.apk")),
                    "application/vnd.android.package-archive");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-18
          • 1970-01-01
          • 2012-03-31
          • 2015-12-02
          • 1970-01-01
          • 1970-01-01
          • 2019-12-19
          相关资源
          最近更新 更多