giovedì 10 ottobre 2013

Guida ai wakelocks per il risparmio energetico





Come sapete tutti, la croce e delizia della nuova tecnologia degli smartphone è lo schermo: colori bellissimi, intensi e decisi, ma anche consumi esagerati e scarsa durata della batteria.
Andare ad influire su di esso è limitante, poiché il massimo che potremmo farlo, sempre che il kernel lo consenta, è un mero undervolt (la maggior parte delle volte, rischioso per la stabilità, non altro, ndr). Per cui si opta per altri metodi per salvaguardare l'energia della nostra batteria. Underclockare la CPU è un ottimo punto di partenza, ma non è definitivo, nel senso che aiuta solo nei momenti in cui il telefono è in uso, ma capiamo bene che è più il tempo che il telefono passa a schermo spento che a schermo acceso. Quando lo schermo è spento, non significa che il telefono lo sia altrettanto, difatti esso compie una serie di operazioni in background che involvono l'uso della CPU, della memoria RAM e, occasionalmente, delle funzioni RIL e dei moduli di comunicazione esterni alle funzionalità RIL, ossia Wi-Fi, GPS e bluetooth. E tutto ciò ovviamente influisce sulla batteria. Ma esiste anche uno stato durante il quale il telefono è totalmente immobile, la CPU si blocca, ma il sistema resta acceso: questo stato si chiama deep sleep. Esso, come dice il nome, indica un momento di sonno profondo del device, il sistema operativo non interroga la CPU su alcun argomento, la batteria non viene interpellata (non in misura eccessiva) e tutto tace. 
Questo è lo stato ideale nel quale un device dovrebbe risiedere quando non è in uso. Ma purtroppo esistono una serie di processi che la CPU è obbligata ad adempiere perché le viene ordinato (direttamente o, più spesso, indirettamente) dall'utente. Questi processi svegliano il device dal suo stato di deepsleep e per tal motivo vengono chiamati wakelocks. Nella figura di seguito (che potete ottenere anche tappando sul grafico presente nella sezione Batteria, nel menù impostazioni) notate bene cosa intendo: lo schermo (Screen on) risulta spento (assenza di sezioni blu), mentre la voce Awake indica una linea blu (cerchiata per evidenziarla). Significa che il telefono, a schermo spento, stava eseguendo dei processi.



I wakelocks possono essere di due tipologie:

  • kernel wakelocks, causati dallo stesso hardware del telefono
  • partial wakelocks, causati invece dal software del telefono

 Come avrete ormai compreso, questi sono "nemici" della vostra batteria. Ma c'è un modo per controllarne la frequenza, la durata del processo, il nome e quindi, conseguentemente, c'è anche un modo per evitare che si presentino. 
Per fare ciò ci sarà più che utile l'ottima applicazione BetterBatteryStats (già citata nell'articolo sulla baseband, che potete scaricare gratuitamente nel relativo thread su XDA o nella versione "Donate" sul Play Store. BetterBatteryStats (BBS per abbreviazione) non eliminerà il problema alla radice, ma monitorerà per noi questi processi, indicati troppo sommariamente nella voce Batteria, nel menù impostazioni. 
Per farne un uso completo e fruibile al 100%, dovrete avviare per la prima volta l'applicazione, dopo di che ignorarla per tutto il ciclo di scarica e, una volta staccato il telefono al 100% di carica, riaprirla. Dopo un certo lasso di tempo (o dopo una determinata percentuale di scarica) ed, ovviamente, dopo un certo periodo durante il quale il telefono è stato a schermo spento, potete aprire l'applicazione e selezionare, nel primo menù a tendina, una delle due voci, kernel wakelock o partial wakelock. Vi compariranno una serie di voci che sono, per l'appunto, i processi incriminati. 



