如何自动更新应用程序;安卓
Posted
技术标签:
【中文标题】如何自动更新应用程序;安卓【英文标题】:How to update application automatically; Android 【发布时间】:2014-11-10 03:57:32 【问题描述】:我正在构建一个我想通过无线方式更新的启动器应用程序。我创建了一个服务类,它成功地检查和比较 App 版本号以确定是否需要更新。如果比较的apk版本高于当前版本,我会从我的云服务器下载apk,然后弹出一个对话框进行安装。
我面临的冲突是无法安装更新。我收到错误消息“已安装具有冲突签名的同名现有软件包”。我开始怀疑我的方法是否正确。我该如何解决这个问题?这就是我正在做的事情。
确认更新后,我会显示一个对话框,并在按下确认按钮时使用 Intent 解析应用程序 URL
Intent i = new Intent(Intent.ACTION_VIEW);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setData(Uri.parse(appUrl));
startActivity(i);
finish();
这实际上发布了一条通知,我必须单击并按下安装。一旦我这样做,它会尝试安装,但随后会出现签名冲突的错误。
理想情况下,我只想安装它而无需查看通知。提前谢谢你。
【问题讨论】:
【参考方案1】:您不一定需要使用 Playstore 或任何其他应用托管服务来管理您的应用升级。您的用户应该启用:从不明来源安装(在他们的安卓手机上)
对于自动升级,您必须发布具有相同签名的所有 APK。如果你只是从 Eclipse 构建和运行应用程序,DIST 文件夹中生成的 APK 文件使用 Debug 密钥(每台机器的默认密钥)签名
现在,如果您从不同的机器构建相同的代码,调试键值将不同,并且您会在安装新 APK 时收到错误消息:“已安装具有相同名称且签名冲突的现有包” /p>
以下是一些解决方案:
-
始终发布 APK 以从同一台机器自动升级(这绝对不可能)
使用相同的签名对所有 APK 进行签名。在 Eclipse 中:右键单击项目 > android 工具 > 导出签名的应用程序包
【讨论】:
我会试试这个。我从没想过要签署 apk,因为这是一个无法通过 google 下载的启动器应用程序。应该是操作系统。让我试试这个。【参考方案2】:您的设置几乎正确,但您还应该设置数据类型:
i.setType("application/vnd.android.package-archive")
另外,不要在startActivity()
之后调用finish()
。这不是必需的,并且可能会导致新 Intent 出现问题。
您的签名冲突是另一个问题。见this answer。您尝试安装的 APK 使用与当前安装的不同的密钥进行签名。
最后,如果没有用户的显式交互,就无法安装 APK(当然,除非您有 root 权限)。这是出于安全原因的意图。
【讨论】:
让我试试这个。我认为您和@Forgen 都有有效的答案和建议。让我看看这些东西。【参考方案3】:我在直接从 Android 调试桥部署时看到了“相同签名”错误。我认为您在这种方法中不会成功,因为:
-
Android 安全始终需要用户授权才能安装更新(除非您是 root 用户,或者是 Google Play 商店自动更新等系统的一部分。
Google play 总是必须终止正在运行的进程才能更新它。如果您的服务和应用程序实际上是单独的安装(即两个 apk),这可能会没问题。
我在 ADB 中收到的相同签名错误通常是当系统要求我完全卸载原始签名应用程序时。不能同时安装两个签名相同的应用程序;某些事情正在触发 Android 不执行同一包的“升级”。
以下是执行升级的允许方法: Is there a way to automatically update application on Android?
【讨论】:
以上是关于如何自动更新应用程序;安卓的主要内容,如果未能解决你的问题,请参考以下文章