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):
- ¿Cómo usar Robotium con Android Studio?
- ¿Cómo puedo comprobar en Robotium que la aplicación ha terminado?
- ¿Cómo puedo realizar mis pruebas independientes de Robotium UI en paralelo?
- Interfaz Android robotium pruebas con Teamcity
- La prueba de instrumentación falla al azar con multidexado activado
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.
- Dos robotium caso de prueba, pero el segundo colgar no responde (en JUnit View)
- Robotium - Escoja una cuenta en AccoutPicker con solo
- "La prueba no se ejecutó hasta la finalización." Motivo: 'La instrumentación ejecutada falló debido a' El proceso se estrelló. '' Mientras se ejecutan varios testcases
- Falso positivos: junit.framework.AssertionFailedError: EditText no se encuentra
- Atajo de teclado para Ejecutar como -> Android JUnit Test en Eclipse
- ¿Cómo puedo ejecutar una sola prueba con gradle android
- Cómo manejar la actividad de la aplicación externa en android utilizando robotium
- Cómo probar el evento swipe / fling usando jUnit en Android testcase
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
- ¿Es mi "hal_process_report_ind: mala calidad del artículo: 11" algo de qué preocuparse?
- Transferencia de archivos Bluetooth Android