Можете ли вы развернуть на устройстве через Gradle из командной строки

89

О чем вопрос на самом деле - можете ли вы вводить какие-либо команды непосредственно в gradlew через командную строку для сборки, упаковки и развертывания на устройстве?

Мэтт Веттон
источник
1
gradle tasksполезно увидеть готовые задачи, которые включают установку (но не запуск, как указано ниже)
Дори
Командная строка не привязана к IDE, т.е. такой способ будет работать в Android Studio или IDE на основе Eclipse
Пол Верест,
gradlew installdebug в cmd - в корневой папке должен быть путь
c49

Ответы:

97
$ gradle installDebug

Это отправит apk сборки отладки на устройство, но вам придется вручную запустить приложение.

Рафаэлло
источник
2
Как показано ниже, он был переименован в «gradle installDefaultFlavorDebug»
durka42
2
@ durka42 Это только в том случае, если вы используете ароматизаторы
Mathijs Segers
3
Я бы сказал ./gradlew iD вместо gradle iD
irudyak
1
Возможно ли запустить эту команду внутри установленного плагина Gradle на Eclipse? Я получаю эту ошибку: Задача installDebug не найдена в корневом проекте blahblah.
Доктор Джеки
76

Поскольку вы используете Gradle, вы можете просто добавить свою задачу в 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'      
}

затем назовите его в корне вашего проекта

$ gradle appStart

Обновить:

Если вы используете applicationIdSuffix ".debug", добавьте только .debugк appId, но оставьте действие нетронутым:

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

Роман К
источник
1
Кроме того, последний параметр должен быть 'com.your.packagename/.path.relative.to.your.packagename.MyActivity'вместо того, 'com.example/.MyActivity'если ваша активность не находится в корне вашего пакета.
Light,
66

1. Соберите проект, установите сгенерированный apk на устройство.

# at the root dir of project
$ gradle installDebug

2. Откройте приложение на устройстве.

$ adb shell am start -n yourpackagename/.activityname
rps_deepan
источник
6
alias arun = "gradle installDebug; adb shell am start -n com.example.app/.activity.MainActivity"
Доминик Бартл
Я не могу выбрать installDebug в Gradle. Нет подходящей задачи. Его переименовали?
Йонас Грёгер,
1
@ JonasGröger, похоже, он был переименован в installDefaultFlavorDebug
durka42
@rps_deepan Не могли бы вы переименовать задачу, потому что она была переименована?
Йонас Грёгер
6
alias arun="./gradlew installDebug && adb shell am start -n com.example.package/.LauncherActivity"#Runs step2 Только когда Шаг 1 успешен
Тамме Гауда
7

Однострочное предложение:

Создать проект и установить созданный apk и открыть приложение на устройстве

$ ./gradlew installDebug && adb shell am start -n com.example/.activities.MainActivity
Жоао Мачете
источник
7

Для этого есть три команды:

  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, где $ PACKAGE - это пакет разработки, а $ ACTIVITY - это действие, которое нужно запустить (действие средства запуска).

Для этого я написал сценарий bash с некоторыми другими функциями.

ms2r
источник
4

Более гибкий способ сделать это - использовать обезьяну:

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

Некоторые преимущества этого метода:

  • getAdbExeне требует наличия adb на пути и использует версию adb из sdk, на который указывает in local.properties.
  • monkeyИнструмент позволяет отправить пусковое намерение, так что вы не должны знать название вашей деятельности.
0xcaff
источник
Вместо этого вы могли бы казнитьadb shell am start your.package.name.debugsuffix\.Activity
Викрам Бодичерла
Но что, если вы не знаете названия своей деятельности?
0xcaff
1
Тогда вам не следует писать файл сборки.
kevr 01
3
Я думаю, что это действительно плохая идея, чтобы файл сборки явно знал, какое действие запускать ... похоже, что-то противоречит разделению проблем. Одна простая причина - если вы переименуете / переместите файл Activity, теперь потребуется изменение файла сборки. Вдобавок, намерения кажутся лучшим API для работы, чем файл - я мог бы написать расширение gradle, которое добавляет намерения по умолчанию и способы их запуска, версии и никогда не нужно знать чьи-либо имена классов. Жесткое кодирование никогда не является правильным ответом.
smaudet
1
В этом ответе также отсутствует способ найти корневой пакет - я бы тоже хотел избавиться от имени пакета - например, вместо этого найти его из манифеста.
smaudet
3

Сборка -> удалить старую версию -> установить новую версию -> запустить приложение.

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]

Или, если вы хотите установить и запустить приложение в режиме отладки.

./gradlew installDebug && adb shell am start -n [application package]/.[application name]
Goffity
источник
Спасибо. @ alexander-polomodov
Гоффити
2
task appStart(type: Exec, dependsOn: 'installDebug') {
    commandLine android.adbExe, 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'
}
кричать
источник
Лучшее решение пробега
Orgatres
1

Я написал эту задачу, чтобы иметь возможность установить, а также открыть приложение на устройстве. Так как у меня было несколько buildTypesи flavorsс различными идентификаторами приложений, не было возможности жестко закодировать имя пакета. Поэтому я написал это так:

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

Это даст вам open{variant}все, что у install{variant}вас уже есть.

маклир
источник