laufenden Dienst mit Shellbefehl beenden

A

AntiGorilla

Fortgeschrittenes Mitglied
2
Hallo,
ich bin auf der Suche nach einer Möglichkeit, einen laufenden Dienst (kein Prozess!) mittels Shelleingabe zu beenden. Ich habe schon stundenlang gegoogelt, aber alles was ich finde bezieht sich auf das Beenden von Prozessen.
Ich hoffe, hier kann mir jemand helfen. Vielen Dank :)
 
Kannst Du ein Beispiel nennen? Aus Sicht des Linux-Unterbaus ist ein Dienst auch bloß ein Prozess (halt einer, der mit denselben Rechten läuft wie die zugehörige App), deshalb würde mich interessieren, wo Du da eine Grenzlinie ziehst.
 
Ich versuche mal den Unterschied zu verdeutlichen.
Ein Prozessname wäre z.B. com.package.name, ein Dienstname dagegen com.package.name.service.
Mit dem Befehl kill $(pidof $(ps | grep com.package.name) lässt sich der Prozess beenden. Mit dem Dienstnamen funktioniert das aber nicht, weil dieser nicht in der Auflistung von "ps" enthalten ist.
Nun stellt sich eben die Frage, wie ich den Service beenden kann. Gibt es z.B. noch einen ähnlichen Befehl wie ps für Dienste?
 
Dass ein Dienstname einen anderen Namen als die App erhält, wäre mir neu. Der Unterschied liegt meines Wissens im Status in der VM, der Name bleibt derselbe. Schau Dir mal z.B. mit System Panel die Details zu verschiedenen Apps und Diensten an. Dort wird auch die PID und der Prozessname gelistet, so dass Du das ganz einfach mit ps l vergleichen kannst. Ich denke, Du täuscht Dich da.
 
Ich denke doch, dass es nicht unüblich ist, dass die Services andere Namen haben als ihre Hauptprozesse.
Ich mache mal ein konkretes Beispiel mit der App Power Toggles, die ich für Quicksettings in der Statusleiste benutze. Deren Hauptprozess heißt "com.painless.pc". Zur Kontrolle verwende ich wieder ps und zusätzlich die Liste der aktiven Dienste unter Einstellungen/Apps/laufende Anwendungen.
Starten der App, Ergebnis: ps liefert "com.painless.pc", in der anderen Liste taucht Power Toggles nicht auf
Nun verwende ich den Toggle Rotation Locker, dieser startet den Service "com.painless.pc.RLService", der alle Apps dauerhaft in die Querformatansicht zwingt solange er läuft.
Ergebnis: ps liefert wieder nur "com.painless.pc", in der anderen Liste taucht Power Toggles aber nun ebenfalls mit dem Dienst "com.painless.pc.RLService" auf.
Es gibt also schon einen Unterschied zwischen den Prozessen und den Diensten.
Den Service könnte ich auch direkt mit dem Befehl "am startservice -n com.painless.pc/com.painless.pc.RLService" über die Shell starten. Bloß suche ich nun eben eine Möglichkeit um genau das Gegenteil dieses Befehls zu bewirken...
 
Moin

Schon mal an 'am --help' gedacht?
Dann findest Du 'force-stop' direkt nach 'startservice'

Anturix
 
Hab ich schon versucht, funktioniert aber auch nur mit Prozessen und nicht mit Diensten.
 
Moin

'force-stop' stoppt alle Komponenten, die zu einer APK gehören. Auch die zugehörigen Dienste.
Das funktioniert bei mir auch.

Anturix
 
Ja richtig, aber es soll ja nur der Service beendet werden und der Hauptprozess weiter laufen.
 
Moin

Schön, das Du uns das auch schon mitteilst.

PowerToggles hat keinen eigenständigen Service. Das ist der normale Prozess, der je nach Bedarf seine Rolle ändert.

Anturix
 
Ich hab doch oben beschrieben in welchem Fall Power Toggles auch einen Service startet: den Toggle Rotationssperre verwenden und Querformat erzwingen auswählen -> com.painless.pc.RLService startet.

Außerdem ist Power Toggles nur ein Beispiel, weil man daran gut den Unterschied zwischen Prozess und Dienst sieht. Letzendlich suche ich eine Möglichkeit, einen beliebigen Service zu beenden (unabhängig von weiteren Prozessen/Diensten der jeweligen App)
 
Nur um sicher zu gehen:
com.painless.pc.RLService startet.
Du bist sicher, dass es nicht com.painless.pc/.RLService ist? So kenne ich das und dann würde meine Antwort gelten – aber natürlich kann ich mich täuschen. Alles kennen kann ich auch nicht.

Edit: Um es deutlich zu machen: der Unterschied besteht in dem Slash. Der bezeichnet, dass eine bestimmte Unteraktivität unter dem Namen des Hauptprogramms gestartet wird. Wie Android nämlich com.painless.pc.RLService finden soll, wenn es keine App dieses Namens gibt, sondern nur com.painless.pc.apk, ist mir – ehriich gesagt – suspekt. (Ggfs mit -1 oder so vor dem .apk, versteht sich.) Zu am start gehört eigentlich m.W immer die Aktivität, abgetrennt durch einen Slash. Und der Prozessname ist dann das davor. In my humble opinion, of course.
 
Zuletzt bearbeitet:
Ich gehe davon aus, dass es com.painless.pc.RLService heißt, zumindest kann ich mit dem Befehl "am startservice -n com.painless.pc/com.painless.pc.RLService" diesen starten.
Ein Beispiel zu "am start" wäre "am start -n com.painless.pc/painless.pc.RLPicker", hier trifft das zu mit Prozessname/Activity (und das läuft dann auch unter dem gleichen Prozessnamen).

Hier noch ein Screenshot, welche Services zu Power Toggles gehören.
 
Zuletzt bearbeitet:
Also triftt das mit dem Slash zu und Du hast uns diesen bisher vorenthalten. Auch meine Verwunderung, wie Android wohl den von Dir (falsch) bezeichneten Service finden soll. ist geklärt: Der von mir vermisste Slash ist aufgetaucht. Damit sollte aber auch Dir klar sein, welcher Teil der Prozessname ist und welcher Teil bezeichnet, an welcher Stelle des Codes dieser Prozess gestartet wurde. Der Slash trennt die beiden.
 
Den Befehl hatte ich weiter oben auch schon mal erwähnt.
Aber dass ich weiß wie ich den Service starte bringt mich nicht weiter, ich suche immer noch nach einem Anhaltspunkt wie ich ihn beende. Unter ps taucht der Service definitiv nicht auf.

Edit: Sorry falls ich bisschen begriffsstutzig bin, solche Themen sind normalerweise nicht mein Gebiet.
 
Moin

Ich versuche es noch mal.

Es gibt bei Power Toggle keinen eigenständigen Service, den du beenden kannst.
Du generierst mit 'am startservice ...' nur einen Intent, auf den der Prozess regiert und sich als Service im System registriert.

Anturix
 
Danke, jetzt hab ich das auch verstanden :)
Es gibt also keine Möglichkeit, den Prozess als Service wieder "abzumelden" (außer mit force stop komplett abzuschießen)?
 
Moin

Nur, wenn die App eine entsprechende Option bietet.
Über das Widget geht das. Ich kann Dir aber nicht sagen, ob/wie das über die Shell geht.

Frag mal den Entwickler, ob es einen Intent gibt, mit dem Du das deaktivieren kannst. Den könntest Du dann an die App senden.

Anturix
 
Die vorhandenen Intents kannst Du mit aapt auslesen. Du ziehst Dir die apk auf den PC und führst aus (installiertes SDK vorausgesetzt):
Code:
aapt dump xmltree com.painless.pc-1.apk AndroidManifest.xml
Dann kommt eine lange Liste, darunter die Intents. Meist ist schon am Namen zu erkennen, wofür der Intent gut ist.
 
Werd mal sehen was sich finden lässt.

Vielen Dank euch beiden für eure geduldige Hilfe :)
 

Ähnliche Themen

netfreak
  • netfreak
Antworten
2
Aufrufe
228
netfreak
netfreak
M
Antworten
23
Aufrufe
643
senior-ipaq
S
Zurück
Oben Unten