Notificaciones de Android a través de ADB
Estoy escribiendo un script de shell que te permite instalar un .apk en todos los teléfonos android conectados a una computadora en paralelo usando Terminal . En mi empresa hacemos pruebas en muchos dispositivos y así esto hace que la parte de instalación sea más rápida.
Pregunta: Estoy buscando una manera de identificar rápidamente qué teléfonos han tenido el .apk instalado a través de algún tipo de retroalimentación / notificación. Lo ideal sería que puedas ver qué teléfonos han recibido el .apk simplemente mirando (algún tipo de sonido o pantalla flash) o simplemente desbloqueando el dispositivo (por ejemplo, la aplicación recién instalada se ha abierto).
- Cómo salir de APK de shell
- Hotspot Android 4.2.2+
- ¿Cómo puedo obtener el tamaño del sistema de archivos android en bytes de shell de adb?
- Cómo obtener el tiempo de arranque del sistema Android
- Monte una tarjeta SD manualmente desde el shell de adb en android
¿Alguna idea de cómo podría hacer cualquiera de estas cosas?
He leído sobre el lanzamiento de aplicaciones, pero parece que no es algo que se puede hacer con sólo el .apk (también se debe especificar una actividad …).
¡Cualquier idea será altamente apreciada!
¡Gracias!
- ¿Cómo desinstalar la propia aplicación de / system / app?
- Android: Adb rechazó la conexión al cliente
- Cómo usar el mono androide
- Android 2.3: Sistema de archivos de sólo lectura pegado
- No se pudo conectar a tcp: 5037: no se puede conectar a 127.0.0.1:5037: No se pudo establecer conexión porque la máquina de destino lo rechazó activamente. (10061)
- ¿Cómo traceroute en adb shell?
- Obtener Android versión del sistema operativo del dispositivo conectado a través de adb
- Enviar texto no inglés usando adb (input keyevent) o usando monkeyrunner
Encontré mi propia solución!
Yo estaba usando:
aapt dump badging
Pensando que esto sólo saldría el nombre del paquete. Resulta que sale mucho más de información útil. Una de las líneas que noté fue la salida es la actividad de lanzamiento de la aplicación. Pude aislar esta línea con grep y luego cortar la actividad de lanzamiento como tal:
aapt dump badging $1 | grep launchable | cut -d "'" -f 2
Luego hay un comando que le permite lanzar una aplicación si conoce una de sus actividades. Al agregar esta línea se inicia la actividad que se recuperó utilizando el comando anterior.
adb -s $deviceID shell am start -a android.intent.action.MAIN -n $packageName/$launchableActivity
Puse esta línea en mi para el lazo inmediatamente después del comando de la instalación. No después de instalar la aplicación, el script intentará iniciarla después. ¡Muy útil!
¡Gracias por toda la ayuda! :RE
Utilice el gestor de paquetes para comprobar si el APK está instalado:
pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [FILTER] pm list packages: prints all packages, optionally only those whose package name contains the text in FILTER. Options: -f: see their associated file. -d: filter to only show disbled packages. -e: filter to only show enabled packages. -s: filter to only show system packages. -3: filter to only show third party packages. -i: see the installer for the packages. -u: also include uninstalled packages.
por ejemplo
$ adb shell pm list packages com.example.mypkg
Puede utilizar el 'adb shell am start' con argumentos que necesitará buscar para iniciar su paquete recién instalado.
Si hay alguna preocupación acerca de no ser confundido por un viejo, adb desinstalar el antiguo antes de instalar el nuevo, o mejor aún tener su splash actividad mostrar el control de versiones.
En realidad, puede empezar a iniciar una actividad que no conoce el iniciador, por lo que podría utilizarla para iniciar directamente una actividad "acerca de" que mostraría la versión actual. Su elección si usted hace eso disponible en el curso ordinario de la aplicación, o lo utiliza solamente esta vez como chapoteo.
También debe ser capaz de analizar la salida del comando adb install – tendrá que ver si envía errores / éxito a stderr o stdout.
ACTUALIZACIÓN: A continuación se muestra cómo realizar una actividad que puede utilizar para activar la pantalla y mostrar un mensaje como este:
adb shell 'am start -n com.example.testreport/.ReportActivity -e result PASS'
El código se cribbed pesadamente de construido en AlarmClock de una versión androide temprana, requerirá:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
En el manifiesto
package com.example.testreport; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.PowerManager; import android.util.Log; import android.view.Gravity; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.TextView; public class ReportActivity extends Activity { PowerManager.WakeLock sScreenWakeLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(android.view.Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); } protected void onStart() { super.onStart(); if (sScreenWakeLock == null) { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); sScreenWakeLock = pm.newWakeLock( PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "ReportActivity Wakelock"); sScreenWakeLock.acquire(); } TextView tv=new TextView(this); tv.setTextSize(30); tv.setGravity(Gravity.CENTER); Intent i = getIntent(); if ((i != null) && (i.hasExtra("result"))) tv.setText(i.getStringExtra("result")); else tv.setText("???"); setContentView(tv); } protected void onStop() { if (sScreenWakeLock != null) { sScreenWakeLock.release(); sScreenWakeLock = null; } super.onStop(); } }
Probablemente puede utilizar algunos de limpieza y mejora; Por ejemplo, en el momento en que no puede apagar el teléfono con el botón de encendido a menos que primero detenga la actividad navegando lejos para que pierda visibilidad.
Una forma de ver esto se está haciendo es una aplicación que verifica la instalación de las aplicaciones. Específicamente, una lista de verificación de las aplicaciones que deben instalarse en el dispositivo y cuando PackageManager finaliza la instalación, se actualiza según esta difusión.
Aparte de hacerlo fuera de la capa de la aplicación, no creo que sea posible a menos que olfatear el puerto USB que va al dispositivo e identificar los comandos y la carga útil y la figura que hacia fuera (HACK)