Pages

Τρίτη 22 Ιανουαρίου 2013

MK809 Android TV και Development Mode

Εισαγωγή

Πριν από λίγο καιρό αγοράσαμε, εγώ κι ένας φίλος, από ένα MK809. Πρόκειται για ένα μικρό stick που περιέχει ένα διπλοπύρηνο ARM μικροελεγκτή στα 1.6GHz με εσωτερική μνήμη 4GB και 1GB DDR3. Γενικά, έχει πολλά καλούδια, αλλά το ωραιότερο είναι πως τρέχει Android 4.1.1.

Πήραμε το εργαλείο στα χέρια μας και αρχίσαμε να παίζουμε μαζί του. Εγκαταστήσαμε ότι εφαρμογές και παιχνίδια θέλαμε, XBMC 12.0 και άλλα. Σερφάραμε στο Internet και ρίξαμε μέσα και ένα VNC έτσι για να κάνουμε τον χαβαλέ μας. Όλα ήταν τέλεια!

Angry Birds, γιατί τα παιχνίδια δεν είναι μόνο... για να παίζουμε!

Ο τίτλος της παραγράφου φαίνεται λίγο περίεργος;!!! Ναι. Εδώ και αρκετά χρόνια ξέρουμε πολύ καλά πως τα πάντα γίνονται για τα παιχνίδια. Η πρώτη γλώσσα προγραμματισμού που έμαθα ήταν η BASIC μιας και έπαιζα με το αγαπημένο μου ZX Spectrum της εποχής, αλλά η δεύτερη ήταν η Assembly του για να μπορώ να σπάω τα παιχνίδια και να τους βάζω άπειρες ζωές κ.λ.π. Με παρόμοιο τρόπο ξεκίνησε και αυτή εδώ η ιστορία που καταλήγει στο παρών blog post· μόνο που αυτή τη φορά το παιχνίδι ήταν η δημοφιλής σειρά Angry Birds και ο τρόπος στο να μεταφέρουμε τα αστεράκια που έχουμε από το κινητό μας στο MK809.

Τα διάφορα προγράμματα για Backup ΔΕΝ ΛΕΙΤΟΥΡΓΟΥΝ!...

Αρχικά οι δοκιμές ήταν να μεταφέρουμε τα αστεράκια που με τόσο κόπο είχαμε κερδίσει όλα αυτά τα χρόνια που έχουμε λιώσει τις touchscreen των κινητών μας, με τη βοήθεια backup προγραμμάτων που υπάρχουν στο Google Play... Δεν υπήρξε καμιά επιτυχία σε αυτό. Τι να δοκιμάζουμε προγράμματα που κάνουν backup/restore στην κάρτα μνήμης... Τι να δοκιμάζουμε άλλα που δουλεύουν και μέσω dropbox... Τίποτα. Μόνο αποτυχίες.

Κάποια στιγμή, θυμήθηκα ότι παλιότερα μέσω του adb που εχει το Android Development Toolkit για το Eclipse, μπορούσα και έγραφα αρχεία μέσα στο κινητό μου ακόμα και αν δεν ήμουν root. Ψάχνοντας στο Internet βρήκαμε κάποιο blog post που περιγράφει μια τέτοια διαδικασία, οπότε ήμουν σίγουρος πως θα πετυχαίναμε το επιθυμητό αποτέλεσμα!...

ΜΚ809 USB Development Mode

Ήρθε η ώρα για το ψητό! Ας συνδέσουμε το MK809 στον υπολογιστή και να το δούμε από το adb του Android Development Toolkit. Τρέχουμε από ένα τερματικό την εντολή adb devices και... Πού είναι το ΜΚ809, οέωωω! Χμμμ... Κάτι δεν πάει καλά!

Μετά από αρκετή αναζήτηση στο internet, βρήκα ένα blog post που έλεγε πώς να κάνεις root το ΜΚ809, αλλά... Δεν δούλεψε... Ήταν για bugindows... Επίσης, περισσότερο έμοιαζε για άλλη έκδοση του MK80*, μιας και το blog post ανέφερε κάτι για μια πλαϊνή θύρα USB On-The-Go. Αυτή η θύρα δεν υπάρχει στο MK809.

