Instalación de un apk de Android mediante programación como parte de un marco de prueba

Estoy intentando instalar un apk programáticamente, pero no estoy teniendo mucha suerte. Estoy configurando un marco de pruebas automatizado dirigido a dispositivos físicos, y quiero que los dispositivos de prueba recuperen el último apk del servidor de compilación antes de ejecutar pruebas. Aunque soy consciente de que no hay forma general de instalar realmente un apk sin el consentimiento del usuario, estoy curioso si podría haber algún enfoque disponible en el caso en que un desarrollador posee tanto el apk como el dispositivo.

Enfoques que he intentado en el pasado (el apk se ha descargado a pathName / apkFilename):

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

Y:

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

Aunque no he podido conseguir el primer acercamiento al trabajo, el segundo intento crea un diálogo del sistema que pide al usuario confirmar la instalación (tan casi allí, pero no absolutamente). Dado que es un diálogo del sistema, por desgracia, no puedo usar Robotium para confirmar.

Muchas personas están tratando de resolver problemas similares. Creo que no puede ser posible instalar un APK sin confirmación, al menos no fácilmente:

  • Instalación silenciosa en dispositivos Android

He aceptado por un tiempo ahora que es imposible instalar silenciosamente una aplicación en Android

  • Instalar aplicaciones en silencio, con el permiso INSTALL_PACKAGES concedido

No puedes instalar la aplicación silenciosamente, no es compatible con Android por razones obvias. La instalación de la aplicación requiere que la intervención del usuario continúe.

Soluciones?

Necesitas que la aplicación tenga el permiso android.permission.INSTALL_PACKAGES .

Hay algunos consejos sobre los hilos sobre cómo hacer esto si tiene ciertas privilegios, aunque puede ser difícil conseguir que su aplicación se ejecute de esa manera. Es posible que tenga que instalar en un directorio especial, y / o puede que tenga que ejecutar como un usuario especial (que puede ser difícil de hacer).

Una forma posible de ejecutar la aplicación con permisos elevados: ¿Cómo puedo obtener permisos de root a través del SDK de Android?

En este hilo, mencionan que tendrías que "root" tu teléfono para habilitar ese permiso:

No me sorprendería si esto anula la garantía sin embargo. Usted mencionó en los comentarios en su mensaje que no tiene "control sobre el dispositivo", por lo que podría matar a esta opción también.

Hay alguna mención en este hilo de exploits que algunas aplicaciones utilizan , pero no creo que sean compatibles. Si todavía funcionan, podrían dejar de funcionar en algún momento.

Estoy tratando de hacer lo mismo, con el fin de empujar las actualizaciones de los dispositivos que controlamos. En nuestro caso, ya están enraizadas, y la aplicación se ha concedido superusuario, por lo que creo que sólo copiar el .apk sobre la parte superior del archivo existente probablemente funcionaría, pero esto parece muy hacky.

Lo que parece un mejor enfoque (si funciona) es usar la aplicación pm 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 
  • ¿Por qué obtengo un NoClassDefFoundError al ejecutar mi prueba en ActionBarActivity?
  • ¿Cómo ejecutar pruebas de unidad con todos los permisos de Android M concedidos?
  • Robotium: ¿Cómo espero que termine la carga antes de continuar?
  • Utilice tanto InstrumentationTestRunner como AndroidJUnitRunner con Robotium y Espresso
  • No se puede conseguir que Robotium funcione en Android Studio
  • ChooserActivity no se encuentra con las pruebas Robotium mientras ChooserActivity se muestra en Nexus 5
  • Ejemplos de Robotium
  • Pruebas de aceptación automatizadas para dispositivos iOS y Android
  • Ejecute la prueba Junit utilizando la instrumentación de android en un paquete con clases en orden específico
  • Manera correcta de abrir NavigationDrawer y seleccionar elementos en Robotium
  • Android y Robotium - Prueba la actividad que espera un extra?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.