Weekend z modowaniem [24.09.2011]

Mariusz Urban Android 2011-09-24

 

 

Witam w nowym odcinku z naszego cyklu „Weekend z modowaniem”. Ostatnio poznaliśmy jedną z metod na dekompilację plików APK – dzięki temu możemy znacznie bardziej je modyfikować i dostosowywać do własnych potrzeb. Poza tym poznaliśmy też metodę tłumaczenia aplikacji i możemy wykonywać w prosty sposób spolszczenia.

Kontynuując naszą zabawę z tą tematyką dziś dokonamy pierwszych ciekawych zmian we framework-res.apk, gdzie ulokowane są istotne zasoby systemowe. Dla wielu z Was bardzo przydatnym elementem interfejsu jest wskaźnik baterii a górnej belce. Domyślnie w Androidzie zmienia się ona co 20% (z jednym wyjątkiem), wyświetlając coraz mniejszy poziom naładowania. Jest to zdecydowanie zbyt mało dokładne – bez stosowania dodatkowych aplikacji, bądź zagłębiania się w ustawienia nie możemy szybko stwierdzić, ile procent naładowania akumulatora jeszcze nam pozostało – w końcu jest wyraźna różnica między 21% a 40%, a mimo to reprezentuje je jedna, identyczna ikonka.

Zaczęto więc szukać sposobu na dokładniejsze odmierzanie poziomu akumulatora. Popularne stały się wszelkiej maści widżety baterii, jednak chcąc sprawdzić jej stan zawsze musieliśmy przerwać aktywnie wykonywane zadanie i powrócić na pulpit, tracąc przy tym cenny czas. Półśrodkiem są aplikacje wyświetlające po lewej stronie paska powiadomień ikonkę informującą o stanie naładowania. Takie rozwiązanie nie jest najlepszym pomysłem, gdyż wtedy marnujemy przestrzeń na górnej belce, wyświetlając tam dwie ikony baterii – systemową i zewnętrzną. Dodatkowo zbędnie uruchamiamy proces o dużej częstotliwości odświeżania działający w tle.

Po co stosować niedoskonałe substytuty, jeżeli możemy sprawić, by system w miejsce standardowej ikony prezentował dokładny, procentowy stan naładowania? Część z custom ROM-ów, takich jak CyanogenMod7 oraz MIUI posiadają domyślnie opcję wyboru wyglądu wskaźnika na górnej belce. Jeżeli Twój ROM nie posiada takiej funkcji, a chciałbyś ją dodać, to nie wymaga to wcale wiele pracy. Wymaganiem jest zrootowany smartfon. Dziś będziemy modyfikować framework-res.apk i jest to szczególny przypadek, gdyż w wypadku gdybyśmy chcieli modyfikować inny systemowy APK musielibyśmy się upewnić, że nasz ROM został poddany procesowi deodex. 

Czym jest deodex? Można by na ten temat napisać oddzielny artykuł, lecz postaram się sprawę przedstawić w miarę zwięźle i przejrzyście. W przypadku części ROM-ów, głównie stockowych, wraz z APK występują pliki .odex o identycznej nazwie. Są one zoptymalizowane do jak najszybszego uruchamiania się z wirtualną maszyną Dalvik i zawierają sporą część kodu aplikacji. Wadą takiego rozwiązania jest to, że uniemożliwia to ich dekompilacje, a co się z tym wiąże zaawansowaną edycję. Deodex polega na przepakowaniu APK i umieszczeniu kodu z pliku .odex do pliku classes.dex, który będzie znajdował się wewnątrz .apk. Framework-res.apk to nie zwykła aplikacja, więc nie posiada classes.dex i dla tego ROM nie musi koniecznie być poddany deodex.

 

Istnieją dwie popularne metody dodawania procentowego wskaźnika baterii w miejscu domyślnego. Pierwsza wymaga modyfikacji kilku plików .smali w services.jar, druga polega na edytowaniu ilości progów, po których wyświetlana jest kolejna ikona baterii i dodanie do framework-res.apk dodatkowych ikon posiadających napis reprezentujący każdy kolejny stopień, zmieniający się co 1%. Tak więc w miejsce standardowych siedmiu ikonek umieścimy 101 nowych, by każdy możliwy poziom baterii był przedstawiony odrębnie. Oczywiście istnieją Internetowe narzędzi, które automatycznie zrobią to za nas, na przykład UOT Kitchen, ale my w „Weekendzie z modowaniem” nigdy nie idziemy na łatwiznę i zawsze chcemy dowiedzieć się jak najwięcej o Androidzie.

 

 

Na początku musimy pobrać z naszego smartfonu plik framework-res.apk ulokowany w /system/framework/. W poprzednim tygodniu zapoznaliśmy się z APK Tool i metodą dekompilacji, umieszczamy więc nasz APK w odpowiedniej lokacji, a następnie wprowadzamy komendę przez wiersz poleceń:

apktool d framework-res.apk

Czas wykonaćwymagane zmiany. W przypadku, gdy nasza górna belka ma jasny kolor to najwłaściwszy będzie ten pakiet, natomiast gdy jest ciemna powinniśmy ściągnąć ten; różnią się one kolorem cyfr, który musi odpowiednio kontrastować z tłem. Pobieramy właściwą dla nas paczkę i podmieniamy zawartość folderów /res/drawable/ oraz /res/drawable-hdpi/. 

Będziemy rozpatrywać sytuację dla urządzeń z wysoką rozdzielczością (np WVGA), jak Galaxy S, Desire, czy też Milestone. Dla smartfonów z niższą rozdziałką trzeba będzie poszukać innych, mniejszych ikon i zmienić folder docelowy na /drawable-mdpi.

Przeanalizujmy wykonane zminy. Plik stat_sys_battery.xml umieszczony w katalogu /drawable/ zawiera informacje dla systemu na temat w jakiej sytuacji ma przełączać na wskaźniku baterii kolejne ikony, podaje też ich konkretne nazwy. Tak więc rozbudowując standardową konfigurację sprawiliśmy, że będą one zmieniane częściej, automatycznie gdy system wykryje zmianę poziomu baterii. Z kolei plik stat_sys_battery_charge.xml odpowiada za wyświetlanie animacji podczas ładowania akumulatora.

Do folderu /drawable-hdpi/ wrzuciliśmy odpowiednie ikony, które graficznie będą reprezentować stan akumulatora. Każda z nich jest zdeklarowana w odpowiednim pliku .xml, nic więc nie jest dodawane bez celu.

Jeżeli upewniliśmy się, że wszystko jest na swoim miejscu możemy przejść do ponownego kompilowania APK. Zmieniamy nazwę framework-res.apk na dowolną inną – nie usuwamy tego pliku, jeszcze będzie nam potrzebny. Drugi raz włączamy wiersz poleceń i wpisujemy komendę:

apktool b framework-res framework-res.apk

 

Po chwili powinniśmy uzyskać pozytywny rezultat tej operacji w postaci świeżego framework-res.apk. Z oryginalnego pliku (sprzed dekompilacji) przy pomocy dowolnego menadżera archiwów przenosimy do nowego APK folder /META-INF oraz plik AndroidManifest.xml. Jest to niezbędne, gdyż APK Tool nie podpisuje paczek, a brak zgdności między certyfikatami oraz prawidłową zawartością manifestu może skutkować brakiem możliwości uruchomienia systemu.

Gdy wszystko jest już gotowe możemy z powrotem przenieść na nasz smartfon plik framework-res.apk – bądź to za pomocą ADB, bądź przy pomocy terminalu na urządzeniu. Od tego momentu na naszej górnej belce zagości przejrzysty i czytelny procentowy wkaźnik baterii.

To wszystko w tym tygodniu. W kolejnych odcinkach będziemy kontynuować zabawę z modyfikowaniem systemu i dodawaniem nowych funkcji. Jeżeli chcecie się dowiedzieć czegoś szczególnego piszcie śmiało na adres piotr.andrzejewski@android.com.pl. Do zobaczenia za tydzień!

 



  • kisiel96

    Chłopaki, a zmodyfikowany plik można przenieść Root Explorerem?

  • spaqinoslaw

    Mościowie wybaczą, ale chyba coś spieprzyłem. Nie mam pojęcia co; mam HD2 z CM7 na SD i średnio mi się podoba wskaźnik baterii procentowy i ten defaultowy, to se zrobiłem własny, o, z Aperture. I tak jak w tutorialu podmieniłem odpowiednie pliki i tak dalej, zbudowałem z powrotem apkę, spokojnie, inwalidą nie jestem, problem przychodzi w momencie gdy chcę podmienić moją twórczość pod to co jest tam normalnie. I cholera nie chce. Ani przez SSH, ani przez file managera. No czyste chamstwo! Godzina pracy, druga planowania, a to coś nie pozwala doprowadzić wszystkiego do końca.
    Anyone halp?

  • matt11

    Skąd wziąć inne paczki z ikonami statusu baterii?

  • Piotr

    Dziękuję za instrukcję, można fajnie się pobawić na frameworku sensa ktory zazwyczaj nie ma właśnie battery statów. Jedną rzecz tylko bym dodał. Jak robi się modyfikację na „pracującym” romie to po umieszczeniu nowego apk w systemie oczywiście wymagany jest restart bo lecą same FC ale po restarcie już jest wszystko dobrze… poza zupełnym wyczyszczeniu konta googla 🙂 Tak jakby wyczyścił user data. Poza tym to modyfikacja pierwsza klasa !

  • skareb89

    Co to za widget zegarka?

  • Robert100

    Hej, zrobiłem wszystko zgodnie z instrukcją i telefon się nie uruchamia. Stoi na logu HTC 🙁 można coś na to poradzić poza wgrywaniem wszystkiego od początku? np. podmienić zmodyfikowany plik na ten oryginalny?



x