Czy Android prowadzi dziennik, kiedy się uruchamia?

19

Tworzę aplikację do kontroli rodzicielskiej / rozliczalności dla Androida. Składa się z usługi monitorowania działającej w tle i uruchamianej po uruchomieniu telefonu.

Niestety, odkryłem, że kiedy Android jest uruchamiany w „Trybie awaryjnym”, usługi nie są uruchamiane automatycznie i dlatego moja aplikacja ma poważną wadę.

W trybie awaryjnym można uruchomić sieć i inne aplikacje bez mojej usługi monitorowania.

Pomyślałem, że jeśli nie można monitorować aktywności aplikacji w trybie awaryjnym, być może mógłbym przynajmniej wykryć, czy aplikacja była wcześniej w trybie awaryjnym. Może to może ostrzec rodzica lub partnera odpowiedzialnego?

Czy system Android przechowuje jakieś informacje na ten temat? A może jakikolwiek dziennik rozruchu? Jestem bardzo otwarty na sugestie i alternatywy.

jws121295
źródło
2
Mam wielką nadzieję, że nie da się tego zrobić.
RR
4
Myślę, że nie należy tego zamykać. Programiści nie są jedynymi, którzy mogą być tym zainteresowani.
RR
Zgadzam się z @Richard. To nie jest specjalnie pytanie kodujące, ale o to, jak działa Android.
ale

Odpowiedzi:

13

Myślę, że złapałeś się, krótko mówiąc, nic nie możesz zrobić!

Spójrz na to źródło, które wyjaśnia dlaczego, szczególnie w tej sekcji:

Partycja systemu i tryb awaryjny

Partycja systemowa zawiera jądro Androida, a także biblioteki systemu operacyjnego, środowisko wykonawcze aplikacji, środowisko aplikacji i aplikacje. Ta partycja jest ustawiona tylko do odczytu. Gdy użytkownik uruchamia urządzenie w trybie awaryjnym, dostępne są tylko podstawowe aplikacje na Androida. Zapewnia to, że użytkownik może uruchomić telefon w środowisku wolnym od oprogramowania innych firm.

Słowa kluczowe są wolne od oprogramowania innych firm

Edytować:

Podczas uruchamiania systemu Android przechowuje pamięć podręczną logcatw tymczasowym buforze, który jest zarezerwowany w /dev/log. Bufor ten jest poddawany recyklingowi, gdy osiągnie próg, oczywiście im większy próg, tym wolniej Android dostaje się z ciągłym spamowaniem do bufora logcat, a zatem utrzymywany na minimalnym poziomie - iirc, jego około 64 KB:

#define DEFAULT_LOG_ROTATE_SIZE_KBYTES 16
#define DEFAULT_MAX_ROTATED_LOGS 4

Źródło: system/core/logcat/logcat.cpp

Nie pytaj, ile może to być wierszy dla każdej aplikacji i dla każdej aplikacji. Nie tylko to, logcat znika po ponownym uruchomieniu!

t0mm13b
źródło
2
Naprawdę nie odpowiedziałeś na pytanie, po prostu powtórzyłeś to, co wiedział, że jego aplikacja nie może monitorować w trybie awaryjnym. Dodaj coś o logach trybu awaryjnego lub alternatywach, a następnie +1
Peanut
1
@Peanut, Android będzie nadal logcat logcat, ale tylko podstawowe usługi, nic więcej! Nie ma na to alternatywy! I aplikacje innych firm nie mogą rozpoznać, że został aktywowany tryb bezpieczny, ponieważ następnym razem, gdy wyjdzie z trybu awaryjnego, tj. Uruchomi się ponownie normalnie, aplikacje innych firm „myślą”, że nic się nie stało, jak w przypadku „niczego do zobaczenia tutaj ... poruszać się wzdłuż ”
t0mm13b
1
Przepraszam, że edytowałem mój komentarz przed zobaczeniem twojego komentarza, ale tak jak powiedziałem, tak naprawdę nie odpowiedziałeś na jego pytanie. Alternatywą byłoby więc sprawdzenie, czy logcat był uruchomiony, gdy jego aplikacja nie była uruchomiona? Oczywiście wymagałoby to od osoby uruchomienia go w pewnym momencie w trybie awaryjnym, ale przynajmniej jest to realistyczne rozwiązanie.
Peanut,
Zawartość logcat ... jest wypróżniana /dev/nullpo ponownym uruchomieniu komputera, jak „biznes jak zwykle” ... tylko mówię… :) I dziękuję za opinię!
t0mm13b
Ach, nie wiedziałem o tym ^ ^ Będę głosować, ponieważ oferujesz odpowiedź na jego pytanie tutaj :) Myślę, że powinieneś dodać rzeczy o logach do swojej faktycznej odpowiedzi. edytuj: Och, nie mogę głosować dopóki nie zredagujesz odpowiedzi: p
Peanut
6

Nie jest to najlepsza odpowiedź, ale może informacje będą przydatne.

Jedyną znaną mi metodą zawiera dziennik wygenerowany przez system po ponownym uruchomieniu /proc/last_kmsg.

To, czy jądro zachowa ten plik dziennika po ponownym uruchomieniu, zależy od ustawień podanych podczas kompilacji jądra.

Z mojego doświadczenia wynika, że ​​niektóre urządzenia standardowe (HTC) mają włączoną funkcję rejestrowania, a inne nie. Nie widziałem spójnego wzoru.

joeyk
źródło
Dziękuję Ci! Gdzie dowiedziałeś się o tym logu? Czy masz jakieś sugestie, w jaki sposób mogę dowiedzieć się więcej o tych dziennikach? Czy jest gdzieś referencja?
jws121295,
Na wypadek, gdyby ktokolwiek wszedł do środka tak jak ja, dziennik znajduje się teraz w / sys / fs / pstore / console_ramoops. Nie jest to pełny dziennik, taki jak dmesg, ale po prostu zawiera informacje o ostatniej panice jądra i co do tego doprowadziło.
Evan Langlois,
adb shell cp /sys/fs/pstore/console-ramoops /data/media/0/console-ramoops.`date "+%Y_%m_%d_%H_%M_%S"`.logwspółpracuje z TWRP na OP3 z systemem LineageOS opartym na systemie Android 8
beppe9000