以编程方式安装 Android apk 作为测试框架的一部分
我正在尝试以编程方式安装 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 进行确认。
I'm attempting to install an apk programmatically, but I'm not having much luck. 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. 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.
Approaches I've tried in the past (the apk has been downloaded to 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.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
很多人都在尝试解决类似的问题。我相信在没有确认的情况下可能无法安装 APK,至少不容易:
解决方法?
您需要该应用拥有
android.permission.INSTALL_PACKAGES
权限。如果您拥有某些特权,这些线程上有一些关于如何执行此操作的提示,尽管可能很难让您的应用程序以这种方式运行。您可能必须安装到特殊目录,和/或可能必须以特殊用户身份运行(这可能很难做到)。
以提升的权限运行应用程序的一种可能方法:如何我可以通过 Android SDK 获得 root 权限吗?
在此线程中,他们提到您可能必须“root”您的手机才能启用该权限:
我不会如果这使保修失效,我会感到惊讶。您在帖子的评论中提到您没有“对设备的控制权”,因此这也可能会终止此选项。
一些提及一些应用程序使用的漏洞利用线程,但我不认为他们受到支持。如果他们仍然工作,他们可能会在某个时候停止工作。
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:
Workarounds?
You need the app to have the
android.permission.INSTALL_PACKAGES
permission.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?
On this thread, they mention you might have to "root" your phone to enable that permission:
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.
我正在尝试做同样的事情,以便将更新推送到我们控制的设备。在我们的例子中,它们已经获得 root 权限,并且应用程序已被授予超级用户,因此我认为仅将 .apk 复制到现有文件的顶部可能会起作用,但这看起来非常 hacky。
似乎更好的方法(如果有效的话)是使用
pm
Package Manager 应用程序: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.
What seems like a better approach (if it works) is to use the
pm
Package Manager application: