it-swarm.it

Come avviare e interrompere Android da una shell adb?

Devo scrivere uno script Shell per avviare e interrompere un Android.

45
ranjitrock

Sono un principiante in Android, ma funziona così:

in AndroidManifest.xml, assicurati di, all'interno di <application>, hanno qualcosa del genere:

<service Android:name="com.some.package.name.YourServiceSubClassName" Android:permission="com.some.package.name.YourServiceSubClassName">
    <intent-filter>
        <action Android:name="com.some.package.name.YourServiceSubClassName"/>
    </intent-filter>
</service>

dove YourServiceSubClassName estende Android.app.Service è la tua Java classe che è il servizio. Dove com.some.package è il nome del pacchetto, per me sia in AndroidManifest.xml che in Java. Usato n articolo di javabeat.net come aiuto, cerca <service>

Nota inoltre, presumibilmente tra il nome del pacchetto e il nome della classe ci dovrebbe essere .service. nel testo, immagino che questa sia una convenzione, ma per me questo ha causato ClassNotFoundException che non ho ancora risolto.

Quindi, installa il tuo apk. Ho fatto da Eclipse ma anche adb install -r yourApkHere.apk dovrebbe funzionare. La disinstallazione è adb uninstall com.some.package.name, a proposito.

Puoi avviarlo dal sistema Host in questo modo, grazie Just a Tim e MrRoy :

adb Shell am startservice com.some.package.name/.YourServiceSubClassName

interessante, non avevo bisogno di -n.

Per stop , io uso

adb Shell am force-stop com.some.package.name

Spero che sia d'aiuto.

Dato che sono un principiante, sentiti libero di modificare/commentare per correggere eventuali idee sbagliate (ad es. Probabilmente riguardo a .service. nel nome del componente (?)).

43
n611x007

Avvio un servizio:

adb Shell am startservice ...

avviare un servizio. Le opzioni sono: --utente | corrente: specifica quale utente eseguire; se non specificato, eseguire come utente corrente.

Arresto un servizio:

adb Shell am stopservice ... 

interrompere un servizio. Le opzioni sono: --utente | corrente: specifica quale utente eseguire; se non specificato, eseguire come utente corrente.

17
bonnyz

Se vuoi eseguire lo script in adb Shell, allora sto cercando di fare lo stesso, ma con un'applicazione. Penso che tu possa usare il comando "am start"

utilizzo: am [sottocomando] [opzioni]

start an Activity: am start [-D] [-W] <INTENT>
    -D: enable debugging
    -W: wait for launch to complete

**start a Service: am startservice <INTENT>**

send a broadcast Intent: am broadcast <INTENT>

start an Instrumentation: am instrument [flags] <COMPONENT>
    -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
    -e <NAME> <VALUE>: set argument <NAME> to <VALUE>
    -p <FILE>: write profiling data to <FILE>
    -w: wait for instrumentation to finish before returning

start profiling: am profile <PROCESS> start <FILE>
stop profiling: am profile <PROCESS> stop

start monitoring: am monitor [--gdb <port>]
    --gdb: start gdbserv on the given port at crash/ANR

<INTENT> specifications include these flags:
    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
    [-c <CATEGORY> [-c <CATEGORY>] ...]
    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
    [--esn <EXTRA_KEY> ...]
    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
    [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
    [-n <COMPONENT>] [-f <FLAGS>]
    [--grant-read-uri-permission] [--grant-write-uri-permission]
    [--debug-log-resolution]
    [--activity-brought-to-front] [--activity-clear-top]
    [--activity-clear-when-task-reset] [--activity-exclude-from-recents]
    [--activity-launched-from-history] [--activity-multiple-task]
    [--activity-no-animation] [--activity-no-history]
    [--activity-no-user-action] [--activity-previous-is-top]
    [--activity-reorder-to-front] [--activity-reset-task-if-needed]
    [--activity-single-top]
    [--receiver-registered-only] [--receiver-replace-pending]
    [<URI>]
13
sandroid

Posso iniziare il servizio attraverso

am startservice com.xxx/.service.XXXService

ma non so ancora come fermarlo.

9
MrROY

È necessario impostare l'attributo Android: exported del servizio su "true", per consentire ad altri componenti di invocarlo. Nel file AndroidManifest.xml, aggiungi il seguente attributo:

<service Android:exported="true" ></service>

Quindi, dovresti essere in grado di avviare il servizio tramite adb:

adb Shell am startservice com.package.name/.YourServiceName

Per maggiori informazioni su Android: attributo esportato vedi questa pagina .

7
AmitB

È possibile che venga visualizzato l'errore "* Errore: l'app è in background *" durante l'utilizzo

adb Shell am startservice 

a Oreo (26+). Ciò richiede servizi in primo piano. Utilizza il seguente.

adb Shell am start-foreground-service com.some.package.name/.YourServiceSubClassName
6
Kiran k g

Rispondere al feedback di pzulw a sandroid riguardo alla specifica dell'intento.

Il formato del nome del componente è descritto nei documenti api per ComponentName.unflattenFromString

Divide la stringa al primo '/', prendendo la parte prima come nome del pacchetto e la parte dopo come nome della classe. Per comodità speciale (da utilizzare, ad esempio, durante l'analisi dei nomi dei componenti sulla riga di comando), se "/" è immediatamente seguito da un "." quindi il nome della classe finale sarà la concatenazione del nome del pacchetto con la stringa che segue '/'. Pertanto "com.foo/.Blah" diventa package = "com.foo" class = "com.foo.Blah".

6
Just a Tim

Devi aggiungere Android:exported="true" per avviare il servizio dalla riga di comando ADB. Quindi il tuo manifest è simile al seguente:

<!-- Service declared in manifest -->
<service
    Android:name=".YourServiceName"
    Android:exported="true"
    Android:launchMode="singleTop">
    <intent-filter>
        <action Android:name="com.your.package.name.YourServiceName"/>
        <action Android:name="Android.intent.action.MAIN" />
        <category Android:name="Android.intent.category.LAUNCHER" />
    </intent-filter>
</service> <!-- Note: Service is exported to start it using ADB command -->

E poi da ADB

Per avviare il servizio:

adb Shell am startservice com.your.package.name/.YourServiceName

Per interrompere il servizio (su Marshmallow):

adb Shell am stopservice com.your.package.name/.YourServiceName

Per interrompere il servizio (su Jelly Bean):

adb Shell am force-stop com.your.package.name

5
Atul

am startservice <INTENT>

o effettivamente dalla shell del sistema operativo

adb Shell am startservice <INTENT>

2
DonGru

Per chiunque sia ancora confuso su come definire il parametro del nome del servizio, la barra continua immediatamente dopo il nome del pacchetto dell'applicazione nel nome completo della classe.

Quindi, dato un nome del pacchetto dell'applicazione di: app.package.name

E un percorso completo al servizio di: app.package.name.example.package.path.MyServiceClass

Quindi il comando sarebbe simile al seguente:

adb Shell am startservice app.package.name/.example.package.path.MyServiceClass
1
TheIT