Установка Android apk программно как часть тестовой среды - PullRequest
7 голосов
/ 08 декабря 2011

Я пытаюсь установить 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 для подтверждения.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Многие люди пытаются решить подобные проблемы.Я полагаю, что невозможно установить APK без подтверждения, по крайней мере, нелегко:

Я уже давно согласился, что невозможно установить приложение на Android без вывода сообщений

Вы не можете установить приложение без вывода сообщений, оно не поддерживается Android по понятным причинам.Для продолжения установки приложения требуется вмешательство пользователя.

Временные решения?

Приложение должно иметь разрешение android.permission.INSTALL_PACKAGES.

В этих потоках есть некоторые подсказкио том, как это сделать, если у вас есть определенные привилегии, хотя может быть трудно заставить ваше приложение работать таким образом.Вам может потребоваться установка в специальный каталог и / или запуск в качестве специального пользователя (что может быть трудно).

Один из возможных способов запустить приложение с повышенными разрешениями: Как я могу получить root-права через Android SDK?

В этой теме они упоминают, что вам, возможно, придется «рутировать» свой телефон, чтобы включить это разрешение:

Я не удивлюсь, если это аннулирует гарантию.В комментариях к вашему сообщению вы упомянули, что у вас нет «контроля над устройством», так что это может убить и эту опцию.

В этой ветке некоторых уязвимостей упоминается , что некоторые приложенияиспользуйте , но я не думаю, что они поддерживаются.Если они все еще работают, они могут перестать работать в какой-то момент.

0 голосов
/ 08 февраля 2012

Я пытаюсь сделать то же самое, чтобы отправить обновления на устройства, которые мы контролируем. В нашем случае они уже укоренились, и приложению был предоставлен суперпользователь, поэтому я думаю, что просто скопировать .apk поверх существующего файла, вероятно, будет работать, но это выглядит очень странно.

Что кажется лучшим подходом (если он работает), так это использование приложения 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
...