Skip to content
Archive of posts filed under the Android category.

Tethering dallo smartphone, ecco come gli operatori telefonici possono scoprirlo

Molte delle promozioni per la navigazione web dal proporio smartphone precisano che l’accesso ad Internet e’ consentito *solo dal device*, e non attaccando il device ad un computer attraverso il tethering (wifi o usb). Mi sono sempre chiesto come facessero i carrier a capire quando stavo navigando nell’uno o nell’altro modo, e grazie a questo commento a questo post ho avuto la risposta, almeno per Android:

The built-in tether support acts as a WiFi hotspot and router. This does a USB tether, and acts as a network proxy. Very different.

The biggest difference, from the carrier’s end, is that routing is pretty easy to detect; each packet that goes through the router, the time-to-live (TTL) field in the IPv4 header is decremented. In addition, there is NAT going on, and there are heuristics to detect that. There are ways around this using Linux’s iptables that can masquerade the routing/NAT, but I’m unaware of any mainstream implementations of this on Android, and it would require root. This app doesn’t; I’m like 90% sure it’s all done over ADB (Android Debug Bridge), which every Android device supports.

With the USB tether acting as a network proxy, there is simply no routing/NAT going on, so there is no way for the carrier to detect what’s going on. It just appears to be data coming from the phone.

Ottimo, penso anche che il meccanismo sia estendibile anche ad altre piattaforme, non si finisce mai di imparare dai commenti! Prossima mossa, vedere se veramente il tethering USB non viene scoperto dai carrier.

Aggiornamento manuale del Nexus S ad Ice Cream Sandwich

Aggiornare il proprio Nexus S al nuovo Android Ice Cream Sandwich e’ ormai solo una questione di pazienza, dato che l’update via OTA e’ in arrivo in questi giorni. Il problema e’ che, se come me avete installato una custom ROM (MIUI, Cyanogenmod o altre), l’aggiornamento via OTA non arrivera’ mai.

Situazione che si puo’ risolvere facilmente, dato che e’ sempre possibile aggiornare manualmente alla ROM ICS ufficiale, ora che sono disponibili.

La guida di partenza che ho usato per fare l’aggiornamento e’ stato questa. Ho scaricato l’ultima ROM 4.0.3 dal link fornito (il file ZD3PyN0t.zip), l’ho copiato nel dispositivo sotto la cartella principale della SD card rinominandolo in update.zip, poi ho spento il device, l’ho riavviato premendo volume up + power in modo da far partire il bootloader, ho selezionato il recovery (nel mio caso il Clockworld Manager, ma funziona anche con quello standard), ho fatto un bel wipe di dati e della cache e ho installato il file update.zip. Un nuovo reboot e voila’, ICS anche sul mio smartphone!

Altra cosa che ho ripristinato e’ stato l’accesso come root al dispositivo. La procedura e’ ben descritta qui, e che contiene l’hack per ottenerli. Il problema e’ che non mi funzionava piu’ il ClockWorld Manager: nel sito con tutte le versioni e’ ancora disponibile la 5.0.2.0, che pero’ a me non partiva dal bootloader. Ho dovuto prendere l’ultimissima versione “non ufficiale” 5.0.2.3 e, installata, il recovery ha ripreso ad andare. Anche in questo post il problema sembra essere conosciuto.

Nello sfortunato caso di brick del Nexus S (non parte piu’ niente), si puo’ sempre tentare un ripristino a basso livello con Odin, come spiegato da questa e da questa guida, ma funzionera’ solo con Windows

Ovviamente anche le ROM custom non sono rimaste a guardare e se Cyanogenmod ha rilasciato una versione di Android Ice Cream Sandwich qualche settimana prima di quella ufficiale, dal canto suo la MIUI ha portato ICS sulla sua versione per Nexus S. Il supporto ad altri dispositivi e’ atteso a breve. Per ora, da quello che ho visto, non ci sono sostanziali differenze rispetto alle ROM stock, quindi ho installato quest’ultima e poi vedro’ se e dove orientarmi.