Come potete vedere dai due screenshots, alla voce "kernel wakelock" sono elencati diversi servizi dai nomi poco comprensibili (il cui significato lo vedremo tra poco). La prima voce, multipdp, non supera i 22 minuti di awake, che è davvero poco considerata il tempo di scarica fino a quel momento (26 ore). Nella voce "partial wakelocks" potete notare che il primo processo è quello correlato alla sincronizzazione di Google, relegato, addirittura a 3 minuti totali, davvero una miseria. 
Ma vediamo adesso, nel dettagli, alcune delle voci più ricorrenti, nonché quelle che sperperano maggiormente la carica della batteria.
Partiamo dai wakelocks legati al kernel, che sono i più dispendiosi e fastidiosi da risolvere:
  • iniziamo da uno dei più comuni, dettato da una cattiva gestione del traffico dati o, peggio, dalla mancanza di manutenzione della baseband: sdio_al e sdio_dmux. Questo wakelock è indetto da una non completa e perfetta gestione della baseband della propria linea, cosa che genera un conflitto ed interpella la CPU per migliorare il segnale della connessione dati. Per sistemarlo è necessario controllare di aver su la giusta baseband (consultare questo articolo) o staccare la connessione dati se il segnale non è ottimale (nel caso vi troviate provvisoriamente in una punto con poca linea).
  • wlan_rx, wlan_awake e wlan_rx_awake sono 3 wakelocks indetti dalla CPU quando è in corso una sincronizzazione (che sia un client mail, un'app social o Google Service che cerca di sincronizzare).
  • alarm_rtc è il wakelocks che attiva i messaggi push derivati dalla sincronizzazione. Per ovviare a questo semplice problema, è sufficiente disattivare le notifiche push dalle varie app o dilazionarle in tempi più lunghi.
  • suspend_backoff è il wakelock correlato ad un processo, solitamente il Wi-Fi acceso, che impedisce al telefono di andare in deep sleep. È sufficiente recarsi nella sezione Wi-Fi, successivamente in "avanzate", selezionare "tenere attivo durante la sospensione" ed indicare la voce "mai". 
  • mmc0_detect, mmc1_detect e mmc2_detect sono i wakelocks dettati dal controllo del sistema sui dispositivi di archiviazione (sd interna, sd esterna ed eventuali altre partizioni, rimovibili o no). Potete fare ben poco per questo wakelock, ma solitamente influisce solo nei primissimi secondi di accensione del device o subito dopo uno scollegamento del cavo USB dal PC. Influisce anche poco sulla batteria.
  • vbus_present è legato al collegamento USB, ma è normale visto che quando il telefono è in carica (e quindi anche collegato via USB), non va mai in deep sleep.
  • l2_hsic è un wakelock legato ad una cattiva comunicazione con l'APN. Potete risolvere ricreando un nuovo APN identico al precedente dalla sezione "reti mobili" nel menù impostazioni.
  • deleted_wake_locks è un indice dei wakelocks non più attivi. Per rimuoverlo è sufficiente riavviare o, se il problema persiste, da recovery, eseguire wipe cache e wipe dalvik cache.
  • PowerManagerService è il wakelocks che indicizza i partial wakelocks, ossia quelli relativi alle app. Per ridurlo è necessario agire sui partial wakelocks che vedremo tra poco.
Questo è un primo elenco di alcuni dei processi che influenzano la durata della batteria e sono quelli relativi all'hardware del telefono (o tablet che sia). Adesso andiamo a vedere i partial wakelocks, ossia quelli relativi alle app installate sul telefono:
  • RILJ, radio-interface e multipdp sono 3 wakelocks correlati alla connessione internet. Per il primo, se troppo prolungato, è necessario il cambio della baseband o del RIL (ma solo previo backup). Gli altri due sono correlati alle connessioni Wi-Fi ed alle relative sincronizzazioni. È necessario limitare le sincronizzazioni per ridurli al minimo.
  • SyncLoopWakelock  e ConnectivityService sono i wakelock che segnalano che c'è scarso segnale e viene interrogata la CPU per sopperire. Per evitare che accada, basta prolungare gli intervalli di scansione di ricerca della linea o cambiate il modem.
  • GTALK_ASYNC_CONN è una famiglia di wakelocks non inerenti a Google (nonostante il nome GTALK), bensì allo scarso segnale Wi-Fi. Per migliorare lo status di questo wakelock, è sufficiente staccare il Wi-Fi o eseguire un wipe dalvik cache.
  • ActivityManager è una famiglia di wakelocks che riguarda le app in sincronizzazione automatica. Per rimuoverlo, è sufficiente rimuovere i dati in background o utilizzare app come Greenify per congelare le app in questione.
  • AlarmManager al pari di ActivityManager, è relativo alle app in sincronizzazione automatica, con la specifica che agisce sulle notifiche push.
  • show keyguard è il wakelock relativo alla lockscreen (widget con geolocalizzazione tipo meteo). Purtroppo per rimuoverlo è necessario rimuovere i relativi widget.
Questi sono i più frequenti ed i più influenti in termini di consumo della batteria.

Esiste un modo per prevenirli, invece di correre ai ripari a giochi fatti? Certo che sì, esistono una serie di accorgimenti da prendere affinché il vostro device respiri come dovrebbe:
  1. quando installate un'app, controllate i permessi che necessita per funzionare e se trovate qualcosa che influisce sulla linea o sulla geolocalizzazione, limitateglieli.
  2. non sincronizzate social network (Facebook è una vera sanguisuga, una delle peggiori).
  3. non sincronizzate client mail con notifiche push, ma dategli un intervallo di scansione limitato a seconda delle vostre esigente (io tengo 1 ora per hotmail e 4 ore per gmail).
  4. disattivate la geolocalizzazione richiesta da Google, sia GPS che Wi-Fi
  5. cercate di abbinare la giusta baseband al vostro operatore telefonico, rispettando il canone imposto dalla nomenclatura (baseband che iniziano per B sono dedicati a Vodafone, N ad H3G e X sono i nobrand).
  6. staccate il 3G quando non vi serve ed utilizzate il 2G.
  7. staccate il Wi-Fi, bluetooth e GPS quando non sono strettamente necessari.
  8. preferite i webclient alle app costruite da 0 (ad esempio Fast for Facebook invece dell'app ufficiale).
Seguendo queste poche e basilari linee guida potrete condurre il vostro device ad interminabili cicli di scarica (arrivo sempre tranquillamente a coprire 2 giorni di scarica e comunque mai meno di 30 ore) con 3 o più ore di schermo on.
Potete avere molto dal vostro dispositivo, siete disposti ad imparare per sfruttarlo al meglio?

Alla prossima con altre guide per il risparmio energetico.