Ja bym chciał poznać szczegóły tej modyfikacji
Uff.. super że ten fix na prawdę działa !
@Alejka za co się teraz zabierzesz??
Żadnym guru od Androida nie jestem, wiec tak szybko kolejnych odkryć pewnie nie dokonam. To, że udało mi się stworzyć tego FIXa, to kwestia dwóch czynników, bez których nigdy bym do tego rozwiązania nie doszedł. Po pierwsze wytrwałość w testowaniu ROMów metodą prób i błędów, a po drugie (co oczywiście ważniejsze) istnienie ROMu JCE, na którym ten uciążliwy bug po prostu nie występował.
Zacząłem od testowania najnowszych ROMów Androida 2.1 (od JD do JH), sprawdzając czy występuje problem z 3G w Play. Oczywiście tak właśnie było. Potem sprawdziłem, że na oryginalnych ROMach Androida 1.5 problem jest identyczny. Potem przypadkiem natknąłem się na Samdroida bazującego na ROMie JCE i nagle wszystko zaczęło pięknie działać. Zainstalowałem więc oryginalnego JCE i też problem nie występował. Pomyślałem, że może nadajniki PLAY już działają dobrze, więc wrzuciłem JD1 i znów było źle. Wniosek: JCE pozbawiony jest tego błędu lub też (inaczej to interpretując) niweluje problemy po stronie PLAYa. Cokolwiek by to nie było na JCE działa pięknie, nawet bez wyżej opisywanych wpisów do pliku build.prop.
Mogłem więc pozostać przy JCE, jednak myśl o tym, że ROM jest z marca strasznie mnie do tej przesiadki zniechęcała, tym bardziej, że miałem świadomość, że za tym wszystkim kryje się pewnie jakiś mały pliczek, który wystarczy zmodyfikować, żeby uzyskać pożądany efekt. Zacząłem porównywać i mixować ROMy JCE oraz JH1. Oba miałem na szczęście w wersjach "deodexed". Winowajcą okazał się wcale nie taki mały pliczek, a potężny i ważny plik /system/framework/framework.jar. Wystarczyło więc go przerzucić z wersji JCE do JH1 i nie było problemu z NETem. Problem w tym, że korzystanie z najnowszego ROMu JH1 wraz ze starym frameworkiem (z JCE) mija się przecież z celem, więc przede mną stanęło kolejne wyzwanie.
Wewnątrz pliku framework.jar znajduje się klasa *.dex, zrozumiała jedynie dla dalvik'a czyli wirtualnej maszyny Javy Androida. Nie jest to plik, który można sobie edytować w notatniku i zmieniać zmienne, tak jak np. w build.prop, stąd nie można było od tak porównać obu tych plików. Na szczęście dzięki projektowi " smali " jest możliwość zastosowania inżynierii wstecznej (deasamblacji) androidowych plików dex, do formatu nadającego się do jakichkolwiek dalszych modyfikacji. Po zastosowaniu tego wspaniałego narzędzia na pliku classes.dex (znajdującego się we framework.jar) ukazało mi się kilkaset plików w kodzie binarnym, z których musiałem znów odnaleźć ten jeden jedyny, różniący oba ROMy. Zadanie było o tyle trudne, że takich różniących plików było bardzo dużo, a i proces testowania się wydłużał, gdyż po wytypowaniu pewnej grupy plików i podmianie z tymi z drugiego ROMu, należało dokonać ponownej asamblacji, czyli powrotu do kodu maszynowego, zrozumiałego dla dalvika oraz wrzucić taką paczkę na telefon. Było to czasochłonne, ale metodą zawężania obszaru poszukiwań dotarłem do winowajcy. Jest nim plik:
com\android\internal\telephony\gsm\GsmDataConnectionTracker$2.smali
Oczywiście ścieżka dostępu do tego pliku dotyczy zdeasamblerowanego pliku classes.dex (należącego do framework.jar). Plik ma ponad 1000 lini kodu, ale porównując oba te pliki różnica jest tylko w jednej linii nr 364:
const-wide/16 v22, 0xbb8
const-wide/16 v22, 0x2710
ROM JH1: "bb8" w kodzie szestnastkowym, to liczba 3000
ROM JCE: "2710" w kodzie szestnastkowym, to liczba 10000
Zatem aby internet nie zacinał się przy inicjowaniu połączenia 3G musi być w tym miejscu liczba większa od 3000. Testowałem też 0x1770, czyli 6000 i także nie było problemów z 3G. Pytanie czym są te liczby i jak można je interpretować? Na to pytanie na chwile obecną nie umiem odpowiedzieć. Fajnie, gdyby ktoś obeznany w tej tematyce zabrał głos, bo jak na razie wiemy jak pozbyć się problemu, ale nadal nie wiadomo czym jest on tak naprawdę spowodowany.
Spakowany plik GsmDataConnectionTracker$2.smali załączam do tego posta, by można było go w całości zobaczyć.
Podsumowując: W paczce fix3g.zip siedzi framework.jar z sierpniowego ROMu JH1 (poddanego deodexacji), a w nim classes.dex, w którym przy pomocy deasamblacji zmodyfikowałem plik GsmDataConnectionTracker$2.smali, w taki sposób, by w linii nr 364 znajdowała się hexadecymalna wartość 2710. Dzięki temu możemy się cieszyć niezawieszającym się 3G/H w sieci Play 😃
Forum po zmianach, link nie działa