Φυσικά το post μου έδωσε μερικές ιδέες μιας και ήταν κοντά στην πραγματικότητα. Μετά από μερικά lsusb και δοκιμές, βρήκα ότι το ΜΚ809 το έβλεπε ο υπολογιστής μου ότι συνδεόταν, το λειτουργούσε σαν USB Stick, αλλά developer mode δεν υπήρχε:

orion:/etc/udev # lsusb
Bus 001 Device 002: ID 0bda:0158 Realtek Semiconductor Corp. USB 2.0 multicard reader
Bus 002 Device 002: ID 5986:0130 Acer, Inc 
Bus 002 Device 027: ID 2207:0010  
Bus 003 Device 005: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Η τρίτη γραμμή του lsusb είναι που φαίνεται λίγο παράξενη. Αυτή είναι η γραμμή που προστίθεται όταν συνδέσουμε το MK809. Μετά από ώριμη (;) σκέψη καταλήγουμε στο ότι το σύστημα δεν έχει τον απαραίτητο driver για να το λειτουργήσει...

Η πραγματικότητα είναι ακόμα πιο περίεργη. Ψάχνοντας λίγο στο διαδίκτυο παρατήρησα ότι το RK3066 που είναι το ολοκληρωμένο που χρησιμοποιεί το MK809 δεν έχει κάτι ιδιαίτερο, εκτός του ότι είναι αρκετά νέο! Άρα, οι ήδη υπάρχοντες drivers θα μπορούσαν να το λειτουργήσουν μια χαρά, μόνο που ήταν αρκετά νέο device για να το αναγνωρίζουν!... Εδώ ξεκινάει ένα μικρό παιχνίδι με το udevd!

udevd rules για την αναγνώριση του ΜΚ809

Άντε να δούμε τι θα κάνουμε για να αναγνωρίσει το σύστημα το καινούργιο chip του MK809. Καταρχήν θα πρέπει να προσθέσουμε μια συνθήκη στο udevd που να αναγνωρίζει το USB Device με id 2207:0010. Στη διανομή openSUSE οι κανόνες του udevd βρίσκονται μέσα στον κατάλογο /etc/udev/rules.d/ κι εκεί θα πρέπει να προσθέσουμε το δικό μας. Επειδή η κάθε διανομή έχει τα δικά της, καλό θα είναι για μια άλλη διανομή να βρείτε πού υπάρχουν οι κανόνες και να κάνετε την προσθήκη σε εκείνο τον κατάλογο. Το αρχείο που θα φτιάξουμε είναι το 99-MK809-Android.rules:

eliaschr@orion:~>su
Password: 
orion:/home/eliaschr # cd /etc/udev/rules.d/
orion:/etc/udev/rules.d # vi 99-MK809-Android.rules

#
# udev rules file for MK809 Android TV Stick
#
# Added by me (eliaschr) so as to be able to use MK809 in development mode
# To use it, first enable "USB debugging" in "Developer options" (System Settings)
# and then in the "USB" tab (Device Settings) select "Connect to PC".
#
SUBSYSTEM=="usb", ATTR{idVendor}=="2207", ATTR{idProduct}=="0010", , MODE="0666", SYMLINK+="MK809_adb"

Σώστε το αρχείο και βγείτε από το vi. Φυσικά μπορείτε να χρησιμοποιήσετε όποιον editor θέλετε, ή ακόμα και μια γραμμή εντολής που να φτιάχνει το αρχείο, αρκεί το αποτέλεσμα να είναι το ίδιο.

ΕΝΗΜΕΡΩΣΗ: Σε ένα φίλο που έχει ένα κινητό Huaway Ideos3 έπρεπε να προσθέσουμε ακόμια μια γραμμή στο αρχείο του udev που μόλις δημιουργήσαμε για να μπορέσει το σύστημα να το διαβάσει:

SUBSYSTEM=="usb", ATTR{idVendor}=="12d1", ATTR{idProduct}=="1038", , MODE="0666", SYMLINK+="Ideos3_adb"

Το επόμενο βήμα είναι να πούμε στο adb να ψάχνει και αυτή τη συσκευή. Για να γίνει αυτό θα πρέπει να πειράξουμε το αρχείο adb_usb.ini που υπάρχει μέσα στον κατάλογο .android στο home directory του χρήστη μας:

eliaschr@orion:~> cd .android
eliaschr@orion:~/.android> vi adb_usb.ini

Εκεί προσθέτουμε μια γραμμή που περιέχει το:

0x2207

Σώστε το αρχείο και βγείτε από το vi. Μια σημείωση είναι πως αν είχαμε χρησιμοποιήσει πιο πριν το adb, τότε ο server του Android Development Toolkit θα τρέχει, που σημαίνει πως για να διαβάσει τις καινούργιες ρυθμίσεις του αρχείου που μόλις πειράξαμε θα πρέπει να τον ξαναξεκινήσουμε. Η εκκίνηση γίνεται από το πρόγραμμα adb. Απλά θα πρέπει εμείς να τον σκοτώσουμε. Αρκεί να εκτελέσουμε την ακόλουθη εντολή:

eliaschr@orion:~> adb kill-server

Το τελευταίο κομμάτι που πρέπει να γίνει είναι να υποχρεώσουμε το udevd να διαβάσει τους καινούργιους κανόνες:

eliaschr@orion:~>su
Password: 
orion:/home/eliaschr # udevadm control --reload-rules
orion:/home/eliaschr #

Στη συνέχεια συνδέουμε το MK809 με ένα καλώδιο micro USB στον υπολογιστή μας. Στα Settings, από την αριστερή μεριά, στο block SYSTEM επιλέγουμε το "{} Developer options". Στη δεξιά μεριά της οθόνης βλέπουμε όλες τις διαθέσιμες ρυθμίσεις. Αν είναι απενεργοποιημένες, τότε θα πρέπει να τις ενεργοποιήσουμε από τον διακόπτη πάνω και δεξιά στην οθόνη, γυρίζοντάς τον στο "ΟΝ". Από τις επιλογές ενεργοποιούμε τις δύο βασικές στο block "DEBUGGING", που είναι οι "USB debugging" και "Allow mock locations". Η επιλογή "Select debug app" δεν περιέχει κάποια επιλογή, αλλά αυτό δεν μας ενοχλεί.

Τέλος, από την αριστερή πλευρά της οθόνης των ρυθμίσεων επιλέγουμε το "USB" στο block "Device". Τότε στη δεξιά μεριά της οθόνης εμφανίζεται η μόνη επιλογή "Connect to PC". Μόλις την ενεργοποιήσουμε θα δούμε το MK809 να εμφανίζει στην οθόνη στο κάτω μέρος της το μήνυμα "USB debugging connected". Στον υπολογιστή μας θα δούμε ότι το adb έχει αναγνωρίσει το MK809 αν εκτελέσουμε την εντολή:

eliaschr@orion:~> adb devices
List of devices attached 
0123456789ABCDEF        device

eliaschr@orion:~> 

Μπορούμε, λοιπόν, να δουλέψουμε κανονικά το ΜΚ809 σε Developer Mode.

Bonus για τους αναγνώστες του άρθρου: Angry Birds - Τα scores μας!

Λίγες τεχνικές λεπτομέρειες

Η σειρά των παιχνιδιών Angry Birds έχει κάνει γερό πάταγο και δε νομίζω να υπάρχει κανένας που να μην έχει ασχοληθεί έστω και λίγο μαζί τους. Θα ξεκινήσουμε από μερικές μικρές λεπτομέρειες σχετικά με τα δεδομένα που μας ενδιαφέρουν.

Αυτή τη στιγμή υπάρχουν τα εξής παιχνίδια της εν λόγω σειράς:

  • Angry Birds
  • Angry Birds Seasons
  • Angry Birds Rio
  • Angry Birds Space
  • Angry Birds Star Wars

Φυσικά μιλάμε για τις δωρεάν εκδόσεις των παιχνιδιών. Το κάθε ένα από αυτά κρατάει κάποια στοιχεία που έχουν να κάνουν με τα scores των παικτών, κάποια settings κ.λ.π.

Τα directories που καταγράφονται οι πληροφορίες μέσα σε μια Android συσκευή, είναι:

  • Angry Birds: /data/data/com.rovio.angrybirds/
  • Angry Birds Seasons: /data/data/com.rovio.angrybirdsseasons/
  • Angry Birds Rio: /data/data/com.rovio.angrybirdsrio/
  • Angry Birds Space: /data/data/com.rovio.angrybirdsspace.ads/
  • Angry Birds Star Wars: /data/data/com.rovio.angrybirdsstarwars.ads.iap/

