Moja aplikacja ma pewną funkcjonalność, która będzie działać tylko na urządzeniu, na którym jest dostępny root. Zamiast tego, że ta funkcja zawodzi, gdy jest używana (a następnie wyświetla odpowiedni komunikat o błędzie dla użytkownika), wolałbym możliwość cichego sprawdzenia, czy root jest dostępny jako pierwszy, a jeśli nie, ukrywanie odpowiednich opcji w pierwszej kolejności .
Czy jest na to sposób?
Odpowiedzi:
Oto klasa, która sprawdzi rootowanie na jeden z trzech sposobów.
źródło
su
binarny, ale nie są zrootowane.Jeśli już używasz Crashlytics typu Fabric / Firebase, możesz zadzwonić
To jest obecne wdrożenie tej metody:
źródło
Biblioteka RootTools oferuje proste metody sprawdzania rootowania:
Odniesienie
źródło
W mojej aplikacji sprawdzałem, czy urządzenie jest zrootowane, wykonując polecenie „su”. Ale dziś usunąłem tę część mojego kodu. Dlaczego?
Ponieważ moja aplikacja stała się zabójcą pamięci. W jaki sposób? Pozwól, że opowiem ci moją historię.
Pojawiły się skargi, że moja aplikacja spowalnia urządzenia (oczywiście myślałem, że to nieprawda). Próbowałem dowiedzieć się, dlaczego. Użyłem MAT, aby uzyskać zrzuty sterty i analizować, i wszystko wydawało się idealne. Ale po ponownym uruchomieniu mojej aplikacji wiele razy zdałem sobie sprawę, że urządzenie naprawdę działa wolniej, a zatrzymanie mojej aplikacji nie przyspieszyło (chyba że ponownie uruchomię urządzenie). Ponownie przeanalizowałem pliki zrzutu, gdy urządzenie jest bardzo wolne. Ale wszystko nadal było idealne do pliku zrzutu. Potem zrobiłem to, co najpierw trzeba zrobić. Wymieniłem procesy.
Niespodzianka; dla mojej aplikacji było wiele procesów (ze znacznikiem procesu mojej aplikacji w manifeście). Niektóre z nich były zombie, niektóre nie.
Dzięki przykładowej aplikacji, która ma jedno działanie i wykonuje po prostu polecenie „su”, zdałem sobie sprawę, że proces zombie jest tworzony przy każdym uruchomieniu aplikacji. Na początku te zombie przydzielają 0 KB, ale potem coś się dzieje, a procesy zombie mają prawie takie same KB jak główny proces mojej aplikacji i stały się standardowymi procesami.
Istnieje raport o błędzie dotyczący tego samego problemu na stronie bugs.sun.com: http://bugs.sun.com/view_bug.do?bug_id=6474073 wyjaśnia to, że jeśli nie znaleziono polecenia, zombie zostaną utworzone za pomocą metody exec () . Ale nadal nie rozumiem, dlaczego i jak mogą stać się standardowymi procesami i posiadać znaczące bazy wiedzy. (Nie dzieje się tak cały czas)
Możesz spróbować, jeśli chcesz, z próbką kodu poniżej;
Prosta metoda wykonywania poleceń;
Podsumowując; Nie mam porady, aby ustalić, czy urządzenie jest zrootowane, czy nie. Ale gdybym był tobą, nie użyłbym Runtime.getRuntime (). Exec ().
Tak poza tym; RootTools.isRootAvailable () powoduje ten sam problem.
źródło
Wiele z wymienionych tutaj odpowiedzi ma nieodłączne problemy:
Wydaje się, że biblioteka RootTools ze Stericson sprawdza poprawność rootowania. Ma również wiele dodatkowych narzędzi i narzędzi, więc bardzo go polecam. Jednak nie ma wyjaśnienia, w jaki sposób konkretnie sprawdza roota i może być nieco cięższy niż większość aplikacji naprawdę potrzebuje.
Zrobiłem kilka metod narzędziowych, które są luźno oparte na bibliotece RootTools. Jeśli chcesz po prostu sprawdzić, czy plik wykonywalny „su” znajduje się na urządzeniu, możesz użyć następującej metody:
Ta metoda po prostu zapętla katalogi wymienione w zmiennej środowiskowej „PATH” i sprawdza, czy plik „su” istnieje w jednym z nich.
Aby naprawdę sprawdzić dostęp do konta root, należy faktycznie uruchomić polecenie „su”. Jeśli zainstalowana jest aplikacja taka jak SuperUser, w tym momencie może poprosić o dostęp do konta root, lub jeśli została już przyznana / odmówiona, może zostać wyświetlony toast wskazujący, czy dostęp został udzielony / odmówiony. Dobrym poleceniem do uruchomienia jest „id”, abyś mógł sprawdzić, czy identyfikator użytkownika to w rzeczywistości 0 (root).
Oto przykładowa metoda ustalenia, czy przyznano dostęp do konta root:
Ważne jest, aby faktycznie przetestować uruchomienie polecenia „su”, ponieważ niektóre emulatory mają preinstalowane pliki wykonywalne „su”, ale zezwalają tylko niektórym użytkownikom na dostęp do niego, podobnie jak powłoka adb.
Ważne jest również sprawdzenie, czy istnieje plik wykonywalny „su” przed próbą jego uruchomienia, ponieważ wiadomo, że Android nie usuwa poprawnie procesów, które próbują uruchomić brakujące polecenia. Te procesy-duchy mogą z czasem zużywać więcej pamięci.
źródło
Aktualizacja 2017
Możesz to zrobić teraz dzięki interfejsowi API Google Safetynet . SafetyNet API zapewnia Attestation API, który pomaga ocenić bezpieczeństwo i kompatybilność środowisk Androida, w których działają Twoje aplikacje.
Poświadczenie to może pomóc ustalić, czy dane urządzenie zostało zmodyfikowane, czy nie.
Interfejs API atestacji zwraca odpowiedź JWS w ten sposób
Analiza tej odpowiedzi może pomóc ustalić, czy urządzenie jest zrootowane, czy nie
Możesz to zrobić po stronie klienta, ale zalecane jest analizowanie odpowiedzi po stronie serwera. Podstawowa architektura serwera klienta z interfejsem API sieci bezpieczeństwa będzie wyglądać następująco: -
źródło
Kontrola root na poziomie Java nie jest bezpiecznym rozwiązaniem. Jeśli Twoja aplikacja ma problemy z bezpieczeństwem, aby działać na zrootowanym urządzeniu, skorzystaj z tego rozwiązania.
Odpowiedź Kevina działa, chyba że telefon ma również aplikację taką jak RootCloak. Takie aplikacje mają funkcję obsługi interfejsów API Java po zrootowaniu telefonu i kpią z tych interfejsów API, aby zwrócić telefon nie zrootowany.
Napisałem kod poziomu natywnego na podstawie odpowiedzi Kevina, działa nawet z RootCloak! Ponadto nie powoduje żadnych problemów z wyciekiem pamięci.
W kodzie Java musisz utworzyć klasę opakowania RootUtils, aby wykonywać natywne połączenia
źródło
http://code.google.com/p/roottools/
Jeśli nie chcesz używać pliku jar, skorzystaj z kodu:
Program spróbuje znaleźć folder su:
Przykład:
źródło
checkRootMethod4()
z Kevina Odpowiedź .== true
boolean, nic nie dodaje i nie wygląda dobrze.if (isRooted())
sprawdź zamiast jawnie wpisać true. Lepiej podążać za wzorami pisania koduZamiast korzystania z isRootAvailable () możesz użyć isAccessGiven (). Bezpośrednio z wiki RootTools :
Odniesienie
źródło
Niektóre zmodyfikowane kompilacje używane do ustawiania właściwości systemowej
ro.modversion
w tym celu. Wydaje się, że wszystko poszło dalej; mój build z TheDude kilka miesięcy temu ma to:Z drugiej strony emulator z 1.5 SDK, uruchamiający obraz 1.5, również ma root, jest prawdopodobnie podobny do Androida Dev Phone 1 (na co prawdopodobnie chcesz zezwolić) i ma to:
Jeśli chodzi o wersje detaliczne, nie mam jednego pod ręką, ale różne wyszukiwania poniżej
site:xda-developers.com
są pouczające. Oto G1 w Holandii , widać, żero.build.tags
nie matest-keys
, i myślę, że jest to prawdopodobnie najbardziej niezawodna właściwość do użycia.źródło
RootBeer to biblioteka systemu Android sprawdzająca rootowanie autorstwa Scotta i Matthew. Wykorzystuje różne kontrole, aby wskazać, czy urządzenie jest zrootowane, czy nie.
źródło
Sugeruję użycie natywnego kodu do wykrywania root. Oto pełny działający przykład .
Owijka JAVA :
Opakowanie JNI (native-lib.c) :
stałe:
wykrycia root z kodu natywnego:
źródło
Oto mój kod oparty na niektórych odpowiedziach tutaj:
źródło
W odpowiedzi na odpowiedź @Kevins, niedawno odkryłem podczas korzystania z jego systemu, że Nexus 7.1 wraca
false
dla wszystkich trzech metod - Bezwhich
polecenia, nietest-keys
iSuperSU
nie został zainstalowany/system/app
.Dodałem to:
Jest to nieco mniej przydatne w niektórych sytuacjach (jeśli potrzebujesz gwarantowanego dostępu do konta root), ponieważ całkowicie możliwe jest zainstalowanie SuperSU na urządzeniach, które nie mają dostępu do SU.
Ponieważ jednak możliwe jest, aby SuperSU było zainstalowane i działało, ale nie w
/system/app
katalogu, ten dodatkowy przypadek wykorzeni (haha) takie przypadki.źródło
źródło
Dwa dodatkowe pomysły, jeśli chcesz sprawdzić, czy urządzenie ma uprawnienia root do twojej aplikacji:
Runtime.getRuntime().exec()
/system/app/Superuser.apk
lokalizacjiźródło
Używanie C ++ z ndk jest najlepszym podejściem do wykrywania roota, nawet jeśli użytkownik używa aplikacji, które ukrywają jego root, takich jak RootCloak. Przetestowałem ten kod za pomocą RootCloak i byłem w stanie wykryć root, nawet jeśli użytkownik próbuje go ukryć. Twój plik CPP chciałby:
I wywołasz tę funkcję z kodu Java w następujący sposób
źródło
źródło
Istnieje interfejs API Safety Net Attestation usług Google Play pomocą którego możemy ocenić urządzenie i ustalić, czy jest ono zrootowane / naruszone.
Proszę przejść przez moją odpowiedź, aby zająć się urządzeniami zrootowanymi:
https://stackoverflow.com/a/58304556/3908895
źródło
Zapomnij o wykrywaniu aplikacji root i plików binarnych Su. Sprawdź proces demona roota. Można to zrobić z terminala i można uruchamiać polecenia terminala w aplikacji. Wypróbuj tę jednowarstwową.
Aby to osiągnąć, nie potrzebujesz uprawnień administratora.
źródło
Rzeczywiście jest to interesujące pytanie i jak dotąd nikt nie zasłużył na nagrodę. Używam następującego kodu:
Kod z pewnością nie jest kuloodporny, ponieważ sieć może być niedostępna, więc otrzymujesz wyjątek. Jeśli ta metoda zwróci wartość true, wówczas 99% możesz być pewien, w przeciwnym razie tylko 50% nie. Zezwolenie na korzystanie z sieci może również zepsuć rozwiązanie.
źródło
Korzystanie z mojej biblioteki w rootbox jest dość łatwe. Sprawdź wymagany kod poniżej:
źródło