Infine, per i piu’ curiosi, la lista completa delle ROM e degli update per tutti i modelli di Nexus S.

 

Kindle Fire, Ubuntu Linux, ADB e Cyanogenmod

Appena avuto tra le mani un Kidle Fire, da sviluppatore Android, ho cercato di capire come installare applicazioni NON provenienti dall’Amazon AppStore: ecco i passi necessari.

Di default il Fire non viene neanche rilevato da ADB, quindi occorre forzare il bridge tramite un semplice file di configurazione da modificare sul proprio pc, come spiegato qui.

  • Aprire il file ~/.android/adb_usb.ini e aggiungere la stringa “0x1949″ alla fine del file (senza le virgolette)
  • Riavviare l’adb server, magari tramite il comando adb kill-server
  • Lanciando il comando adb devices ora dovrebbe essere possibile vedere un nuovo device, anche se con il classico problema dei ??????????

La soluzione e’ facile, basta aggiungere queste righe al file /etc/udev/rules.d/51-android.rules:

#Amazon Kindle Fire
SUBSYSTEM==”usb”, SYSFS{idVendor}==”1949″, MODE=”0666″

Dove ox1949 e’, appunto, il manufacturer id. Bene, l’USB Debugging e’ ora abilitato e funzionante.

Per installare applicazioni non provenienti dall’Amazon AppStore, basta andare nei Settings (la rotellina vicino all’orologio), poi More, Device, e abilitare Allow Installation of Application From Unknown sources. Ora un semplice adb install nome_file_app.apk funzionera’ senza fare una piega.

Passiamo a qualche personalizzazione piu’ dura, tipo installare la CyanogenMod 7 sul Fire. Gli smanettoni di xda-developers stanno gia’ elaborando una ROM ad hoc per il dispositivo. Buoni tentativi ;)

Video dell’intervento “Sopravvivere a due anni di sviluppo con Android”

Ecco i video dell’intervento che ho fatto il 22 Novembre al GTUG Milano, dove ho condiviso con i partecipanti alcuni consigli utili imparati dopo piu’ di due anni di sviluppo per piattaforma Android.

Continue reading ‘Video dell’intervento “Sopravvivere a due anni di sviluppo con Android”’ »

Sopravvivere felice a 2 anni di sviluppo Android

I tips’nd tricks che ho imparato dopo 2 anni di sviluppo su Android.

(24 Novembre 2011, GTUG Milano)

Verificare che i permessi siano stati aggiunti nell’AndroidManifest.xml

Se si sviluppa una libreria, si potrebbe voler essere certi che tutti i permessi necessari al suo funzionamento siano stati aggiunti all’AndroidManifest.xml, invece che sperare che chi la utilizzera’ si ricordi di farlo.

Esiste un modo per avere questa certezza, grazie a questo codice:

private void verifyPermission(Context c, String permission) {
  int p = c.getPackageManager().checkPermission(permission, c.getPackageName());
  if(p == PackageManager.PERMISSION_DENIED) {
    throw new RuntimeException("ImageLoader : please add the permission " + permission + " to the manifest");
  }
}

Magari da richiarame nel momento in cui si crea il servizio/i messi a disposizione:

verifyPermission(c, Manifest.permission.WRITE_EXTERNAL_STORAGE);
verifyPermission(c, Manifest.permission.INTERNET);

Come installare Cyanogenmod, MIUI o una custom rom sul Nexus One

Installare un sistema operativo personalizzato al posto di quello standard presente sul proprio smartphone e’ una pratica consolidata. Gia’ con Symbian era prassi comune quella di eliminare la versione customizzata che l’operatore telefonico installava nel telefono, spesso con crapware e limitazioni varie, per usarne una “stock”, ovvero pulita, spesso piu’ aggiornata, piu’ leggera e senza vincoli. Con Windows Mobile c’e’ stata un’esplosione di questa pratica e le ROM coocked create dalla comunita’ erano spesso di gran lunga migliori di quelle standard: parecchi bugfix, driver e sistemi operativi aggiornati, utility precaricate per risparmiare spazio, Erano insomma capaci di prolungare la vita di un device di un anno o piu’. Dopotutto intendiamoci, i produttori di dispositivi non hanno interesse a rilasciare versioni aggiornate del firmare dei propri prodotti, preferiscono che si buttino via e si ricomprino nuovi con quanto di nuovo c’e’ sul mercato.

Android, ovviamente, non fa differenza. Unica controindicazione di questo processo di customizzazione della ROM e’ la perdita della garanzia, ma si puo’ sempre ripristinare quella originale ;)

Considerazione finale dopo aver sperimentato per un paio di giorni tutto: ma come ho fatto ad aspettare cosi’ tanto tempo prima di usarle sul mio Nexus One!

 

I passi da seguire per un Nexus One

Ovviamente ogni telefono ha una sua sequenza di comandi per essere sbloccato e personalizzato, di seguito quelli per il mio Nexus One:

  • Sbloccare il bootloader del device per poter installare una nuova recovery image, al posto di quella standard (si usa fastboot).
  • Installare una Custom Recovery Image che permettera’, tra le altre cose, di installare delle ROM personalizzate (ClockWorld Mod).
  • Tramite la Custom Recovery Image, fare un salvataggio del sistema e poi caricare la nuova ROM personalizzata.
  • Installazioni aggiuntive.

Purtroppo, la prima volta che si esegue questo processo, tutti i settaggi delle app saranno irrimediabilmente persi. Quindi addio punti nei giochi, impostazioni di programmi e tutto quello che non viene salvato nativamente nel cloud o sulla SD dalle singole applicazioni. Le volte successive, grazie all’accesso root al dispositivo e ai tool di backup esistenti, questo problema sara’ solo un brutto ricordo. Ragione in piu’ per fare il prima possibile lo sblocco, anche solo per avere un salvataggio completo di tutto, in caso di perdita del device.

 

Sbloccare il bootloader ed installare Fastboot

Una volta il comando fastboot era installato nell’Android SDK, poi e’ stato tolto. Qui si puo’ trovare un eseguibile multipiattaforma: e questa e’ la procedura dettagliata per sbloccare il boot del device.

  • Scaricare i pacchetti del fastboot per linux e copiati nella directory platform-tools dell’sdk Android
  • Boot del device nel bootloader (premere il trackpad e accendere il dispositivo). Apparira’ uno schermo con dei robottini Android su uno skate.
  • Controllare che in alto a sinistra ci sia la scritta S-OFF, che indica il security off del dispositivo, quindi la possibilita’ di sbloccarlo
  • Controllare che sia selezionato FASTBOOT e non HBOOT nelle voci del menu’
  • Connettere il device via USB al computer
  • Lanciare, dal computer, il comando fastboot devices e controllare che il proprio device sia elencato
  • Lanciare, dal computer, il comando fastboot oem unlock e confermare l’unlock del device

Tutti i dati saranno cancellati e il device verra’ riavviato. Per controllare se e’ effettivamente stato sbloccato, avviare nuovamente il bootloader e questa volta, in altro, dovrebbe apparire la scritta *** UNLOCKED ***

 

Installare una Custom Recovery Image

Compito della Custom Recovery Image e’ quello di installare custom rom, salvare dati, partizionare sd card, cancellare dati, resettare impostazioni particolari di sistema e molto altro. Ci sono diversi programmi molto usati e che fungono bene allo scopo, io ho scelto ClockWorldMod Recovery, ecco spiegato cos’e’. Per installarlo, ho seguito questi passi qui, che comprendono anche il link per il download del file img. In alternativa, c’e’ anche Amon-Ra’s

  • Scaricato il file img nel computer
  • Boot del device nel bootloader
  • Connettere il device via USB al computer
  • Lanciare il comando fastboot flash recovery /path/to/recovery-clockwork-3.0.0.5-passion.img
  • Riavviare il device. La Custom Recovery Image e’ presente ed operativa.

Ovviamente esiste una versione piu’ nuova della 3.0.0.5, dopo l’installazione della custom rom ci sono le istruzioni per aggiornarla.

 

Backup del sistema operativo, conosciuto anche come Nandroid backup, e installare di una custom ROM

Prima di installare una qualunque custom rom, e’ buona cosa fare un backup dell’intero sistema operativo, che servira’ anche nel caso in cui le cose vadano storte e il device non si riavvii piu’, ad esempio a a causa di una rom sbagliata, un errore nella sd che ha corrotto il file ecc. Inoltre e’ l’immagine che va rimessa sul dispositivo in caso di invio in assistenza (assieme all’esecuzione del comando fastboot oem lock per ribloccare il bootloader e riportarlo allo stadio originale). Conosciuto anche come Nadroid backup, ecco i passi che ho seguito:

  • Fare il reboot in recovery mode: lanciare il bootloader, scegliere recovery, oppure, con il device connesso via usb, lanciare il comando adb reboot recovery.
  • Scegliere la voce di menu’ Backup and Restore
  • Lanciare in backup e aspettare un paio di minuti
  • Per il restore, stessa procedura, ma selezionando restore invece di backup, e l’immagine da ripristinare (tramite data e ora del backup fatto)

 

Installazione di una Custom ROM

Ovviamente esistono tantissime custom rom, sia in base al device, sia in base all’orientamento che viene dato alla rom (performance, cool&stylish, funzionalita’ ecc). Personalmente, e per un Nexus One, ritengo che ci siano tre grandi alternative: installare una rom stock, una Cyanogenmod o una MIUI. Consiglio la prima scelta a chi usa il device per sviluppare e testare le proprie applicazioini, ma non vuole perdere i benefici di essere root: le rom customizzate, infatti, sono molto diverse da quella originale, quindi potrebbero anche avere dei comportamenti inattesi / fuori dagli standard che potrebbero pregiudicare il buon esito dei test di funzionamento. La Cyanogenmod, invece, e’ tipicamente per gli smanettoni: tantissimi settaggi, ottimizzazioni alle stelle e velocita’ da urlo. MIUI, infine, e’ esteticamente qualcosa di unico ed offre applicazioni di gran lunga migliori di quelle standard (player musicale, rubrica dei contatti, backup integrato ecc). A voi la scelta. Io le sto provando entrambe e, per ora, la MIUI mi ha conquistato. Seguiranno post piu’ dettagliati.

A prescindere dal tipo di rom i passi sono molto simili, ecco quelli che ho seguito io per la Cyanogenmob, secondo la guida ufficiale.

  • Scaricare nel computer il file della custom rom, prendendola dal sito o scaricandola con qualche app direttamente dal device. E’ un file zip, che va copiato nella propria SD (dove si vuole, io ho creato la cartella /roms e le metto li sotto). Io ho preso la versione stable da qui.
  • Nel caso di una Cyanogenmod, se si vogliono anche le Google Apps (Market, GMail ecc), occorre scaricare l’apposito pacchetto.
  • Fare il reboot in recovery mode: lanciare il bootloader, scegliere recovery, oppure, con il device connesso via usb, lanciare il comando adb reboot recovery.
  • Selezionare un Wipe data/factory reset e poi Wipe data/Cache partition: questo cancellera’ tutti i dati presenti, ma e’ fondamentale farlo quando si installa una nuova tipologia di ROM, non sempre richiesto quando si passa ad un nuova versione di rom della stessa famiglia.
  • Selezionare Install zip from sd card e poi Choose zip from sdcard e navigare fino a scegliere il file scaricato con la rom in precedenza
  • Ripetere il precedente passo, ma con il file delle Google Apps
  • Riavviare il sistema dall’apposito’ menu.
  • Let’s the magic happens! La ROM e’ pronta all’uso.

 

Continue reading ‘Come installare Cyanogenmod, MIUI o una custom rom sul Nexus One’ »

NavigationBar in style iPhone UITabBarController per Android

Nel porting di applicazioni iOS su piattaforma Android, ci sono casi in cui si vuole necessariamente una barra di navigazione nella parte bassa dello schermo, come quella presente in molte applicazioni iPhone/iPad.

