четвъртък, 23 април 2015 г.

Unbrick на Android - Alcatel 6043D

Реших да опиша как се справих със ситуация, в която си брикнах телефона (brick = тухла) по начин, по който според всички правила трябваше да го отпиша и да си купя нов. Описвам го най-вече за да го запомня за следащия път, но и за да помогне евентуално при други подобни случаи.

Ще почна отзад напред - с изводите:

Извод 1: не си купувайте капсулован телефон, на който не може да му се маха батерията. Има ситуации, в които просто трябва да се махне батерията, въпреки обясненията на производителите, че едновременото натискане на бутоните Power = Vol+ води до рестарт на телефона.

Извод 2: не си купувайте телефон, на който не може да му се слага външна SD-карта, колкото и голяма вътрешна памет да има. SD картата е нужна за други неща, не само за разширение на паметта.

А сега и в правилния ред - защо се стигна до брикване.

Въпреки настояванията на Google и на половината девелопери, че Андроид си управлява паметта по ефективен начин и няма нужда да се вземат никакви мерки за нейното пестене, това категорично не е вярно. Огромна част от приложенията, сред които всички, които показват реклами, се активират при настъпването на някакво събитие - стартиране на телефона, промяна в мрежовата свързаност, изгасване на екрана, отключване и т.н. Андроид действително ги спира, когато му трябва памет, но веднага "след това" (а не е ясно кога е това "след това" - обикновено е буквално "след това", примерно тутакси) приложенията отново се зареждат. Т.нар. "килъри" не вършат работа, защото няколко секунди след килването на приложенията те са се заредили отново, при това ефектът е отрицателен - при повторно пускане приложението заема повече памет, отколкото би хабило, ако е било оставено да си стои в паметта. Няма значение защо е така, но е така - ако Фейсбук стои пуснат, ще хаби примерно 50 мегабайта, но ако го килнете и след секунда той сам се пусне пак, ще хаби примерно 120 мегабайта. Андроид наистина сам спира приложенията, но само които могат да бъдат спрени. Другите си стоят пуснати и никой не може да ги "убие". Ако се опита, става по-лошо.

Някои от най-използваните приложеня, които не спират никога (каквото и да сте им казали и дори да не ги виждате в Applications / Running) са Facebook, Skype, Messenger, Viber, Hangouts. Няма значение дали сте онлайн или офлайн, нито дори дали сте ползвали приложението след последния reboot. Skype тръгва с включването на телефона и стои в паметта докато не го деинсталирате. Дори от време на време ползва мрежата, дори ако не сте логнати. Ще се изненадате колко много приложения стоят постоянно включени и не могат да бъдат спряни НИКОГА, включително такива, които със сигурност не ви е хрумвало, че трябва да стоят активни постоянно (например Gallery). Под "постоянно" имам предвид точно постоянно - Андроид не може да ги спре дори при липса на памет, защото те тръгват практически веднага отново. Това води до голямо забавяне на телефоните с малко памет ("малко" означава под 2G, което е почти еквивалентно на "всички телефони", защото към днешна дата малко модели имат толкова). 

От телефона и таблета на дъщеря ми знам, че всички игри от серията Talking ... и Moy също се зареждат с включване на устройството и не могат да се спрат с нищо.

Всъщност не съвсем с нищо. Има едно приложение, което върши работа - Greenify. То хибернира (Force Stop) приложенията, а не ги убива. Хибернираните приложения стоят извън паметта докато не ги пуснете, защото им се разкачат "връзките" към операционната система и тя не вече не ги пуска при настъпване на желаното от приложението събитие (например закачане към Wifi). Пуснете ли ги, обаче, отново влизат в "цикъл" и отново нямат спиране, докато на ги хибернирате. Хибернирането може да става ръчно от Applications / Force stop, но това не е удобно, затова ползвам Greenify. То върши добра работа и без да ви е root-нат телефона, но ако е root-нат може да хибернира повече неща, при това автоматично. А ако се инсталира Xposed Framework (инсталацията става през Greenify), тогава може да прави още повече работи и още по-ефективно, но затова - после.

Ако сте си root-нали телефона има още нещо, което върши добра работа - Startup Manager може да забрани на нежеланите приложения да се зареждат автоматично при зареждането на телефона / таблета (използвайте старата му версия, а не новата All-In-One). Ще се изненадате колко много неща тръгват с включването на устройството - аз спрях над 20 приложения, които дори не ми е хрумвало, че стоят заредени и невидими. В крайна сметка с Greenify и Startup Manager спестих около 500 MB памет - а това е горе-долу колкото цялата памет на голяма част от телефоните.

Рутването на телефона / таблета става много лесно с програмата Kingo Root - инсталирате я на PC-то (не на телефона, на телефона сама се качва!), връзвате телефона с USB кабел и следвате инструкциите. В телефона трябва да пуснете USB debugging в Developer options. Ако нямате Developer options в настройките, влезте в About phone и кликнете 7 (седем) пъти върху Build number - тогава девелоперското меню ще стане видимо и ще можете да разрешите USB debugging. Впрочем, пробвайте да кликнете десетина пъти върху Android version ;)

До тук - добре. Правил съм го 5-6 пъти на различни устройства (маркови и нонейм) и всеки път се рутва без проблем. Операцията би трябвало да е безопасна - ако не се рутне, просто няма да се рутне и толкова.

При мен проблемът възникна с качването на Xposed Framework върху най-мощния телефон, върху който бях пробвал да го качвам. На 4-5 устройства тръгна без проблем, но на Idol-а се изпълни предупреждението, че в редки случаи това може да доведе до boot loop. Принципно това не ме плаши - досега не се е появявал компютър, който да не мога да преинсталирам от нулата, а телефонът е компютър с линукс (андорид е вид линукс), така че (само)уверено пренебрегнах предупрежденията, без да взема предварителни мерки. И се видях в приключение. Преди приключението, да прикюча с изводите:

Извод 3: рутнете си телефона, качете си Greenify (и да не го рутнете, пак го качете) и Startup Manager (това изисква рут, няма начин). Но не качвайте Xposed.

Та за приключението - boot loop е проблем, при който операционната система крашва преди още да се зареди. Ретартира се сама и отново крашва, и така до безкрайност. Положението не е неспасяемо, защото може да се зареди спасителен имидж, но:

Проблем 1: капсулованият ми телефон няма слот за SD карта. Оказа се, че няма начин да му boot-на външна  система. Не мога да заредя rescue image, защото няма как да му го "пъхна".

По принцип има решение. На компютъра се инсталира Android SDK, което само по себе си е отделно приключенийце, но не е трудно. Там има едно нещо, което се казва adb и с което може през usb порта да се изпращат инсталационни пакети към телефона. За целта телефонът се изключва и се включва отново, като се държат натиснати едновременно бутоните Power и Volume +. Май има и отделен пакет само с adb - ще го потърся и ще дам линк, за да не се инсталира целия SDK.

Създателите на Xposed са предвидили тази ситуация и има пакет, който може да се подаде по този начин към телефона (Google: Xposed-Disabler-Recovery.zip), което би трябвало да деинсталира Xposed и да оправи нещата. При мен не сработи, но все пак алгоритъмът е този:

Влизате в recovery s Power-Vol+. Избирате Install from ADB (или както там се казва във вашия телефон) и после в компютъра, намирайки се в папката c:\android-sdk\platform-tools (или както там сте я кръстили при инсталацията на Android SDK) пишете:

adb sideload Xposed-Disabler-Recovery.zip

Проблем 2: с adb могат да се подават инсталационни пакети при липса на SD-карта, но recovery имиджа, който се пуска с Power-Vol+ и който е записан в телефона от производителя, не е "рутнат" и няма достъп до неща, които са качени като root. Всякакъв опит да кача Xposed деинсталатора се провалиха.

Пак има решение: може да се смени recovery партишъна с друг такъв. Има два разпространени спасителни recovery имиджа - CWM и TWRP. Трябва да намерите в интернет версия, която е точно за вашия телефон. Тези имиджи са изключително специфични - трябва да е точно за този модел, а не само за този производител. Аз успях да намеря TWRP за Alcatel 6043D тук: twrp-2.6.3.0-advanced-6043D-c92-v2.img


Проблем 3: за да се запише имиджа върху телефона, по принцип се използва SP-Flash-Tool (инструкции - тук, може да потрябва този драйвер: ADB-Driver-v1.4.2.zip). Този тул, обаче, се нуждае от т.нар. scatter-файл, който отново е специфичен за всеки модел устройство. Не можах да намеря scatter файл за моя телефон и ударих на камък - няма качване на имиджа с SPFlash, защото без scatter файл изобще не тръгва. Аз после (след като реших проблемите и подкарах телефона) сам създадох този файл с помощта на MTKDroidTools, в случай, че някога потрябва за нещо (MT6592_Android_scatter_6043d.txt), но така или иначе на мен нямаше да ми помогне, дори ако го имах (в този момент все още не знаех, че няма да ми помогне).

Принципно пак има решение, дори без SPFlash - имиджа може да се качи и през adb:

Телефонът се вкарва в нужния режим чрез:

adb reboot bootloader

и се пуска:

fastboot flash recovery twrp.img
fastboot reboot

където twrp.img е името на recovery имиджа за вашето устройство от CWM или TWRP.

Това би трябва да е възможно дори без root, но на моя телефон не тръгна с някакво си съобщение за грешка в смисъл "не може да се презаписва recovery партишъна". Явно Alcatel са се взели насериозно със защитата от вмешателство и телефонът някак пази партишъните от презаписване през USB (по-късно отказваше дори със SPFlash и scatter file).

С това моите познания за справяне с критична ситуация се изчерпаха. Сметнах,  че след като така и така не успявам да го съживя по никой от познатите ми методи (няма SD карта, вграденият recovery имидж не ми позволява да модифицирам root-нати приложения, не мога да кача външен recovery имидж по никой от познатите методи), то няма какво да губя и мога да пробвам да забърша операционната система (има такава фунцкия в recovery режима) и да го върна във фабрични настойки (не става дума за изтриване на данните, а на цялата ОС).

Оказа се, че има какво да губя :) Това доведе този път до пълна смърт на телефона, който спря да реагира дори на бутона за включване и изключване, защото при тази операция се е забърсал и един файл (всъщност партишън) preloader.bin, на който нямах бекъп (направил съм, по-късно ще го кача тук, за всеки случай) и без който телефонът не може да зареди нищо от никъде. Сметнах, че това не е кой знае каква драма - забърсал съм флаша, ще кача оригиналния.

Принципно производителите са длъжни да публикуват оригиналния софтуер, защото Android е open-source. Alcatel си го имат на сайта - сваля се приложение "Mobile Upgrade S" за PC.  С него, отново през USB кабела, но без да се ползват никакви имиджи и хитрини, би трябвало да може да се качи оригиналния софтуер и телефонът да се върне във фабричния му вид.

Да, ама не. Моят телефон в този момент не отреагира на нищо и Mobile Uprade не го намира. В приложението пише, че ако не се свърже, трябва да изключа телефона. Бих го направил, стига да можех (нали не отреагирва на нищо), но той и без това не работи, така че все едно е изключен. Пише, че ако дори при това положение Mobile Upgrade не намира телефона, трябва да му извадя батерията.

Чудесно, обаче моят телефон е капсулован и батерията не може да се извади.

Това не ме спира. В YouTube видях как се отваря точно този телефон, отворих го внимателно и стигнах до батерията. Обаче:

Проблем номер "изгубих им бройката": батерията не се вади. Вързана е към телефона с жица, която не е на куплунг. Не мога да я изтръгна по начин, по който след това да мога да я върна обратно. Жицата влиза вътре в батерията и някъде под платката. Това трябва да се прави в сервиз, а да си нося телефона в сервиза защото не мога да го boot-на е дразнещо и обидно.

Почти се бях примирил и вече си бях избрал новия телефон, дори бях намерил в кой магазин го продават, а старата "тухла" щях все пак да занеса в сервиза и след като го оправят - да го продам. Обаче се сетих, че все пак има един начин батерията да се "извади":

Оставих я да се изтощи.

Това помогна. Не веднага и не много лесно, но след 10 опита "включи USB-то, изключи USB-то, задръж натиснати бутоните, пусни бутоните",  Mobile Upgrade накрая намери телефона и започна да сваля "ъпдейта". Аз имам доста бърз интернет, но свалянето вървеше много бавно - щеше да му отнеме над 4 часа. Легнах си, а на сутринта ъпдейта се беше свалил (1.3G). Натиснах бутона Upgrade phone. Всичко вървеше добре, но:

Проблем номер "въобще вече не ме интересува номера": ъпдейта крашна със съобщение "възникна грешка. Извадете батерията и я включете пак".



Хмм. Добре. Знам вече как се "вади" батерията. Изтощих я пак, ъпдейта пак крашна. Снимката е от втория краш - хрумна ми да я направя, за да я покажа в сервиза като доказателство, че телефонът им е скапан (в смисъл на "не струва", а не на "повреден"), след като собственият им софтуер не може да качи собственият им имидж.

Обаче ми хрумна нещо. По време на качването на софтуера, телефонът, макар и включен в USB-то, всъщност не се зарежда и не черпи ток от там. Не знам защо, но мисля, че USB-то влиза в режим, в който е само един вид card-reader за вградения флаш, без телефонът да играе каквато и да е роля в процеса. Но през това време той все пак е включен на батерия и е нужно тя да издържи до момента, в който процесорът на телефона все пак трябва да свърши някаква работа.

Изтощих батерията. Заредих я до край със зарядното. Спрях всички програми на компютъра, за да не го бавят дори теоретично. Заради направените преди това неуспешни опити, в кеша вече имаше изтеглен софтуера и вместо за 5-6 часа процедурата отне около 45 минути и за мой късмет този път беше успешна. Не знам който от трите фактора (лиспа на други програми, наличие на всичко в кеша, заредена до край батерия) помогна, но в крайна сметка върнах телефона в оригиналния му вид.

Не, това не ме накара да спра до тук. Напротив - даде ми увереност, че колкото и да го скапя, мога да го оправя, затова реших да направя друго: да намеря все пак начин да му сменя recovery имиджа с този на TWRP, за да мога да му качвам каквото си искам и в крайна сметка да го ъпгрейдна до Андроид 4.4.2 (оригиналният "ъпгрейд" от преди малко беше с 4.2.2).

Сега вече правилните стъпки (не питай как съм стигнал до тях - с още няколко неуспешни опита):

1. Рутнах с Kingo ROOT

2. Инсталирах Mobile Uncle App

3. Качих файла с twrp имиджа в корена на вградената памет (/sdcard/) и го прекръстих на recovery.img. Тъй-като телефонът в този момент е използваем (все още :) ), файлът може да се качи по всякакъв познат и удобен начин (аз го правя през PC).

4. Mobile Uncle има функция за презаписване на recovery имиджа, сам си намери файла и го флашна. Ако файлът не е в кореновата папка и не се казва така, може да не го намери, а няма функция за ръчно посочване на файла - трябва сам да си го намери.

5. Качих .zip-файла на неофициалния ROM върху вградената памет (този телефон няма външна). Аз си свалих ROM от тук, но из мрежата има и други.

6. Рестартирах в recovery режим с Power-Vol+. TWRP имиджа се беше качил успешно и избрах Install from SD (нищо, че няма SD - така вижда вградената памет). Намерих папката, в която бях записал съответния ZIP-файл и този път се инсталира - не даде грешката, която даваше оригиналният recovery (разбирай - няма я тъпата защита, която производителят е сложил).

7. Телефонът тръгна с Андроид 4.4.2, рутнах го отново с Kingo ROOT, макар инсталационният имидж да твърди, че ще се инсталира директно рутнат (не беше рутнат, макар да се разпознаваше като такъв).

8. Качих му Greenify (в root режим) и Startup Manager и сега работи значително по-пъргаво от преди.


И накрая главният извод: хич не ми харесва новата стратегия на производителите на хардуер да ми казват какъв софтуер мога или не мога да си качвам на хардуера. Уж било за мое добро. Искам аз да решавам кое е за мое добро и дори да искам да е за зло - да ми дадат възможност да го направя. Всъщност целият проблем по-горе и цялото загубено време е заради защитите, която производителите са сложили, за да пазят МОЯ телефон от МЕН. И които нямаше да се наложи да махам, ако софтуерът им работеше както твърдят, че работи.