7

我正在尝试以编程方式安装 apk,但我运气不佳。我正在建立一个针对物理设备的自动化测试框架,我想让测试设备在运行测试之前从构建服务器检索最新的 apk。虽然我知道没有一般的方法可以在未经用户同意的情况下实际安装 apk,但我很好奇在开发人员同时拥有 apk 和设备的情况下是否有可用的方法。

我过去尝试过的方法(apk 已下载到 pathName/apkFilename):

String command = "adb install " + pathName + apkFilename;
Runtime.getRuntime().exec(command);

和:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(pathName + apkFilename)), "application/vnd.android.package-archive");
getActivity().startActivity(intent);

虽然我无法使用第一种方法,但第二次尝试会创建一个系统对话框,要求用户确认安装(几乎就在那里,但不完全)。由于它是一个系统对话框,很遗憾,我无法使用 Robotium 进行确认。

4

2 回答 2

2

很多人都在尝试解决类似的问题。我相信在没有确认的情况下可能无法安装 APK,至少不容易:

我已经接受了一段时间,即不可能在 Android 上静默安装应用程序

您不能静默安装应用程序,Android 不支持它,原因很明显。应用程序安装需要用户干预才能继续。

解决方法?

您需要应用程序获得android.permission.INSTALL_PACKAGES权限。

如果您有某些特权,这些线程上有一些关于如何执行此操作的提示,尽管可能很难让您的应用程序以这种方式运行。您可能必须安装到一个特殊目录,和/或您可能必须以特殊用户身份运行(这可能很难做到)。

以提升的权限运行应用程序的一种可能方法:如何通过 Android SDK 获得 root 权限?

在这个线程上,他们提到您可能必须“root”您的手机才能启用该权限:

如果这使保修失效,我不会感到惊讶。您在帖子的评论中提到您没有“对设备的控制权”,因此也可能会取消此选项。

这个线程上提到了一些应用程序使用的漏洞利用,但我认为它们不受支持。如果他们仍然工作,他们可能会在某个时候停止工作。

于 2011-12-08T03:18:00.747 回答
0

我正在尝试做同样的事情,以便将更新推送到我们控制的设备。在我们的例子中,它们已经被植根,并且应用程序已被授予超级用户,所以我认为只需将 .apk 复制到现有文件的顶部可能会起作用,但这似乎很hacky。

似乎更好的方法(如果可行的话)是使用pm包管理器应用程序:

# /system/bin/pm
usage: pm [list|path|install|uninstall]
       pm list packages [-f]
       pm list permission-groups
       pm list permissions [-g] [-f] [-d] [-u] [GROUP]
       pm list instrumentation [-f] [TARGET-PACKAGE]
       pm list features
       pm path PACKAGE
       pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f] PATH
       pm uninstall [-k] PACKAGE
       pm enable PACKAGE_OR_COMPONENT
       pm disable PACKAGE_OR_COMPONENT
       pm setInstallLocation [0/auto] [1/internal] [2/external]

The list packages command prints all packages.  Options:
  -f: see their associated file.

The list permission-groups command prints all known
permission groups.

The list permissions command prints all known
permissions, optionally only those in GROUP.  Options:
  -g: organize by group.
  -f: print all information.
  -s: short summary.
  -d: only list dangerous permissions.
  -u: list only the permissions users will see.

The list instrumentation command prints all instrumentations,
or only those that target a specified package.  Options:
  -f: see their associated file.

The list features command prints all features of the system.

The path command prints the path to the .apk of a package.

The install command installs a package to the system.  Options:
      -l: install the package with FORWARD_LOCK.
  -r: reinstall an exisiting app, keeping its data.
  -t: allow test .apks to be installed.
  -i: specify the installer package name.
  -s: install package on sdcard.
  -f: install package on internal flash.

The uninstall command removes a package from the system. Options:
  -k: keep the data and cache directories around.
after the package removal.

The enable and disable commands change the enabled state of
a given package or component (written as "package/class").

The getInstallLocation command gets the current install location
  0 [auto]: Let system decide the best location
  1 [internal]: Install on internal device storage
  2 [external]: Install on external media

The setInstallLocation command changes the default install location
  0 [auto]: Let system decide the best location
  1 [internal]: Install on internal device storage
  2 [external]: Install on external media
于 2012-02-08T04:54:14.307 回答