Can you deploy to a device via Gradle from the command line
Asked Answered
B

9

94

What the question says really - can you issue any commands directly to gradlew via the command line to build, package and deploy to a device?

Blagoveshchensk answered 26/6, 2013 at 16:59 Comment(2)
gradle tasks is helpful to see the out of the box tasks - which includes installing (but not starting as stated below)Pelfrey
Command line is not IDE specific, .i.e. this way would work from Android Studio or Eclipse-based IDESilvers
O
101
$ gradle installDebug

This will push the debug build apk to device, but you have to manually start the application.

Oscillatory answered 26/6, 2013 at 18:45 Comment(4)
As below, it's been renamed to "gradle installDefaultFlavorDebug"Robey
@Robey This is only the case if you use flavorsDasilva
I'd say ./gradlew iD instead of gradle iDMoniz
Is that possible to run this command inside installed Gradle Plugin on Eclipse? I get this error: Task 'installDebug' not found in root project 'blahblah'.Erdda
C
76

Since you are using Gradle, you could simple add your own task in 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'      
}

then call it in your project root

$ gradle appStart

Update:

If you are using applicationIdSuffix ".debug", add .debug to the appId only but leave the activity untouched:

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

Contention answered 24/2, 2014 at 15:39 Comment(1)
In addition, the last parameter should be 'com.your.packagename/.path.relative.to.your.packagename.MyActivity' instead of 'com.example/.MyActivity' if your Activity is not in the root of your package.Crystalcrystalline
A
68

1. Build project, install generated apk to device

# at the root dir of project
$ gradle installDebug

2. Open app on device

$ adb shell am start -n yourpackagename/.activityname
Architectonics answered 29/6, 2013 at 6:56 Comment(6)
alias arun="gradle installDebug; adb shell am start -n com.example.app/.activity.MainActivity"Haveman
I cannot select installDebug in gradle. There is no suitable task. Has it been renamed?Cohby
@JonasGröger it seems to have been renamed to installDefaultFlavorDebugRobey
@Architectonics Could you rename the task because it has been renamed?Cohby
alias arun="./gradlew installDebug && adb shell am start -n com.example.package/.LauncherActivity" #Runs step2 Only when Step 1 is successSmokechaser
It's worth noting, the task may be different if you have build variants (as shown in the lower left of Android Studio). For me the command was ./gradlew installDevDebug. This could change the package too: am start -n com.example.example_dev/com.example.example.MainActivity. This stumped me for a while.Snead
B
7

One line sentence:

Build project & Install generated apk & Open app on device

$ ./gradlew installDebug && adb shell am start -n com.example/.activities.MainActivity
Binny answered 19/1, 2015 at 15:58 Comment(0)
G
7

There are three commands to accomplish this:

  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, where $PACKAGE is the development package and $ACTIVITY is the activity to be launched (the launcher activity).

I've been writing a bash script to do this, with other few features.

Gefell answered 18/7, 2015 at 16:53 Comment(0)
L
5

Build -> uninstall old verion -> install new version -> run application.

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]

Or if you want install and run application in debug type.

./gradlew installDebug && adb shell am start -n [application package]/.[application name]
Lavellelaven answered 7/5, 2018 at 10:54 Comment(1)
Thanks. @alexander-polomodovLavellelaven
L
4

A more flexible way to do it is by using monkey:

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

Some advantages to this method:

  • getAdbExe doesn't require adb to be on the path and uses the adb version from the sdk pointed to in local.properties.
  • The monkey tool allows you to send a launcher intent, so you aren't required to know the name of your activity.
Lanfri answered 30/7, 2016 at 20:44 Comment(6)
You could instead execute adb shell am start your.package.name.debugsuffix\.ActivityWhitfield
But what if you don't know your activity's name?Lanfri
Then you shouldn't be writing the build file.Oppidan
I think its a really bad idea for the build file know explicitly which Activity to run...seems like something separation of concerns goes against. One simple reason - if you rename/move your Activity file, this now requires a build file change. Additionally, intents seem like a better api to run against than a file - I could write a gradle extension that adds default intents and ways to run them, version it, and never need to know anybody's class names. Hard coding is never the right answer.Nasa
This answer also lacks a way to find the root package - I'd like to get rid of the package name too - e.g. discover it from the manifest instead.Nasa
@Lanfri using android.intent.category.LAUNCHER 1 you don't need to know the activity.Butch
T
2
task appStart(type: Exec, dependsOn: 'installDebug') {
    commandLine android.adbExe, 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'
}
Tinge answered 26/2, 2016 at 2:45 Comment(1)
Best solution of runQuidnunc
Q
2

I wrote this task to be able to install and also open the application on the device. Since I had multiple buildTypes and flavors with different application ids, it was not feasible to hard code the package name. So I wrote it like this instead:

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(" ")
            }
        }
    }
}

This would give you open{variant} for every install{variant} task you already have.

Quincey answered 29/3, 2017 at 7:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.