lunedì 8 ottobre 2012

Endomondo - Bad Workout Synchronization

Qui si parla di un problema noto tra app e sito di Endomondo, se conosci già il problema e vuoi conoscere solo le possibili soluzione, puoi passare direttamente a: Le possibili "pezze" al problema

Il problema

Le ultime versioni di Endomondo per Android (vale anche per la versione free) o forse del sito, hanno un bug che raramente appare, ma è comunque fastidiosissimo: in modalità live ed in particolari condizioni di connettività del telefono, i dati grezzi inviati sul sito possono essere a volte incompleti.
Questo problema si evidenzia soltanto quando si ispeziona il tracciato sul sito, dove l'allenamento può apparire troncato in alcuni punti, come in questo caso:
Un allenamento corrotto così come appare sul sito.
La linea verde è stata aggiunta per mostrare i dati così come appaiono sullo smartphone
La linea verde mostra come il tracciato appare invece nell'applicazione sullo smartphone , dove tutti i dati sono completi ed appaiono correttamente.
Da notare che il problema sembra comparire solo quando il caricamento dei dati grezzi avviene in modalità live, mentre se si effettua l'allenamento privi di connettività dati e poi si accende solo successivamente, la sincronizzazione tra app e sito avviene in maniera completa.

La sincronizzazione a 2 vie

Fino alla versione 7.1.3, Endomondo consentiva di scegliere se fare l'upload sul sito manualmente o automaticamente e questo ci avrebbe potuto consentire di evitare il problema.
Dalla versione  7.1.3 in avanti però, la sincronizzazione della storia degli allenamenti avviene automaticamente tra sito e app:
se si elimina/importa un workout dal sito, questo verrà anche eliminato/importato dall'app e viceversa se si elimina/importa un workout sull'app, questo viene automaticamente eliminato/importato sul sito.
La sincronizzazione automatica consente di non preoccuparsi più di dover fare un backup fisico dei dati per paura che il cell finisca sotto un tir o ce lo rubino o faccia un'altra brutta fine: Installando su un altro terminale l'app ed inserendo i nostri dati di login, ci ritroveremmo automaticamente scaricati sull'app gli ultimi allenamenti con possibilità di caricare anche i precedenti.
Questa nuova caratteristica è ottima, ma comunque una bomba a tempo per gli allenamenti incorsi nel succitato bug: se infatti si lascia passare troppo tempo o per qualche motivo si svuotano i dati dell'applicazione sullo smartphone, alla successiva sincronizzazione vengono scaricati i dati corrotti provenienti dal sito, perdendo per sempre le rilevazioni corrette. Angoscia!

Le possibili "pezze" al problema

  1. disabilitare la connettività dati dall'inizio alla fine dell'allenamento: per un motivo o per l'altro non sempre è possibile o conveniente farlo
  2. correggere il tracciato sul sito: eliminando il percorso "troncato" e reimportandolo corretto. E' un metodo un pelo più lungo, ma più sicuro per i dati sul cell perchè non richiede di modificare dati interni all'app. Difficilmente distruggeremo la nostra storia di allenamenti con questo metodo
  3. forzare il reupload: questo metodo dovrebbe essere più veloce, ma pericoloso per i vostri dati perchè dovrete modificare dati interni all'app. Il condizionale è d'obbligo perché non l'ho provato, ma ha ragione di funzionare perchè in versioni passate si poteva procedere analogamente
Sia la soluzione 2 che la 3 richiedono l'accesso ai dati dell'applicazione presi dal cell, quindi eccoti un bel

DISCLAIMER

Se non sei conosci bene Android, i file system e sql, le soluzioni che stai per leggere sono pericolose per lo stato di integrità della history di Endomondo e per la salute del sw sul tuo smartphone. Insomma: se lo fai, lo fai a tuo esclusivo rischio e pericolo.

Accesso ai dati di Endomondo 

Passo comune ad entrambe le procedure 2 e 3, per accedere ai dati di Endomondo, devi avere i permessi di Root sul tuo cellulare. Se hai una versione antecedente alla 7.1.3 puoi provare Un'alternativa a Titanium Backup, che non richiede tali permessi.
  1. avviare un'applicazione tipo TitaniumBackup e scegliere di fare il backup di Endomondo.
  2. accedere al tar.gz contenente i dati backuppati dall'app.
    Nel caso si sia scelto di usare TitaniumBackup si troveranno in un file con un nome simile a:
    /sdcard/TitaniumBackup/com.endomondo.android.pro.########.tar.gz
  3. Ora che avete un backup dei dati dell'app, potete eliminare dal sito il workout bacato.
Dentro al tar.gz, al percorso data/data/com.endomondo.android.pro dovreste trovare un file che si chiama: EndomondoDatabase; è un DB sqlite contenente tutti i dati grezzi dei nostri workout, compresi stato di sincronizzazione ed impostazioni dell'applicazione.

