Ostatnio postanowiłem cofnąć CyanogenMod z wersji 14.1 (Android 7.1) do wersji 13 (Android 6.0.1), oczywiście z próbą zachowania danych, co jak podejrzewałem łatwe nie będzie i może skończyć się krachem systemu – i oczywiście tak się stało, a do tego zrobiona kopia zapasowa okazała się wadliwa.

W tej sytuacji postanowiłem przywrócić system z wcześniejszej kopii zapasowej i niezbędne dane (katalog /data/data/katalog-aplikacji) skopiować ręcznie, tak jak to już kiedyś robiłem. Niestety zapomniałem, że chyba od Androida 4.3 Google w system wmontowało potworka (w tym kontekście jest to prawdziwy potworek ;-)) w postaci SELinuxa, który od Androida 4.4 został przełączony w tryb restrykcyjny…

Android i Security-Enhanced Linux (SELinux)

O ile sam SELinux ma swoje zalety (głównie związane z podniesieniem bezpieczeństwa zarówno całego systemu, jak i poszczególnych jego elementów/komponentów), to w tym przypadku okazał się diabełkiem, który sprawił, że jakakolwiek modyfikacja w strukturze plików (w tym przypadku podmiana plików odpowiedzialnych za ustawienia poszczególnych aplikacji, np. bazy zawierającej SMSy) powodowała albo krach całego systemu, albo – w przypadku podmiany plików tylko kilku wybranych aplikacji – krach danej aplikacji, bo podpis/etykiety plików się nie zgadzają, nawet jeśli są z tego samego telefonu.

Enforcing vs Permissive

By zweryfikować podejrzenia, że to na pewno kwestia SELinuxa postanowiłem z poziomu konsoli (w końcu po coś ten root jest ;-)) sprawdzić w jakim trybie działa SELinux w moim telefonie, i czy zmiana z trybu „restrykcyjnego” (enforcing) na tryb „pobłażliwy” (permissive) rozwiąże mój problem:

Sprawdzenie trybu (tak, można to też zrobić przez ustawienia telefonu):

su
getenforce

W odpowiedzi otrzymałem „enforcing”, a więc tryb „restrykcyjny”. Szybka zmiana na „permissive” (pobłażliwy):

setenforce 0

Z tego co kojarzę, to taka zmiana jest możliwa dzięki temu, że tryb pracy urządzenia to „userdebug”, co można sprawdzić za pomocą polecenia:

getprop ro.build.type

Po tej zmianie aplikacje z podmienionymi plikami zaczęły działać, a więc przyczyna potwierdzona, choć powyższa komenda nie rozwiązuje problemu, gdyż po każdym restarcie telefonu system automatycznie przechodzi w tryb „restrykcyjny”.

Co nie zadziałało

Podczas rozmowy ze znajomym doszliśmy do wniosku, że można albo spróbować wyłączyć SELinuxa na stałe (wiązałoby się to prawdopodobnie z wgraniem jądra systemu bez tego zabezpieczenia), lub skorzystać z opcji „relabel”, czyli ponownego podpisywania plików.

Pierwsza próba – korekta uprawnień z poziomu Recovery (TWRP) niestety nic zmieniła, aplikacje jak nie działały, tak nie działały dalej.

W kolejnym kroku w głównej partycji systemu postanowić utworzyć plik „.autorelabel”, dzięki które miałem nadzieję, że nastąpi – tak jak to ma miejsce w systemach serwerowych/desktopowych – ponowne katalogowanie/podpisywanie plików:

su
mount -o rw,remount /
touch /.autorelabel

Niestety ta metoda również zawiodła, choć podczas uruchamiania system jakieś dodatkowe operacje wykonał…

Może jakiś skrypt

Kolejną metodą, którą postanowiłem sprawdzić, to jakiś prosty skrypt, który w odpowiednim miejscu podstawi 0 (zero), tym samym przełączając tryb pracy/działania SELinuxa:

echo 0 > /sys/fs/selinux/enforce

Niestety kilka różnych prób nie przyniosło spodziewanego efektu (skrypt musi zadziałać z uprawnieniami roota, a zarazem musi wykonać się po systemowym sprawdzeniu i ew. przełączeniu trybu SELinuxa na „restrykcyjny”).

SELinuxModeChanger

Szybkie wyszukiwanie w Google i trafiłem na aplikację „SELinuxModeChanger”, która dawała szansę na szybkie i skuteczne rozwiązanie mojego problemu z trybem pracy SELinuxa, gdyż wg opisu autora pilnuje wybranego trybu pracy również po restarcie/uruchomieniu telefonu.

Apliakcja kiedyś dostępna w Google Play, ale z niego wyleciała. Teraz znajdziecie ją do pobrania m.in. w serwisie F-Droid.

Oczywiście Google przy standardowo włączonej weryfikacji instalowanych aplikacji wyświetli nam ostrzeżenie, o tym, że „aplikacja może trwale uszkodzić urządzenie” (dlatego instalujecie aplikację, jak i robicie wszystkie inne wymienione operacje na własną odpowiedzialność):

Dalsza obsługa aplikacji wydaje się prostsza niż instalacja, gdyż sprowadza się do kliknięcia w odpowiedni przycisk, za pomocą którego wybieramy tryb pracy SELinuxa:

A co najważniejsze – jak autor obiecał, tak się dzieje, i odpowiedni/wybrany tryb pracy SELinuxa jest automatycznie ustawiany po każdym uruchomieniu telefonu.

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk