简体   繁体   English

以编程方式安装Android apk作为测试框架的一部分

[英]Installing an Android apk programmatically as part of a test framework

I'm attempting to install an apk programmatically, but I'm not having much luck. 我正在尝试以编程方式安装apk,但我没有太多运气。 I'm setting up an automated test framework targeting physical devices, and I want to have the test devices retrieve the latest apk from the build server before running tests. 我正在建立一个针对物理设备的自动化测试框架,我想让测试设备在运行测试之前从构建服务器中检索最新的apk。 While I am aware that there is no general way to actually install an apk without the user's consent, I'm curious if there might be some approach available in the case where a developer owns both the apk and device. 虽然我知道没有一般方法在未经用户同意的情况下实际安装apk,但我很好奇是否在开发人员拥有apk和设备的情况下可能有一些方法可用。

Approaches I've tried in the past (the apk has been downloaded to pathName/apkFilename): 我过去尝试过的方法(apk已下载到pathName / apkFilename):

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

And: 和:

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

While I haven't been able to get the first approach to work, the second attempt creates a system dialog asking the user to confirm the installation (so almost there, but not quite). 虽然我还没有能够获得第一种工作方法,但第二次尝试创建了一个系统对话框,要求用户确认安装(几乎在那里,但不完全)。 Since it is a System dialog, I, unfortunately, cannot use Robotium to confirm. 由于它是一个系统对话框,遗憾的是,我无法使用Robotium进行确认。

A lot of people are trying to solve similar problems. 很多人都试图解决类似的问题。 I believe it may not be possible to install an APK without confirmation, at least not easily: 我相信可能无法在没有确认的情况下安装APK,至少不容易:

I've accepted for a while now that it's impossible to silently install an application on Android 我已经接受了一段时间,现在无法在Android上静默安装应用程序

You cannot silently install app, its not supported by Android for obvious reasons. 您无法安静地安装应用程序,Android不支持它,原因很明显。 Application installation requires user intervention to continue. 应用程序安装需要用户干预才能继续

Workarounds? 解决方法?

You need the app to have the android.permission.INSTALL_PACKAGES permission. 您需要该应用程序具有android.permission.INSTALL_PACKAGES权限。

There are some hints on those threads about how to do this if you have certain priveleges, though it might be hard to get your app to run that way. 如果您有某些权限,那么这些线程上有一些关于如何执行此操作的提示,尽管可能很难让您的应用程序以这种方式运行。 You might have to install to a special directory, and/or you might have to run as a special user (which might be hard to do). 您可能必须安装到特殊目录,和/或您可能必须以特殊用户身份运行(这可能很难)。

One possible way to run the app with elevated permissions: How can I get root permissions through the Android SDK? 使用提升权限运行应用程序的一种可能方法: 如何通过Android SDK获得root权限?

On this thread, they mention you might have to "root" your phone to enable that permission: 在这个帖子中,他们提到你可能必须“root”手机以启用该权限:

I wouldn't be surprised if this voids the warranty though. 如果这会使保修失效,我不会感到惊讶。 You mentioned in the comments on your post that you don't have "control over the device", so that might kill this option too. 您在帖子的评论中提到您没有“控制设备”,因此也可能会杀死此选项。

There is some mention on this thread of exploits that some apps use , but I don't think they're supported. 一些应用程序使用的漏洞利用程序中一些提及 ,但我认为它们不受支持。 If they still work, they might stop working at some point. 如果他们仍然有效,他们可能会在某个时候停止工作。

I'm trying to do the same thing, in order to push updates to devices we control. 我正在尝试做同样的事情,以推动我们控制的设备的更新。 In our case they're already rooted, and the application has been granted superuser, so I think just copying the .apk over the top of the existing file would probably work, but this seems very hacky. 在我们的例子中,它们已经被root了,并且应用程序已被授予超级用户,所以我认为只是将.apk复制到现有文件的顶部可能会有效,但这看起来非常糟糕。

What seems like a better approach (if it works) is to use the pm Package Manager application: 看起来更好的方法(如果可行)是使用pm Package Manager应用程序:

# /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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM