2014. január 2., csütörtök

jBART - android honosítás tévhitek

Először is szeretném leszögezni hogy eme cikk nem lejáratás céljából készült, és nem áll(t) szándékomban senkit sem megbántani. A leírás sok helyen felületes, nem minden részt említ mert hatalmas a téma, természetesen lehetnek benne hibák, kérem nézzétek el nekem és jelezzétek! 
A poszt a hiányos magyar android-al ellátott készülékek honosításának pontos menetét nem taglalja, csak egy-két komoly tévhitet oszlat el, csupán azért hogy világosabbá váljon mi, miért, vagy miért nem történik.

Mi az a jBART?
A jBART elsősorban egy automatizált android ROM honosító java alkalmazás. Készítője egy android körökben igen ismertté vált BurgerZ (Andrei Zhukouski) nevű úriember. A programnak szüksége van a nyelvi fájlokra amiket ú.n. repo-knak hívunk. Rendelkezik beépített (online) repo-kkal, de magunk is adhatunk meg akár lokálisan elérhetőt .

Miért fontos amit itt leírok?
Mert ennek használata igen messze van a tökéletestől, és előfordul hogy csak bajt okoz, vagy bizonyos esetekben egyes helyeken rosszabb állapotot eredményez. Összességében természetesen javít a végleges verzión.

Android nyelvi erőforrások?

Ha valaki érez ingerenciát pl. apktool-al fordítson vissza egy tetszőleges rendszer APK-t annak könnyebb érthetőségéért, ha nincs kedve elmondom hogy minden egyes APK-ban a res/values és esetünkben a magyar nyelvi fájlok a res/values-hu és res/values-hu-rHU könyvtárakban találja, általában egy arrays.xml és egy strings.xml fájlokban szigorú szabályok közt felsorolva. (található még a raw-ban is de most mellőzük a könnyebb érthetőség kedvéért) Ha "kínából érkező" készüléket fordítanánk akkor nagyon valószínű hogy legalább az alapértelmezett angol nyelv (nem az alapértelmezetten beállítottról van szó) teljes, erre kínai barátaink az esetek többségében figyelnek. Ez az alapértelmezett angol a res/values mappában található pár dologgal kiegészítve. (kínai barátainknál természetesen sokszor az angol kínait jelent)

Ha valaki manuálisan lokalizál (magyarra) akkor a legtöbbet a strings.xml-el fog foglalkozni azaz a values-hu könyvtárban lévő fájlokban fog kutakodni, nézzük meg egynek a tartalmát hogyan is néz ki, példaként természetesen a jBART-hoz használt magyar repo-ból:

Settings.apk (strings.xml) magyar JB repo-ból(140-es sor) azaz a Beállítások alkalmazás:

<string name="outdoor_settings_title">Kültéri</string>


Egy ú.n. string name van definiálva (outdoor_settings_title) ami egy konkrét egyedi azonosító a rendszerben, amit akkor hív elő amikor az adott pl. lista vagy menüelemet, címet, bármit ami egy string name-el van ellátva meg kell jeleníteni, ha a rendszer beállított nyelve magyar, akkor esetünkben ebből a values-hu könyvtárban lévő strings.xml-ből veszi elő (mert a rendszer tudja hogy az aktuális nyelv beállítása miatt abban kell keresnie). Ha nem talál ebben a fájlban ilyen outdoor_settings_title string name definíciót (tehát hiányzik ez a sor ebből a fájlból) akkor az alapértelmezett values/strings.xml fájlba kukkant bele és onnan húzza be. Ezt látjátok amikor a pl. Beállításokban egy-egy menüpont hol magyar, hol angol nyelven jelenik meg. Azt jelenti hogy a magyar nyelvi fájlokban nem szerepel az a string name definíció így kénytelen a values-ból (a rendszer aktuális beállításától független alapértelmezett angol) előszedni.

A feladat egyszerű, ha a magyar nyelv kiválasztása után valami angol maradt, akkor a values-hu - esetünkben - strings.xml fájljába fel kell venni egy olyan sort és lefordítani magyarra majd elmenteni a fájlt, összecsomagolni az erőforrásokat a megfelelő eszközzel, bizonyos esetben szignózni az APK-t és felpakolni a készülékre, azaz ellenőrízni. Előfordulhat olyan is hogy egy APK-ban teljesen hiányzik az - esetünkben - values-hu könyvtár, ilyenkor nincs más teendő mint manuálisan létrehozni a benne lévő fájlokkal együtt. (ennek függvénye, és nagyon fontos, hogy a rom-ban választhatónak kell lennie Beállításokból a magyar nyelvnek!)

1db(!!!) Beállítások (Settings.apk) alkalmazás (pl. JellyBean esetén) ~2000-2500(!) sort, azaz ennyi nyelvi definíciót tartalmaz MINDEN nyelven! (nyelvenként ~200-300kB tényleges adatmennyiséggel)
Most nézzük meg ugyanezt a fenti példában megismert definíciót, egy tetszőleges készüléken lévő szoftver esetében, ami a Lenovo P770. Ha megfigyeljük, akkor bár szerepel az angol nyelvi fájlban, azt lefordítva magyarra a fent leírt módon mégis angol marad az a menüpont. 

Miért lehet ez?
A válasz egyszerű, a Lenovo fejlesztői új string name definíciót használnak ahhoz a menüponthoz ami sok más készüléken lévővel teljesen megegyezik (ugye emlékszünk hogy egyedi azonosítóról van szó?):

<string name="audio_profile_outdoor_title">Kültéri</string>

Látszik hogy az egyedi definíció a outdoor_settings_title-ról audio_profile_outdoor_title-ra változott, azaz az adott elem meghívásakor ez utóbbit keresi a nyelvi fájlok között, ha a rendszer nyelve magyarra van állítva és megtalálja a magyar fájlokban akkor úgy jeleníti meg, ha nem találja akkor a korábban is említett alapértelmezett values-ban lévő fájlokból húzza be (angolul).
Ha megpróbáljuk megkeresni a korábban is linkelt magyar JB repóban, akkor sajnos konstatálnunk kell hogy abban viszont nincs ilyen string definíció, és ha még jobban szemügyrevesszük akkor egy csomó olyan viszont van ami nekünk nem is kell, mert pl. nem szerepelnek azok a beállítások a készülékben a funkció(k) hiányában.

Látszik tehát hogy az automatikus honosítás, az eltérő firmware verziók, gyártók, készülékek, stb. esetén egy eléggé felületes, sokszor felesleges adatokkal felülírt ROM-ot eredményez.

Minden egyes APK-ban - rendszer szinten is -, Böngésző, Kamera, Üzenetek, Beállítások stb., még a Play-ből telepítettekben is vannak ilyen erőforrások (könyvtárak és fájlok). Egy teljes rom alap alkalmazásokkal és erős becsléssel (JB esetén) közel 100.000(!) ilyen minket érintő nyelvi definícióval van ellátva...lássuk be ez még gombócból is sok. 
Az én tapasztalatom az hogy a kínából érkező készülékek (MTK platform) kb. 60-70%-osan fedik le a magyar nyelvet, a többi angol (esetleg kínai). Legfőképp a dual-SIM támogatás miatt, hiszen azt "ők találták ki, ők fejlesztették"...google a mai napig nem támogatja hivatalosan a két SIM kártyás üzemmódot, így az nem szerepel a hivatalos mindenki által elérhető Android forrásban sem...csak a "kínaiknál" van jelen. De megemlíthetném a Lenovo egyedi megoldásait/alkalmazásait is....és még sorolhatnám.

Most tegyük fel hogy rengeteg ilyen le nem fordított definíciót találtunk hisz most érkezett a készülékünk kínából és megvan a custom recovery-ből telepíthető gyári rom is, próbáljuk megoldani a honosítást jBART-al. 

Mit is csinál pontosan a jBART?
A jBART - mint korábban említettem - ú.n. repo-kkal dolgozik, amiknek tartalma a fent taglalt nyelvi fájlok, befoglaló mappáival együtt...jó esetben minden egyes APK-hoz tartozó magyar nyelvi erőforrások szerepelnek benne, ami a gyári rom-ban...vagy mégsem?
A művelet amit végrehajt szimplán annyi, hogy fogja egyesével a ROM-ban fellelhető rendszer APK-kat, kibontja, a kiválasztott repo-ban lévő - magyar nyelvi fordítás esetén - values-hu könyvtárat és annak teljes tartalmát a többi közé bemásolja és/vagy felülírja, majd elkészíti a végleges APK-t a megfelelő módon. Így sorban végigmegy minden egyes elérhető APK-n....bármiféle vizsgálat nélkül. Fontos megjegyezni hogy honosítás szempontjából természetesen az összképen mindenképpen javít, tehát tuti hogy jobb lesz mint azelőtt volt de korántsem tökéletes, sőt lehet olyan is hogy ami eddig magyar volt az többé már nem az.

Így tehát ha a repo-ban lévő nyelvi fájlokban szerepel minden olyan definíció amire nekünk szükségünk van, akkor nyertünk. Sajnos viszont nem ez a helyzet, rengeteg olyan definíció van ami tök feleslegesen van benne a repo-ban, és rengeteg van ami nincs benne pedig kellene.

Persze jogos felvetés lenne de nem megoldás, hogy egy olyan repo-t csinálunk ami az eddig fellelhető összes készülék összefésült nyelvi fájljait tartalmazza, mert olyan mennyiségű adathalmazról van szó amivel nem szabad dolgozni.

Akkor mi a megoldás?
Ha valakinek ez megfelel lelke rajta, és köszönet azoknak a munkájáért akik ezt elérhetővé tették (én tudom hogy mekkora meló), viszont a tökéletességért sajnos a manuális megoldáshoz kell folyamodni, és minden rendszerösszetevőt egyesével átnézni, megkeresni a hiányzó részeket, pótolni/módosítani őket, majd ellenőrízni, és még így is marad(hat) olyan rész ami lefordíthatatlan mert hardcoded (ami egyébként tilos lenne , pontosan a lokalizáció miatt), és egy kész APK-ban csak smali-ból módosítható (visszafordított java osztályok - gépi kódban), ami egy nem hétköznapi embernek is a kínaival egyenlő.
Ez nagyon nagy munka, de egyszer kell csak megcsinálni, viszont ahány gyártó, készülék, rendszer, fejlesztő, annyi féle. Jómagam természetesen mindig ez utóbbit preferálom...és ezért is nem értek azzal egyet amikor azt mondja valaki hogy tökéletesen magyar lesz úgy hogy megnyom ~2 gombot, majd egy menüpont egyik fele magyar, másik fele meg angol marad...számomra ez nem megfelelő ahogy sok másnak sem (én sem szeretem a fércmunkát).