Μέσα εκεί υπάρχει ένας υποκατάλογος με ονομασία files κι εκεί περιέχονται τα δεδομένα που μας ενδιαφέρουν. Σε γενικές γραμμές τα δύο βασικά αρχεία είναι τα highscores.lua και settings.lua. Επιπλέον, τα Angry Birds Space και Angry Birds Star Wars έχουν άλλα τρία αρχεία: eaglepurchases.lua, episodepurchases.lua και gamepurchases.lua. Αυτά είναι τα αρχεία που θα πρέπει να μεταφέρουμε από τη μια συσκευή στην άλλη, προκειμένου να διατηρήσουμε τα highscores μας.

Μεταφορά αρχείων με το adb

Αρχικά συνδέουμε τη συσκευή η οποία περιέχει τα scores που θέλουμε να μεταφέρουμε. Είναι η συσκευή που έχουμε περάσει ατελείωτες ώρες, παίζοντας, βρίζοντας κ.λ.π. μέχρι να γεμίσουμε τα πάντα με τρία αστεράκια :)

Όταν τη συνδέσουμε εκτελούμε τις ακόλουθες εντολές:

eliaschr@orion:~> mkdir AngryBirdsBackup
eliaschr@orion:~> mkdir AngryBirdsBackup/ab/
eliaschr@orion:~> mkdir AngryBirdsBackup/abs/
eliaschr@orion:~> mkdir AngryBirdsBackup/abr/
eliaschr@orion:~> mkdir AngryBirdsBackup/absp/
eliaschr@orion:~> mkdir AngryBirdsBackup/absw/

Με αυτές δημιουργήσαμε ένα directory για κάθε παιχνίδι, που θα κρατήσει τα ευαίσθητα δεδομένα μας :). Ήρθε η ώρα να μεταφέρουμε τα αρχεία από τη συσκευή στον υπολογιστή μας:

eliaschr@orion:~> cd AngryBirdsBackup/
eliaschr@orion:~/AngryBirdsBackup> #
eliaschr@orion:~/AngryBirdsBackup> # Get Angry Birds files
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirds/files/highscores.lua ab/
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirds/files/settings.lua ab/
eliaschr@orion:~/AngryBirdsBackup> #
eliaschr@orion:~/AngryBirdsBackup> # Get Angry Birds Season files
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsseasons/files/highscores.lua abs/
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsseasons/files/settings.lua abs/
eliaschr@orion:~/AngryBirdsBackup> #
eliaschr@orion:~/AngryBirdsBackup> # Get Angry Birds Rio files
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsrio/files/highscores.lua abr/
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsrio/files/settings.lua abr/
eliaschr@orion:~/AngryBirdsBackup> #
eliaschr@orion:~/AngryBirdsBackup> # Get Angry Birds Space files
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsspace.ads/files/highscores.lua absp/
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsspace.ads/files/settings.lua absp/
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsspace.ads/files/episodepurchases.lua absp/
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsspace.ads/files/gamepurchases.lua absp/
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsspace.ads/files/eaglepurchases.lua absp/
eliaschr@orion:~/AngryBirdsBackup> #
eliaschr@orion:~/AngryBirdsBackup> # Get Angry Birds Star Wars files
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsstarwars.ads.iap/files/highscores.lua absw/
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsstarwars.ads.iap/files/settings.lua absw/
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsstarwars.ads.iap/files/episodepurchases.lua absw/
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsstarwars.ads.iap/files/gamepurchases.lua absw/
eliaschr@orion:~/AngryBirdsBackup> adb pull /data/data/com.rovio.angrybirdsstarwars.ads.iap/files/eaglepurchases.lua absw/

Αυτά θα αντιγράψουν τα απαραίτητα αρχεία στον υπολογιστή μας. Υπενθυμίζουμε ότι δεν χρειάζεται να είμαστε root για να γίνουν οι αντιγραφές.

Αποσυνδέουμε τη συσκευή μας και συνδέουμε το MK809. Αρχικά θα πρέπει να εγκαταστησουμε τα παιχνίδια Angry Birds που μας ενδιαφέρουν. Είναι απαραίτητη προϋπόθεση να παίξουμε τουλάχιστον μια πίστα σε κάθε ένα, για να δημιουργηθεί η δομή των φακέλων όπως ακριβώς χρειάζεται. Αν δεν γίνει αυτό δε θα μπορέσουμε να αντιγράψουμε τα αρχεία με τα scores μας!.

