Mobility
How Fake Camera works
14After recent Kik update I have full mailbox of messages like „Fix fake camera asap“ and a lot of one stars ratings at Google Play. So let’s have a look into how Fake Camera works and how Kik/Android camera works – to explain, why I am unable to do anything with this.
Do you think Fake Camera is that „Camera picker dialog“ which appears after you chose to take a picture? Wrong! That’s Android system dialog!! Take a look what happens, when application (like old version of Kik) asks for taking a picture. There are two possible scenarios: there is just one camera application on your phone (or some of you cameras is set as default) OR there are more camera applications on your phone. Let’s draw a simple diagram of communication between application and android phone – for both of those cases.
In case one application (for example old version of Kik) asks for taking a picture, so phone answers with just one camera application and runs it for Kik. Let’s say it opens your phone default camera application directly.
In the second case, when there are more camera applications to chose, phone displays dialog – camera picker and lets user choose which camera application use. And runs it for him again.
Can you see that? That dialog is not displayed by Fake Camera application, but by your Android phone itself! Fake camera is just another camera application within that list!!!
Now let’s see how all this work with new Kik update: this new update has its own (in-application) camera, so it does not call external camera application for taking pictures. It just takes a picture within that application and does not say anything to Phone nor other application.
Again – can you see that? There is no way to let your Android phone to display that Camera picker dialog, because all that stuff does application itself (Kik). And because there is no way your phone can display that dialog, there is no way to run Fake camera (that gallery picker) nor any other Camera application. Deal with that or write a message to Kik (or whatever application you want to use) authors and not me, I have nothing to do with this!! And of course – if you changed your rating of Fake Camera because of this, put it back please, because Fake camera still works correctly!!
PS if you are still unable to deal with that, take the MinusIQ pill and go chatting to g+ page, if there is some place between animated gifs and selfies.
Howto clear defaults to get Fake Camera running again
43Quick note: please use Google plus community for asking a questions.
I like to read reviews of my applications on Google Play, especially those with suggestions and questions :). Last few days I’m getting more and more questions like this one for Fake Camera
Won’t open on kik When I tried to send a pic as a live pic from the gallery it took me to the regular camera and didn’t give me the option to choose the app or the regular camera.
or this one
Fake Camera does not work for me, you sucks!
So because of that I’m going to write a step by step how to clear defaults and let camera picker appear again, because that is the main reason of those problems. We’ll start quickly, I just want to say following at the beginning: If this work for you, don’t forget to change your rating and review on Google Play!!!!
If you accidentally selected „Use as default“ checkbox in Camera picker, it’s possible to revert this, Just follow these steps:
And now comes the tricky part: in application list select that app, which opens automatically instead of camera picker, in my case it’s standard Camera app:
And we are done for now, camera picker dialog should appear instead of default selected application. Please note that this has nothing to do with inapp camera some applications may use – that’s impossible to fake.
One more time – if your Fake Camera works again, don’t forget to change your rating and review on Google Play, thank you! And, of course, if you’d like to say thanks for Fake Camera, just buy a Donate Version, or send me some bitcoins or so. Thank you!
Custom ROM a Samsung Galaxy S2
0Už je to rok a půl, co jsem majitelem v nadpise uvedené hračky. Mimo úvodních pár měsíců, kdy jsem byl nadšen rychlostí systému (v porovnání s G1), jsem na telefon permanentně nadával a v poslední době to gradovalo do takových extrémů (touha rozmlátit telefon, komunitu i google), že jsem se konečně přinutil věnovat odpoledne nahrání Custom ROMky, zprovoznění ROOTa a image s recovery. A protože jsem ne všechny potřebné informace a nástroje našel na jednom místě a navíc se potýkal s drobnými problémy, přijde mi vhod udělat tímto postem takový malý rozcestník.
Když jsem svého času přehrával systém v G1 (CyanogenMod a později SuperD), byly všechny kroky popsány pěkně pod sebou přímo na stránkách s danou ROMkou, u Toshiby se daly rozumně dohledat po fórech. Co se však týká SG2, našel jsem víceméně kulové. Všechny návody (oficiální) počítají s tím, že už požívám nějakou jinou ROMku a přestože někdy úvod a nadpis vypadá, že bude dále řeč o vanilla Samsung paskvilu androidu, nebylo tomu tak. Mimo jiné se tyto návody specializují spíše na Windows, já však potřeboval update provést z Macka (a obecně by to mělo fungovat i pro GNU Linux).
Pokusím se tyto kroky sepsat níže, spolu se zdrojem, odkud jsem čerpal. Uváděná čísla verzí (pokud je uvedu) se samozřejmě časem změní, takže v mnoha případech zůstanu pouze u uvedení názvu daného nástroje a strýček google jistě poradí. Ještě bych na úvod poznamenal, že nenesu žádné riziko, pokud si někdo následujícím postupem s telefonem něco provede.
1. Instalace obrazu zavaděče – postupoval jsem podle howto ve wiki Cyanogen modu, který mě nasměroval na Heimdal Suite, což je multiplatformní nástroj pro flashování obrazů do Samsung Galaxy S zařízení, jak tvrdí oficiální FAQ. Z výše uvedené wiki jsem se dostal i ke ClockworkMod Recovery. Heimdal jsem stáhnul ve formě instalačního balíčku a hned tady jsem měl první problém – instalátor umně skryl okno s informací o potřebě restartu pod všechna okna a já se chvíli trápil s tím, proč se mi nedaří aplikace použít. Po restartu však vše šlo jako po másle a bylo možné nahrát image do zařízení (nejprve nutno zapnout USB debugging a nastartovat telefon do „download režimu“ pomocí trojhmatu volume down, home a power):
sudo heimdall flash --kernel zImage
2. Povolení superuživatele – spočívající v nahrání binárky su a aplikace Superuser. Na tuto aplikaci mě odkázal miculog, kterého jsem se ale zase tak moc nedržel a ze stránek stáhl zip archivy, které jsem nahrál na kartu, nabootoval do recovery (tentokrát volume up, home a power) a odtud je pomocí „Install zip from sdcard“ nainstaloval.
3. Provedení zálohy – stále v recovery režimu je možné provést zálohu systémových oddílů v nabídce „backup and restore“.
4. Stažení vlastního obrazu s ROM – a následné nahrání na kartu (nebo interní úložiště) v telefonu. Já se rozhodl pro MIUI ROM, takže jsem stahoval nejnovější build a snažil se postupovat podle oficiálního návodu. Bohužel jsem v rámci minulého kroku zároveň začal mazat i cache, data a další místa, takže mi telefon odmítl nabootovat a nemohl jsem tak do něj nahrát zip soubor s updatem. Po chvíli googlení jsem problém vyřešil a pomocí adb z Android SDK namountoval „ramdisk“ jako externi úložiště (telefon v recovery režimu) a nahrál tam požadovaný image:
shmoula $ adb shell # mount -t tmpfs none /sdcard # exit shmoula $ adb push miuiandroid_GT-I9100_ics-2.11.23.zip /sdcard/ . . . . .
5. Instalace custom ROM – po předchozím vymazání „wipe data/factory reset“, „wipe cache partition“, „advanced – Wipe Dalvik Cache“ a konečně „Mounts and Storage – Format/System“ následuje opět „Install zip from SD card“ a výběr v předchozím kroku nahraného zazipovaného image. Po chvíli akce a napětí následuje restart telefonu pomocí výběru „restart system now“ a s největší pravděpodobností naběhnutí nového systému (a drobné rozčarování z jiného rozložení a následujícího kroku).
6. Instalace Google aplikací – protože nesmějí být bundlovány s custom ROMkama. MIUI už však části těchto aplikací obsahuje, navíc má vlastní market a další drobnosti, takže je nutné tyto služby nejprve povypínat, jak radí začátek tohoto vlákna.
shmoula $ adb shell # mount -o remount,rw -t ext4 /dev/block/mmcblk0p1 /system # mv /system/app/NetworkLocation.apk /system/app/MiuiNetworkLocation.bak # pm disable com.miui.cloudservice # pm disable com.xiaomi.xmsf # exit
Teď už je možné stáhnout balíček s google apps a nahrát jej na kartu v telefonu. Instaluje se opět jako update v recovery režimu volbou „Install zip from SD card“.
7. Aktivování Mass usb režimu – od jisté verze tydlidrojdu není povolen USB Mass storage režim, takže je nutné jej aktivovat ručně:
shmoula $ adb shell # setprop persist.sys.usb.config mass_storage
8. Závěrečný restart telefonu a přihlášení se ke svému google účtu a následný komentář s pochvalou pod tímto návodem.
Otevreny dopis T-Mobile czech
1Posilal jsem 13. cervna na cesky t-mobile mejl nasledujiciho zneni:
Dobry den,
chtel bych se zeptat, kdy mate v planu modernizovat infrastrukturu, na ktere vam bezi web? Jakozto platici zakaznik mam na praci jine veci, nez se donekonecna potykat s nefunkcnosti (a predevsim rrrryyyycchhhlllooossstttiii) vasich webovych stranek, predevsim s ohledem na to, ze za penize, ktere jste ode me za tech mnoho let ziskali byste byli schopni si poridit nekolik novych serveru?
No a protoze se dodnes nikdo neuracil odpovedet, delam z toho otevreny dopis, mimo jine z duvodu, ze mi jejich stranky opet hlasi „The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.“ Aneb – jako obvykle.
Dekompilace androidích aplikací
0Někdo se rád pídí po tom, jak věci fungují, někdo se rád občas nechává inspirovat cizími kusy kódu a někdo prachsprostě krade (možná by se to dalo nazvat nějakou IT kleptomanií). Všem těmto skupinám by ovšem mohl přijít vhod tento blogpost, protože v několika krocích popisuje operaci jednoduchou (tu jednoduchost myslím vážně, zabývat se dedexerem, aka android disassemblerem opravdu nehodlám, z toho už jsem vyrostl a zpohodlněl) – a sice rozbalování a dekompilaci androidí aplikace.
Jak je tvořena androidí aplikace asi každý vývojář ví, takže tuto část vypustíme a přejděme blíže k věci, což by mohl být aapt, neboli Android Asset Packing Tool, který je součástí nástrojů v SDK. Tento nástroj je jednak zodpovědný za parsování všemožných souborů (včetně manifestu) uvnitř projektu a následné přetváření takových properties do R.java souboru, ale především i za proces opačný, čili dolování informací z již hotových .apk souborů a to i podepsaných a zarovnaných. Nebudeme chodit kolem horké kaše a skočme rovnou do nějakého příkladu. Půjčil jsem si APKčko z mého rozdělaného projektu a provedl nad ním následující kouzlo:
vbalak@vbalak-desktop:~/develop/workspace.sts/PlantATree/client/target$ aapt l -a pat-client.apk res/layout/area_map.xml res/layout/main.xml res/layout/tree_details.xml res/layout/tree_list.xml res/layout/tree_list_item.xml res/menu/map_menu.xml AndroidManifest.xml resources.arsc res/drawable-hdpi/icon.png res/drawable-ldpi/icon.png res/drawable-mdpi/icon.png classes.dex org/codehaus/jackson/map/VERSION.txt org/codehaus/jackson/impl/VERSION.txt META-INF/MANIFEST.MF META-INF/CERT.SF META-INF/CERT.RSA
Nejprve je vidět seznam souborů nacházejících se v archivu (.apk je obyčejný zip soubor, takže je možné jej jednoduše rozbalit, v tom není žádná věda). Další část (resource table) je zajímavější – jedná se o identifikátory zdrojů, neboli to, co je v souboru R.java – to jsou ty hexa čísla uvedená bezprostředně za spec resource a dále typ tohoto zdroje – layout, string, drawable, id…
Resource table: Package Groups (1) Package Group 0 id=127 packageCount=1 name=cz.shmoula.pat Package 0 id=127 name=cz.shmoula.pat typeCount=6 type 0 configCount=0 entryCount=0 type 1 configCount=3 entryCount=1 spec resource 0x7f020000 cz.shmoula.pat:drawable/icon: flags=0x00000100 spec resource 0x7f04000a cz.shmoula.pat:string/menu_toggle_view: flags=0x00000000 . . .
Nejzajímavější je ovšem část poslední, což je sám velký manifest. Kdo měl možnost nahlédnout do AndroidManifest.xml a teď kouká na tento výpis, všímá si velké podobnosti (pokud potlačí rozdílný způsob zobrazení – tohle není xml ;-)). Jsou zde krásně vidět využívaná oprávnění, je zde vidět, jakou program používá ikonu (to je ten hexa kód, který se dá dohledat v části se zdroji – Resources Table). Jsou zde vidět jednotlivé aktivity, parametry aktivit a definované intent-filtry a také využívané knihovny – prostě kompletní manifest, akorát jinak formátovaný. Pro naše další potřeby potřebujeme vstupní bod do aplikace, což bude LAUNCHER a ten je nastaven pro třídu MainActivity, která je v balíčku cz.shmoula.pat, bude se nám hodit za chvíli. Za zmínku ještě stojí anotherMapProcess v poslední aktivitě – dvě mapy se v jedné aplikaci nesnesou, tudíž je nutné je spouštět v rámci jiného procesu, tento parametr tohle zajišťuje (taky jsem nad tím tenkrát dlouho koumal).
Android manifest: N: android=http://schemas.android.com/apk/res/android E: manifest (line=2) A: android:versionCode(0x0101021b)=(type 0x10)0x1 A: android:versionName(0x0101021c)="0.1" (Raw: "0.1") A: package="cz.shmoula.pat" (Raw: "cz.shmoula.pat") E: uses-permission (line=5) A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET") E: application (line=7) A: android:label(0x01010001)=@0x7f040001 A: android:icon(0x01010002)=@0x7f020000 E: activity (line=8) A: android:name(0x01010003)=".MainActivity" (Raw: ".MainActivity") E: intent-filter (line=9) E: action (line=10) A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "android.intent.action.MAIN") E: category (line=11) A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw: "android.intent.category.LAUNCHER") E: activity (line=15) A: android:name(0x01010003)=".LookAroundActivity" (Raw: ".LookAroundActivity") . . . E: activity (line=16) A: android:theme(0x01010000)=@0x1030006 A: android:name(0x01010003)=".ShowAreaMapActivity" (Raw: ".ShowAreaMapActivity") A: android:process(0x01010011)=":anotherMapProcess" (Raw: ":anotherMapProcess") E: uses-library (line=22) A: android:name(0x01010003)="com.google.android.maps" (Raw: "com.google.android.maps")
V této fázi tedy máme hrubý přehled o struktuře aplikace, bylo by vhodné se dostat ke třídám. Ty jsou zabalené uvnitř souboru classes.dex, který se nacházi uvnitř APKčka, takže bych prosil rozzipovat tento archiv. Tento soubor je víceméně nějakým způsobem rozsypaný Java ARchive a pro jeho sesypání do použitelného formátu slouží utilitka dex2jar, která se spouští jednoduchým způsobem:
vbalak@vbalak-desktop:~/develop/stuff/dex2jar-0.0.7.8-SNAPSHOT$ ./dex2jar.sh classes.dex version:0.0.7.8-SNAPSHOT 3 [main] INFO pxb.android.dex2jar.v3.Main - dex2jar classes.dex -> classes.dex.dex2jar.jar Done.
Získali jsme tedy opravdový archiv .jar, který je opět možné rozzipovat a koukat na jednotlivé zkompilované třídy. Také je možné udělat víc – pomocí některého java dekompileru je možné se podívat dovnitř, já volil Java Decompiler. Pomocí něj je možné otevřít získaný .jar soubor a v levé části otevřít požadovanou třídu (výše jsme zjistili, že vstupním bodem je MainActivity) a užívat pocitu vítězství, nebo začít vykrádat se začít inspirovat cizím kódem. Toď vše, pro ilustraci ještě přikládám shot JavaDecompileru.