【问题标题】:Reinstall application apk programmatically without downloading以编程方式重新安装应用程序 apk 而无需下载
【发布时间】:2012-05-16 14:15:18
【问题描述】:

由于this annoying Android limitation,我需要用户重新安装我的应用程序,以便其他应用程序检测到清单权限。

这已经让用户感到沮丧,但此外,我看不到从 /data/app 中存储的 apk 重新安装我的应用程序的方法,因此我必须将相同的版本下载到存储卡在触发通常的安装意图之前。

我急切地等待有人告诉我我遗漏了一些明显的东西!我画了一个空白...

提前致谢。

如果您希望问题得到解决,请给问题加注星标!干杯。


编辑:考虑到@hackbod 的cmets,您可以使用以下代码启动安装对话框。

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(this.getApplicationInfo().sourceDir)),
"application/vnd.android.package-archive");
startActivity(intent);

在我的 Jelly Bean 设备上,这提供了两个选项:包安装程序验证并安装。不知道后者是否会处理以下问题:

  • 以这种方式安装您的应用可能会从 Play 商店中删除它的所有权

我的应用程序是免费的,所以我无法测试以下付费问题:

  • 但是请注意,如果您的应用程序被前向锁定(由于应用程序加密,所有以 JB 开头的付费应用程序都无法避免这种情况),那么这将不起作用,因为其他人无法读取您的应用程序可执行文件 em>

虽然 hackbod 以“其他人可读”结束,这表明如果您通过自己的代码执行此操作,那么对于您自己的应用程序,它是可读的吗?如果您可以对此进行测试,请纠正我,我错了。

【问题讨论】:

  • 您可以将其从 /data/app 复制到存储卡。尽管您无法浏览该目录,但它包含的文件通常是可读的 - 尽管不能保证(而且这并不总是安装位置)。另一种方法可能是不使用权限系统,而是尝试对请求包进行自己的身份验证。
  • 感谢 Chris - 我的应用程序需要安装在设备上,否则将无法正常运行,因此我对用户安装位置的担忧最小。我认为这是您所指的唯一考虑因素?此外,由于 /data/app 是可读的,我可以先检查 apk 是否位于那里。根据我的搜索,除非使用根功能,否则我无法找到从该位置传输 apk 的方法...很想知道是否有方法...我不确定您所说的“我自己的身份验证”是什么意思?干杯。
  • 如果它是可读的(通常是这样),则不需要 root 将其复制到允许写入的位置(例如具有适当清单权限的 sdcard)。但是,/data/app 并不总是安装它的位置。有时在安装过程中会更改 apk 文件名。您可能能够从 /data/system/packages.xml 确定位置和安装名称,但此时您已经相当深入地了解私有内部功能,这可能不是未来的证明。确实,重新下载可能是您最好的选择 - 至少,将其作为备用选项。
  • 实际上,应用程序本身可以从 /proc/self/maps 中确定自己的 apk 文件/位置,因为它自己已打开并作为运行的结果映射到内存中。注意我说的是应用程序本身 - 另一个进程,例如 adb shell 会看到映射到它自己的进程中的内容,而不是您的应用程序。
  • 再次感谢,我会研究您的建议 - 我不知道 /proc/self/maps。如果我相信谷歌会在几天内修复它,我不会在此期间如此烦恼 - 但我有一种感觉,我正在寻找更长期的解决方案!

标签: java android


【解决方案1】:

可以想象,您可以通过 Context.getApplicationInfo().sourceDir 获取 .apk 的路径,然后使用该路径启动应用安装程序。但是,如果您的应用程序被前向锁定(由于应用程序加密,这对于以 JB 开头的所有付费应用程序都是不可避免的),那么这将不起作用,因为您的应用程序可执行文件不被其他人读取。在这种情况下,您需要将 .apk 复制到世界可读的地方(例如外部存储中)并从那里安装。

但是,无论你在这里做什么,这都会产生一些不可避免的非常负面的后果:

  • 从您的应用程序执行任何类型安装的唯一方法是通过侧载 UI,这 (a) 对用户来说将是一种非常可怕的体验,并且 (b) 将要求用户开启侧载以继续。
  • 以这种方式安装您的应用程序可能会从 Play 商店中删除它的所有权(因为它不再是安装它的人)。这可能意味着,例如,用户不能再通过 Play 商店向您报告崩溃或 ANR,或其他负面后果。我不确定这里到底会发生什么问题,但我真的不认为这会好起来。

最终,我只是非常不建议这样做。您需要什么许可才能迫使您这样做?出于许多原因,我不建议第三方应用程序在大多数情况下声明自己的权限,因为在权限方面存在很多不良用户体验,只有在可能需要它们之后才知道。

【讨论】:

  • 感谢您的回答。这个问题的一个很好的例子是应用程序Tasker,它需要net.dinglisch.android.tasker.PERMISSION_RUN_TASKS。我相信您知道,Tasker 可以对设备进行一些重大更改,因此开发人员为什么要让安装我的应用程序的用户注意这一点是可以理解的。如果我建议我的用户安装 Tasker 以获取其兼容功能,那么我会遇到这种情况,即未检测到我的清单中的权限。我不确定是否可以将您的答案标记为“正确”,因为似乎没有解决方案?
猜你喜欢
  • 2019-04-13
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2011-06-25
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多