![]() |
Multitasking
Czy ktoś wie dlaczego Android sam decyduje co trzymać w pamięci i dlaczego sam decyduje które aplikacje mają być uruchomione? Drażni mnie to niesłychanie. Może być to wygodne w przypadku aplikacji, które faktycznie muszą cały czas chodzić w tle (jakieś budziki, taskery czy inne secure teksty), ale czemu program raz uruchomiony działa dopóki go samemu nie zkilluję w menu aplikacje lub dopóki Android nie zdecyduje żeby akurat tę aplikację teraz zabić?
Zwróciłem na to uwagę dopiero kiedy Timly tak mi nie obciążył systemu, że zaczęło się wszystko przycinać (nawet na ekranie blokady). Nie to żeby to była jakaś antyreklama, program wygląda rewelacyjnie, równie dobrze się go używa ale najwyraźniej na mojej Xperii nie działa jak powinien. A może jest jakaś aplikacja, który w wygodny sposób pozwalałaby na zabijanie kilku na raz? Wchodzić w każda z osobna i wymuszać zamykanie to dramat jakiś. |
Ehhh tyle razy o tym pisałem.
W związku z tym, że systemy mobilne w pewien sposób różnią się od systemów, które znajdują się na desktopach pewne rzeczy trzeba było stworzyć inaczej - min. multitasking. Telefony nie posiadają obszaru gdzie mogą zrzucić część pamięci ram - tzw. SWAP. Oczywiście można sobie to "dorobić", jednak objawia się to lagami - próbowałem różnych konfiguracji i zawsze były drobne lagi. Multitasking w Androidzie jest inteligentny. Źle skonfigurowany przez producenta, lub użytkownika może prowadzić do tego, że urządzenie będzie pracowało zupełnie inaczej niż ktoś sobie to przyjął. Android wykorzystuje standardową funkcjonalność jądra Linuksa OOM - OutOfMemory. W momencie kiedy w systemie poziom pamięci RAM zbliża się do wartości krytycznej, lub zero - w zależności od konfiguracji - /sys/module/lowmemorykiller/parameters/minfree zostaje zabita aplikacja, aby pamięć zwolnić. Sztuką jest tutaj wybrać jaką aplikację system ma zamknąć. ActivityManagerServer.java: Cytat:
Plik minfree (1 strona == 4 KB pamięci) zawiera wartości dla tych 6 przedziałów. Regulując te wartości możemy np. zwiększyć ilość aplikacji, która będzie trzymana w pamięci. Więcej można poczytać np. tutaj - http://forum.xda-developers.com/showthread.php?t=622666 Należy także dodać, że aplikacje w systemie reagują na sygnały systemowe. Np. uruchomiono WiFi. Jeżeli obsłużymy taki sygnał, to możemy powiedzieć naszej aplikacji co ma robić - np. pobranie poczty. Jest to bardzo przydatna rzecz, bo można stworzyć bardzo potężne aplikacje. Jednak wykorzystane nieprawidłowo, lub nadużywane może objawiać się tym, że dana aplikacja będzie się uruchamiała przy większości sygnałów. |
Nie wiedziałem o tym. Nie podoba mi się ten pomysł, można to było rozwiązać zupełnie inaczej.
Cytat:
|
Cytat:
Cytat:
|
W manifeście mogłyby być informacje do której grupy przypisana jest aplikacja i wówczas Android na podstawie tego decydowałby co zrobić z programem po wyjściu z niego (większość nie wymaga aktywności po wyłączeniu, ani sprawdzania czegokolwiek). Więc mogłaby być od razu zabijana, bez dziwnego zbieractwa jak obecnie.
|
Tylko jej status zmienia się w większości dynamicznie. Mogę mieć przed sobą np. aplikację Fejsiunia i jest ona widziana jako aplikacja o największym priorytecie (akurat jest widoczna dla użytkownika) więc w przypadku małej ilości pamięci zostanie zamknięta jako jedna z ostatnich. W przypadku kiedy ją zminimalizuje to jej priorytet się zmniejsza.
Może sposób jaki to rozwiązało Google nie jest idealny, jednak jak do tej pory nie usłyszałem porządnego projektu jak by to miało wyglądać. //btw, temat powinien brzmieć Multitasking w Androidzie. |
Mała korekta : to ze Android tak działa to nie wynika z tego że to system mobilny.
Przykładowo Windows Mobile działał dokładnie tak jak desktopowy odpowiednik (kwestia jednego ustawienia czy wolisz aplikacje minimalizować czy ubijać). W momencie gdy zabrakło RAM oczywiście musiał ubić aplikacje w tle, ale dochodziło do tego rzadko. Możłiwe było oczywiście zignorowanie zamykania aplikacji, wtedy system kiedyś sobie ubijał, działało to i tak dużo rzadziej i lepiej niż obecnie na Androidzie. Z drugiej strony bez problemu można skonfigurować desktopa by zachowywał się jak Windows Mobile (wyłączyć swapa i czekać na oom killera). Nawet na Windows (swap 0MB). Po prostu Android jest tak wymagający jeżeli chodzi o RAM, że to jedyne sensowne wyjście ubijać non stop wszystko co się rusza, żeby władować inne programy. Albo montować minimum 1GB RAM (i kto mówi że Vista była wymagająca? Android jest bardziej :D) Bo nawet podstawowe aplikacje jak kalendarz, telefon czy launcher + usługi często nie mogą sie pomieścić w pamięci na raz na telefonach z 512MB (zwłaszcza żeby nie przekroczyć wysokich progów oom killera). Na WM przy 64MB RAM (22 wolnego po boocie) programy praktycznie nigdy nie znikały bez sensu, zdarzało mi się nawet obrabiać na nim bitmapy po kilkadziesiąt MB ( ze swapem na karcie pamięci a co!). O w takim programie http://conduits.com/products/artist/ którego odpowiednika dziś próżno szukać w Google Play ( a na WM był z 10 lat temu). Moim zdaniem podejście Androida nie jest inteligentne i pisałem już o tym. Inteligenty system trzyma w wszystko w RAM i ubija w całkowitej ostateczności. Definiowanie progów i stałe utrzymywanie pewnego (dość duzego) obszaru pustego "na zapas" dla maszyny wirtualnej to marnowanie i tak oraniczonych zasobów. Bez dużego pustego obszaru Android niestety wydajnościowo klęka, dlatego nie można obniżyć progów do zera (sprawdziłem u siebie - kończyło sie resetem bo cierpliwość się skończyła). Na efekt takich rozwiązań (i innych jak maszyna virtualna) nie trzeba długo czekać : zamula, przycina itd... Mam SGS2+ (i9105) z 1GB RAM i 4.1 i też czasem przycina choć jest goły i wesoły (służbówka). |
Wszystkie czasy w strefie CET. Aktualna godzina: 13:38. |
Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2025, vBulletin Solutions Inc.