Apriamo il database con il nostro editor sqlite preferito. (Per esempio sqlitebrowser
Identifichiamo l'id del workout che dobbiamo reimportare tramite la seguente query, che ordina i workout in base all'ora di partenza (decrescente)
SELECT datetime(starttime/1000,"unixepoch"),workoutid
FROM  workout
ORDER BY starttime desc;
Adesso scegliete, estrarre e reimportare il workout oppure provare a forzare il re-upload.

Alternativa 2: reimportare il workout

Copiamo il workoutid dell'allenamento che ci interessa e personalizziamo ed eseguiamo questo script sql . Attenzione ai segnaposto da configurare con i vostri dati:


SEGNAPOSTOESEMPIO
$VOSTRO_NOMEMauro Panzeri
$VOSTRO_NOME_EMAILpippiripettenusa82
$VOSTRO_PROVIDER_EMAILyahoo.com
$WORKOUTID_DA_MODIFICARE-2635504723790210243
$NOME_PERCORSOtrail monte bianco
$NOME_SPORTRUNNING
Una volta configurato ed eseguito lo script, copiamo tutte le righe del risultato in un file WORKOUT.gpx
Verifichiamo il gpx con un programma tipo RouteConverter o un altro (ne trovate vari menzionati qui)
Se il nostro workout sembra preciso come l'ha registrato lo smartphone, il file è adesso pronto per essere reimportato sul sito di Endomondo.

Alternativa 3: !!!UNTESTED!!! forzare  il re-upload

AVVERTENZE

  1. Dato che io dovevo fare altre modifiche marginali al tracciato, ho adottato la Alternativa 2.
  2. Spegnete la connettività dati del cellulare fino al termine della procedura
  3. Vi conviene farvi un backup del database che state modificando, nel caso qualcosa vada storto.
  4. se avete già seguito l'alternativa 2, prima di procedere ricordatevi di eliminare il workout importato sul sito
Modifichiamo lo stato in cui l'app ritiene che sia la sincronizzazione del workout:
UPDATE workout
SET 
uploadStatus=0
lastUpload=-1
authToken=null
WHERE workoutid=$WORKOUTID_DA_MODIFICARE;
COMMIT;
Reimpacchettiamo il tar.gz, rimettiamolo al suo posto nella cartella di TitaniumBackup e procediamo al restore dei dati dell'applicazione.
Avviando l'applicazione in presenza di connessione dati, l'app ora dovrebbe risincronizzare il workout con il server di Endomondo.

[APPENDICE A] Un'alternativa a Titanium Backup

TitaniumBackup richiede i permessi di root, ma fino alla versione 7.1.3 dell'app, esisteva un altro metodo per l'export e l'import del db di Endomondo che non richiedeva tali permessi:

Effettuare le seguenti operazioni per effettuare una copia del database:

  1. Avviare l'applicazione Endomondo (con tutti i dati)
  2. Vai a Impostazioni> utente e fare clic su Login e-mail con Login
  3. Nel campo e-mail: copydb, e nel tipo di campo password: Endomondo
  4. Ora il database saranno copiati sulla scheda SD
Per ripristinare il database:
  1. Avviare l'applicazione Endomondo (l'applicazione che si desidera copiare il database)
  2. Accesso con e-mail: restoredb, password: Endomondo
  3. Ora il database verrà ripristinato ed è visibile nella lista Storia (OBS: questo avrà la precedenza il database esistente di app)

[APPENDICE B] Struttura del DB (Endomondo Pro 8.2.0)

  • workout: contiene gli allenamenti
    • workoutid: id dell'allenamento. intero casuale
    • starttime/end_time: sono timestamp unix * 1000.
      Si possono leggere con la funzione datetime di sqlite:
      datetime(starttime/1000,'unixepoch')
    • sport: 
      • 0=RUNNING
      • 1=CYCLING_TRANSPORTATION
      • 16=HIKING
      • 18=WALKING
      • ...gli altri non li conosco
    • status: ???
    • authToken: coinvolto nell'upload. sarà il token di login.
    • upLoadStatus:
      • 0: non ancora sincronizzato
      • 2: completamente sincronizzato
    • lastUpload: Identifica un tpid probabilmente usato in modalità live per capire quali punti sono già stati caricati.  -1 se non è stato ancora sincronizzato nessun punto.
  • trackpoint
    • tpid: id di un punto GPS dell'allenamento
    • workoutid: chiave esterna della tabella workout
    • instruction
      • 2: partenza allenamento
      • 4: punto intermedio GPS
      • 0: pausa
      • 3: stop

CONCLUSIONI

Io ho adottato l'alternativa 2, perché dovevo fare alcune marginali correzioni sul tracciato del GPS, ma l'alternativa 3 è altrettanto valida. Tra l'altro, sarebbe possibile realizzare l'alternativa 3 in una applicazione (con permessi di root) da installare direttamente sul telefonino. Tale applicazione potrebbe leggere e modificare direttamente il database di endomondo, controllando al contempo lo stato della connettività.
Ammetto che finchè qualcuno non realizza una simile applicazione, applicare tali procedure non è per niente semplice.

Nessun commento:

Posta un commento