Ενεργοποιούμε το Connect to PC (προϋπόθεση φυσικά είναι να έχουμε κάνει και τα υπόλοιπα βήματα για να μπορέσουμε να λειτουργήσουμε το MK809 από το adb). Αφού ο υπολογιστής μας το δει εκτελούμε τις αντίθετες αντιγραφές για να μεταφέρουμε τα αρχεία που βρίσκονται στον υπολογιστή μας μέσα στο MK809:

eliaschr@orion:~/AngryBirdsBackup> #
eliaschr@orion:~/AngryBirdsBackup> # Save Angry Birds files
eliaschr@orion:~/AngryBirdsBackup> adb push ab/highscores.lua /data/data/com.rovio.angrybirds/files/
eliaschr@orion:~/AngryBirdsBackup> adb push ab/settings.lua /data/data/com.rovio.angrybirds/files/
eliaschr@orion:~/AngryBirdsBackup> #
eliaschr@orion:~/AngryBirdsBackup> # Save Angry Birds Season files
eliaschr@orion:~/AngryBirdsBackup> adb push abs/highscores.lua /data/data/com.rovio.angrybirdsseasons/files/
eliaschr@orion:~/AngryBirdsBackup> adb push abs/settings.lua /data/data/com.rovio.angrybirdsseasons/files/
eliaschr@orion:~/AngryBirdsBackup> #
eliaschr@orion:~/AngryBirdsBackup> # Save Angry Birds Rio files
eliaschr@orion:~/AngryBirdsBackup> adb push abr/highscores.lua /data/data/com.rovio.angrybirdsrio/files/
eliaschr@orion:~/AngryBirdsBackup> adb push abr/settings.lua /data/data/com.rovio.angrybirdsrio/files/
eliaschr@orion:~/AngryBirdsBackup> #
eliaschr@orion:~/AngryBirdsBackup> # Save Angry Birds Space files
eliaschr@orion:~/AngryBirdsBackup> adb push absp/highscores.lua /data/data/com.rovio.angrybirdsspace.ads/files/
eliaschr@orion:~/AngryBirdsBackup> adb push absp/settings.lua /data/data/com.rovio.angrybirdsspace.ads/files/
eliaschr@orion:~/AngryBirdsBackup> adb push absp/episodepurchases.lua /data/data/com.rovio.angrybirdsspace.ads/files/
eliaschr@orion:~/AngryBirdsBackup> adb push absp/gamepurchases.lua /data/data/com.rovio.angrybirdsspace.ads/files/
eliaschr@orion:~/AngryBirdsBackup> adb push absp/eaglepurchases.lua /data/data/com.rovio.angrybirdsspace.ads/files/
eliaschr@orion:~/AngryBirdsBackup> #
eliaschr@orion:~/AngryBirdsBackup> # Save Angry Birds Star Wars files
eliaschr@orion:~/AngryBirdsBackup> adb push absw/highscores.lua /data/data/com.rovio.angrybirdsstarwars.ads.iap/files/
eliaschr@orion:~/AngryBirdsBackup> adb push absw/settings.lua /data/data/com.rovio.angrybirdsstarwars.ads.iap/files/
eliaschr@orion:~/AngryBirdsBackup> adb push absw/episodepurchases.lua /data/data/com.rovio.angrybirdsstarwars.ads.iap/files/
eliaschr@orion:~/AngryBirdsBackup> adb push absw/gamepurchases.lua /data/data/com.rovio.angrybirdsstarwars.ads.iap/files/
eliaschr@orion:~/AngryBirdsBackup> adb push absw/eaglepurchases.lua /data/data/com.rovio.angrybirdsstarwars.ads.iap/files/

Μετά από αυτές τις εντολές, μπορείτε πλέον να κλείσετε το Connect to PC από το MK809 και να το αποσυνδέσετε. Τρέξτε τα αγαπημένα σας παιχνίδια και απολαύστε όλα τα αστέρια που είχατε κερδίσει από πριν, σε ατελείωτες ώρες παιχνιδιού και κατάρων :)

Χρυσοχέρης Ηλίας

1 σχόλιο: