Você pode implantar em um dispositivo via Gradle a partir da linha de comando

89

O que a pergunta diz realmente - você pode emitir qualquer comando diretamente para gradlew por meio da linha de comando para construir, empacotar e implantar em um dispositivo?

Matt Whetton
fonte
1
gradle tasksé útil ver as tarefas prontas para uso - que incluem a instalação (mas não começando conforme declarado abaixo)
Dori
A linha de comando não é específica do IDE, ou seja, desta forma funcionaria no Android Studio ou no IDE baseado em Eclipse
Paul Verest,
gradlew installdebug em cmd - pasta raiz deve ser o caminho
c49

Respostas:

97
$ gradle installDebug

Isso enviará o apk de compilação de depuração para o dispositivo, mas você terá que iniciar o aplicativo manualmente.

Rafaello
fonte
2
Conforme mostrado abaixo, foi renomeado para "gradle installDefaultFlavorDebug"
durka42
2
@ durka42 Este é apenas o caso se você usar sabores
Mathijs Segers
3
Eu diria ./gradlew iD em vez de gradle iD
irudyak
1
É possível executar este comando dentro do plug-in Gradle instalado no Eclipse? Eu recebo este erro: Tarefa 'installDebug' não encontrada no projeto root 'blahblah'.
Dr.jacky
75

Como você está usando o Gradle, pode simplesmente adicionar sua própria tarefa em 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'      
}

em seguida, chame-o na raiz do seu projeto

$ gradle appStart

Atualizar:

Se você estiver usando applicationIdSuffix ".debug", adicione .debugao appId apenas, mas não altere a atividade:

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

Roman K
fonte
1
Além disso, o último parâmetro deve ser em 'com.your.packagename/.path.relative.to.your.packagename.MyActivity'vez de 'com.example/.MyActivity'se sua atividade não estiver na raiz do pacote.
Luz de
66

1. Construir projeto, instalar apk gerado no dispositivo

# at the root dir of project
$ gradle installDebug

2. Abra o aplicativo no dispositivo

$ adb shell am start -n yourpackagename/.activityname
rps_deepan
fonte
6
alias arun = "gradle installDebug; adb shell am start -n com.example.app/.activity.MainActivity"
Dominic Bartl
Não consigo selecionar installDebug no gradle. Não há tarefa adequada. Foi renomeado?
Jonas Gröger
1
@ JonasGröger parece ter sido renomeado para installDefaultFlavorDebug
durka42
@rps_deepan Você poderia renomear a tarefa porque ela foi renomeada?
Jonas Gröger
6
alias arun="./gradlew installDebug && adb shell am start -n com.example.package/.LauncherActivity"# Executa a etapa 2 apenas quando a Etapa 1 é bem-sucedida
Thamme Gowda
7

Frase de uma linha:

Crie o projeto e instale o apk gerado e abra o aplicativo no dispositivo

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

Existem três comandos para fazer isso:

  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, em que $ PACKAGE é o pacote de desenvolvimento e $ ACTIVITY é a atividade a ser iniciada (a atividade do iniciador).

Estou escrevendo um script bash para fazer isso , com outros poucos recursos.

ms2r
fonte
4

Uma maneira mais flexível de fazer isso é usando o macaco:

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

Algumas vantagens deste método:

  • getAdbExenão requer que o adb esteja no caminho e usa a versão do adb do SDK apontado em local.properties.
  • A monkeyferramenta permite que você envie uma intenção do iniciador, então você não precisa saber o nome da sua atividade.
0xcaff
fonte
Em vez disso, você poderia executaradb shell am start your.package.name.debugsuffix\.Activity
Vikram Bodicherla de
Mas e se você não souber o nome da sua atividade?
0xcaff
1
Então você não deveria estar escrevendo o arquivo de construção.
kevr 01 de
3
Eu acho que é uma ideia realmente ruim para o arquivo de compilação saber explicitamente qual Activity executar ... parece algo que a separação de interesses vai contra. Uma razão simples - se você renomear / mover seu arquivo de atividade, isso agora requer uma mudança no arquivo de construção. Além disso, os intents parecem ser uma API melhor para executar do que um arquivo - eu poderia escrever uma extensão do gradle que adiciona intents padrão e maneiras de executá-los, crie versões e nunca precise saber os nomes das classes de ninguém. A codificação permanente nunca é a resposta certa.
smaudet
1
Essa resposta também carece de uma maneira de encontrar o pacote raiz - eu gostaria de me livrar do nome do pacote também - por exemplo, descobri-lo no manifesto.
smaudet
3

Construir -> desinstalar versão antiga -> instalar nova versão -> executar aplicativo.

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]

Ou se você deseja instalar e executar o aplicativo no tipo de depuração.

./gradlew installDebug && adb shell am start -n [application package]/.[application name]
Goffity
fonte
Obrigado. @ alexander-polomodov
Goffity
2
task appStart(type: Exec, dependsOn: 'installDebug') {
    commandLine android.adbExe, 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'
}
pio
fonte
Melhor solução de corrida
Orgatres
1

Escrevi esta tarefa para poder instalar e também abrir o aplicativo no dispositivo. Desde que eu tinha múltipla buildTypese flavorscom diferentes ids de aplicação, não era viável para codificar o nome do pacote. Então eu escrevi assim:

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

Isso lhe daria open{variant}para cada install{variant}tarefa que você já tem.

maclir
fonte