Ci sono diversi approcci che si possono seguire. Usare una libreria che rende anche possibile lo scrolling dei bottoni, un controllo personalizzato e gestito tutto via codice, dei TabHost con dei TabWidget, oppure inventarsi altro per gestire anche i Fragment.

Invece io voglio ottenere lo stesso risultato con la massima flessibilita’ possibile, quindi usando solo controlli standard e semplici, al massimo personalizzandone lo stile. Quindi il componente principale della navigationbar sara’ un RadioGroup, all’interno del quale ogni elemento RadioButton rappresentera’ un pulsante. Un diffuso uso di StateListDrawable rendera’ coerente l’aspetto grafico.

Di seguito il layout dell’activity principale, quella che conterra’ la navigation bar: res/layout/actnavbar.xml

< ?xml version="1.0" encoding="utf-8"?>
 
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="@android:color/white"
>
  <radiogroup android:layout_width="fill_parent"
    android:layout_height="60dp"
    android:layout_alignParentBottom="true"
    android:orientation="horizontal"
    android:background="@drawable/navbar_background"
  >
    <radiobutton android:id="@+id/btnAll"
      style="@style/navbar_button"
      android:drawableTop="@drawable/navbar_allselector"
      android:text="All"></radiobutton>
    <radiobutton android:id="@+id/btnPicture"
      style="@style/navbar_button"
      android:drawableTop="@drawable/navbar_pictureselector"
      android:text="Pictures"
      android:layout_marginLeft="5dp"></radiobutton>
    <radiobutton android:id="@+id/btnVideo"
      style="@style/navbar_button"
      android:drawableTop="@drawable/navbar_videoselector"
      android:text="Videos"
      android:layout_marginLeft="5dp"></radiobutton>
    <radiobutton android:id="@+id/btnFile"
      style="@style/navbar_button"
      android:drawableTop="@drawable/navbar_fileselector"
      android:text="Files"
      android:layout_marginLeft="5dp"></radiobutton>
    </radiogroup>
</relativelayout>

Continue reading ‘NavigationBar in style iPhone UITabBarController per Android’ »

Tutto il testing possibile per Android al BetterSoftware 2011

Ecco la registrazione del mio intervento “Tutto il testing possibile per Android”, che ho tenuto durante il BetterSoftware a Firenze. Purtroppo 20 minuti per il mio intervento sono stati veramente pochi (ne avevo chiesti il doppio), quindi mi sono dovuto adattare con quello che avevo, tagliando e accorciando come un forsennato. Scusatemi :(

Qui il link diretto al file video, mentre di seguito le slide.

Conflitti nella UX delle Google Android App

Magari ingenuamente, uno si puo’ anche aspettare che le applicazioni fatte da Google per Android seguano una UX comune e, tra loro, abbiano una buona coerenza nell’interfaccia. E invece ecco cosa capita oggigiorno.

Google ShopperGoogle Shopper: spunta una Navigation Bar in basso, in pieno stile iPhone TabBar, mai vista in altre app Google.

Google MusicGoogle Music: Nel secondo screenshot il menu’ contestuale dell’elemento e’ completamente diverso da come appare nei contatti e da come avevano caldamente consigliato al Google IO del 2010. L’Action Bar e’ assente e spunta una Navigation Bar in alto, a scorrimento orizzontale, che ricorda molto l’interfaccia Panorama di WP7, dove per indicare che c’e’ qualcosa a destra e a sinistra si lascia, appunto, troncato il titolo di quello che c’e’ ai lati.

GooglePlusGoogle+ utilizza l’Action Bar, mentre la Navigation Bar appena sotto e’ molto diversa da quanto visto fino ad oggi. Difficile da leggere e da navigare al tocco, conta comunque sullo swipe delle schermate verso destra e verso sinistra, indicando con delle freccine che ci sono ancora contenuti ai quali accedere ai lati della vista su cui si e’ focalizzati.

Continue reading ‘Conflitti nella UX delle Google Android App’ »