Sprowadza się to do funkcji jądra systemu Linux: istnieją dwie różne nazwy procesu.
- Jedna z nazw jest ostatnim elementem ścieżki do pliku wykonywalnego, np.
native_executable
, jeśli aplikacja znajduje się pod numerem /data/apps/com.example.hello/native_executable
. Jest to nazwa, która pojawia się w polu Name
z /proc/PID/status
. Jądro skraca go do 15 znaków, więc w tym przypadku zawiera native_executab
.
- Druga nazwa jest przekazywana przez program, który wywołuje aplikację jako parametr wiersza polecenia nr 0 (
argv[0]
w języku C, args[0]
w języku Java). Jest to nazwa pojawiająca się na początku /proc/PID/cmdline
i wyświetlana ps
.
- Ścieżka do pliku wykonywalnego jest również celem dowiązania symbolicznego
/proc/PID/exe
.
Zgodnie z przyjętą konwencją, gdy program uruchamia inny, powinien używać nazwy pliku wykonywalnego jako parametru wiersza polecenia 0, ale może zdecydować inaczej. Pole Name
jest zawsze ustawione na (skróconą) nazwę pliku wykonywalnego przez jądro.
Jest to ogólna funkcja systemu Linux - patrz także Can I use standard tools to get the full name of a process, when its name has embedded spaces? na Ask Ubuntu.
Aplikacja może później zmienić obie nazwy (chociaż istnieją ograniczenia długości). Dalvik używa tej możliwości do rozróżniania aplikacji: wszystkie aplikacje pochodzą z tego samego natywnego pliku wykonywalnego: /sytem/bin/app_process
; zamiast pozwolić im wszystkim nazywać się app_process
, maszyna wirtualna zmienia obie nazwy na nazwę pakietu aplikacji. Nazwa w /proc/PID/status
jest ograniczona do 15 znaków, dlatego jest obcinana. Możesz uzyskać dłuższą nazwę od /proc/PID/cmdline
(odczytaj pierwszy bajt zerowy).
Doskonale dziękuję! – predhme
Jaki jest powód obcięcia nazwy do 15 znaków? (TASK_COMM_LEN na 'man proc'). Wydaje się dość niski limit. –
@PabloBianchi Jest przycięty, aby zachować stałą strukturę danych, co jest ważne w jądrze. Nie wiem, dlaczego rozmiar jest taki mały. – Gilles