¿Puedes implementar en un dispositivo a través de Gradle desde la línea de comando?

89

Lo que dice la pregunta realmente: ¿puede emitir comandos directamente a gradlew a través de la línea de comandos para compilar, empaquetar e implementar en un dispositivo?

Matt Whetton
fuente
1
gradle tasksEs útil ver las tareas listas para usar, que incluyen la instalación (pero no el inicio como se indica a continuación)
Dori
La línea de comando no es específica de IDE, .ie de esta manera funcionaría desde Android Studio o IDE basado en Eclipse
Paul Verest
gradlew installdebug en cmd - la carpeta raíz debe ser la ruta
c49

Respuestas:

97
$ gradle installDebug

Esto enviará el apk de la compilación de depuración al dispositivo, pero debe iniciar la aplicación manualmente.

rafaello
fuente
2
Como se muestra a continuación, se le cambió el nombre a "gradle installDefaultFlavorDebug"
durka42
2
@ durka42 Este es solo el caso si usa sabores
Mathijs Segers
3
Yo diría ./gradlew iD en lugar de gradle iD
irudyak
1
¿Es posible ejecutar este comando dentro del complemento Gradle instalado en Eclipse? Recibo este error: La tarea 'installDebug' no se encuentra en el proyecto raíz 'blahblah'.
Dr.jacky
76

Dado que está utilizando Gradle, puede simplemente agregar su propia tarea en build.gradle

task appStart(type: Exec, dependsOn: 'installDebug') {
    // linux 
    commandLine 'adb', 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'

    // windows
    // commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'      
}

luego llámalo en la raíz de tu proyecto

$ gradle appStart

Actualizar:

Si está utilizando applicationIdSuffix ".debug", agregue solo .debugal appId pero deje la actividad intacta:

'com.example.debug/com.example.MyActivity'

Roman K
fuente
1
Además, el último parámetro debe ser en 'com.your.packagename/.path.relative.to.your.packagename.MyActivity'lugar de 'com.example/.MyActivity'si su actividad no está en la raíz de su paquete.
Luz
66

1. Construya el proyecto, instale el apk generado en el dispositivo

# at the root dir of project
$ gradle installDebug

2. Abra la aplicación en el dispositivo

$ adb shell am start -n yourpackagename/.activityname
rps_deepan
fuente
6
alias arun = "gradle installDebug; adb shell am start -n com.example.app/.activity.MainActivity"
Dominic Bartl
No puedo seleccionar installDebug en gradle. No hay tarea adecuada. ¿Ha sido renombrado?
Jonas Gröger
1
@ JonasGröger parece haber sido renombrado a installDefaultFlavorDebug
durka42
@rps_deepan ¿Podría cambiar el nombre de la tarea porque ha cambiado de nombre?
Jonas Gröger
6
alias arun="./gradlew installDebug && adb shell am start -n com.example.package/.LauncherActivity"#Ejecuta el paso 2 solo cuando el paso 1 es exitoso
Thamme Gowda
7

Oración de una línea:

Cree un proyecto e instale el apk generado y la aplicación abierta en el dispositivo

$ ./gradlew installDebug && adb shell am start -n com.example/.activities.MainActivity
João Machete
fuente
7

Hay tres comandos para lograr esto:

  1. ./gradlew assembleDebug #To build the project

  2. adb install -r ./app/build/outputs/apk/app-debug.apk #To install it to the device

  3. adb shell am start -n $PACKAGE/$PACKAGE.$ACTIVITY #To launch the application in the device, donde $ PACKAGE es el paquete de desarrollo y $ ACTIVITY es la actividad que se lanzará (la actividad del lanzador).

He estado escribiendo un script bash para hacer esto , con otras características.

ms2r
fuente
4

Una forma más flexible de hacerlo es usando monkey:

task runDebug (type: Exec, dependsOn: 'installDebug') {
    commandLine android.getAdbExe().toString(), "shell",
        "monkey",
        "-p", "your.package.name.debugsuffix",
        "-c", "android.intent.category.LAUNCHER", "1"
}

Algunas ventajas de este método:

  • getAdbExeno requiere que adb esté en la ruta y usa la versión adb del sdk apuntado en local.properties.
  • La monkeyherramienta le permite enviar una intención de iniciador, por lo que no es necesario que sepa el nombre de su actividad.
0xcaff
fuente
En su lugar, podría ejecutaradb shell am start your.package.name.debugsuffix\.Activity
Vikram Bodicherla
Pero, ¿y si no conoce el nombre de su actividad?
0xcaff
1
Entonces no debería escribir el archivo de compilación.
kevr
3
Creo que es una muy mala idea que el archivo de compilación sepa explícitamente qué actividad ejecutar ... parece que la separación de preocupaciones va en contra. Una razón simple: si cambia el nombre / mueve su archivo de actividad, esto ahora requiere un cambio de archivo de compilación. Además, las intenciones parecen una mejor api para ejecutar que un archivo: podría escribir una extensión de gradle que agregue intenciones predeterminadas y formas de ejecutarlas, versionarlas y nunca necesitar saber los nombres de las clases de nadie. La codificación rígida nunca es la respuesta correcta.
smaudet
1
Esta respuesta también carece de una forma de encontrar el paquete raíz; me gustaría deshacerme del nombre del paquete también, por ejemplo, descubrirlo desde el manifiesto.
smaudet
3

Compilar -> desinstalar la versión anterior -> instalar la nueva versión -> ejecutar la aplicación.

echo "Build application" && ./gradlew clean build && 
echo "Uninstall application" && adb uninstall [application package] && 
echo "Install application" && adb -d install app/build/outputs/apk/<build type>/[apk name].apk echo "Run application" && 
adb shell am start -n [application package]/.[application name]

O si desea instalar y ejecutar la aplicación en tipo de depuración.

./gradlew installDebug && adb shell am start -n [application package]/.[application name]
Goffity
fuente
Gracias. @ alexander-polomodov
Goffity
2
task appStart(type: Exec, dependsOn: 'installDebug') {
    commandLine android.adbExe, 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'
}
ulular
fuente
Mejor solución de corrida
Orgatres
1

Escribí esta tarea para poder instalar y también abrir la aplicación en el dispositivo. Como tenía varios identificadores de aplicaciones buildTypesy flavorscon diferentes, no era posible codificar el nombre del paquete. Así que lo escribí así en su lugar:

android.applicationVariants.all { variant ->
    task "open${variant.name.capitalize()}" {
        dependsOn "install${variant.name.capitalize()}"

        doLast {
            exec {
                commandLine "adb shell monkey -p ${variant.applicationId} -c android.intent.category.LAUNCHER 1".split(" ")
            }
        }
    }
}

Esto le daría open{variant}para cada install{variant}tarea que ya tiene.

maclir
fuente