Czy możesz wdrożyć na urządzeniu za pomocą Gradle z wiersza poleceń

89

Co naprawdę mówi to pytanie - czy możesz wydać jakiekolwiek polecenia bezpośrednio do gradlew za pomocą wiersza poleceń, aby zbudować, spakować i wdrożyć na urządzeniu?

Matt Whetton
źródło
1
gradle taskspomocne jest zobaczenie gotowych zadań - w tym instalacji (ale nie uruchamiania, jak podano poniżej)
Dori
Linia poleceń nie jest specyficzna dla IDE, .ie w ten sposób działałoby z Android Studio lub IDE opartym na Eclipse
Paul Verest,
gradlew installdebug w cmd - katalog główny powinien być ścieżką
c49

Odpowiedzi:

97
$ gradle installDebug

Spowoduje to przeniesienie pakietu apk kompilacji do debugowania na urządzenie, ale musisz ręcznie uruchomić aplikację.

rafaello
źródło
2
Jak poniżej, jego nazwa została zmieniona na „gradle installDefaultFlavorDebug”
durka42
2
@ durka42 Dzieje się tak tylko wtedy, gdy używasz smaków
Mathijs Segers
3
Powiedziałbym ./gradlew iD zamiast gradle iD
irudyak
1
Czy można uruchomić to polecenie w zainstalowanej wtyczce Gradle na Eclipse? Pojawia się ten błąd: nie znaleziono zadania „installDebug” w projekcie głównym „blahblah”.
Dr Jacky
76

Ponieważ używasz Gradle, możesz w prosty sposób dodać własne zadanie w pliku 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'      
}

następnie wywołaj go w katalogu głównym projektu

$ gradle appStart

Aktualizacja:

Jeśli używasz applicationIdSuffix ".debug", dodaj tylko .debugdo appId, ale pozostaw aktywność nietkniętą:

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

Roman K.
źródło
1
Ponadto ostatni parametr powinien znajdować się 'com.your.packagename/.path.relative.to.your.packagename.MyActivity'zamiast, 'com.example/.MyActivity'jeśli Twoja aktywność nie znajduje się w katalogu głównym pakietu.
Światło
66

1. Zbuduj projekt, zainstaluj wygenerowany apk na urządzeniu

# at the root dir of project
$ gradle installDebug

2. Otwórz aplikację na urządzeniu

$ adb shell am start -n yourpackagename/.activityname
rps_deepan
źródło
6
alias arun = "gradle installDebug; adb shell am start -n com.example.app/.activity.MainActivity"
Dominic Bartl
Nie mogę wybrać installDebug w gradle. Nie ma odpowiedniego zadania. Czy została zmieniona?
Jonas Gröger
1
@ JonasGröger, wydaje się, że została zmieniona na installDefaultFlavorDebug
durka42
@rps_deepan Czy możesz zmienić nazwę zadania, ponieważ została ona zmieniona?
Jonas Gröger
6
alias arun="./gradlew installDebug && adb shell am start -n com.example.package/.LauncherActivity"# Uruchamia krok 2 Tylko wtedy, gdy krok 1 zakończy się sukcesem
Thamme Gowda
7

Jedno zdanie liniowe:

Zbuduj projekt i zainstaluj wygenerowany apk i otwórz aplikację na urządzeniu

$ ./gradlew installDebug && adb shell am start -n com.example/.activities.MainActivity
João Machete
źródło
7

Aby to osiągnąć, są trzy polecenia:

  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, gdzie $ PACKAGE to pakiet programistyczny, a $ ACTIVITY to działanie, które ma zostać uruchomione (działanie programu uruchamiającego).

W tym celu pisałem skrypt basha z kilkoma innymi funkcjami.

ms2r
źródło
4

Bardziej elastycznym sposobem jest użycie monkey:

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

Niektóre zalety tej metody:

  • getAdbExenie wymaga adb na ścieżce i używa wersji adb z sdk wskazanego w local.properties.
  • monkeyNarzędzie pozwala na wysyłanie wyrzutnię intencji, więc nie trzeba znać nazwę swojej działalności.
0xcaff
źródło
Mógłbyś zamiast tego wykonaćadb shell am start your.package.name.debugsuffix\.Activity
Vikram Bodicherla
Ale co, jeśli nie znasz nazwy swojej działalności?
0xcaff
1
Wtedy nie powinieneś pisać pliku kompilacji.
kevr
3
Myślę, że to naprawdę zły pomysł, ponieważ plik kompilacji wyraźnie wie, które działanie ma zostać uruchomione ... wydaje się, że oddzielenie obaw jest sprzeczne. Z jednego prostego powodu - jeśli zmienisz nazwę / przeniesiesz plik Activity, wymaga to teraz zmiany pliku kompilacji. Ponadto intencje wydają się być lepszym interfejsem API niż plik - mógłbym napisać rozszerzenie gradle, które dodaje domyślne intencje i sposoby ich uruchamiania, nadaje mu wersję i nigdy nie potrzebowałbym znać niczyich nazw klas. Twarde kodowanie nigdy nie jest właściwą odpowiedzią.
smaudet
1
W tej odpowiedzi brakuje również sposobu na znalezienie pakietu głównego - chciałbym też pozbyć się nazwy pakietu - np. Zamiast tego znaleźć ją w manifeście.
smaudet
3

Kompiluj -> odinstaluj starą wersję -> zainstaluj nową wersję -> uruchom aplikację.

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]

Lub jeśli chcesz zainstalować i uruchomić aplikację w trybie debugowania.

./gradlew installDebug && adb shell am start -n [application package]/.[application name]
Goffity
źródło
Dzięki. @ alexander-polomodov
Goffity
2
task appStart(type: Exec, dependsOn: 'installDebug') {
    commandLine android.adbExe, 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'
}
trąbienie
źródło
Najlepsze rozwiązanie run
Orgatres
1

Napisałem to zadanie, aby móc zainstalować, a także otworzyć aplikację na urządzeniu. Ponieważ miałem wiele buildTypesi flavorsróżne identyfikatory aplikacji, nie można było na stałe zakodować nazwy pakietu. Więc zamiast tego napisałem to tak:

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

To dałoby ci open{variant}za każde install{variant}zadanie, które już masz.

maclir
źródło