L'utente medio di Android probabilmente ha smesso da tempo di preoccuparsi del "problema di frammentazione" di Android. Ma il problema continua a tormentare gli sviluppatori.
La frammentazione è stata una questione controversa in Android letteralmente da quando è stato annunciato il sistema operativo mobile.
Oltre ad essere una clava per i troll da usare nelle guerre di fuoco online, la diversità che deriva dalla frammentazione è ora in gran parte vista come una netto positivo per i consumatori dei dispositivi Android. Dopotutto, ci viene data così tanta libertà nella scelta del tipo di dispositivo con il tipo di software che vogliamo che è difficile per il consumatore medio preoccuparsi della frammentazione. Visualizzando l'incredibile varietà di dispositivi Android si ottiene uno splendido mosaico delle diverse rappresentazioni di Android.
Ma la frammentazione dell'hardware e del software non rende felice uno sviluppatore di software. In realtà, tutto il contrario. Sviluppare un'app con così tante diverse configurazioni hardware e software può rivelarsi un grosso fastidio durante il debug. Gli OEM possono apportare modifiche importanti o sottili di cui tenere conto durante lo sviluppo di un'app, ma in realtà non esiste un modo semplice per il singolo sviluppatore di garantire che la propria app funzioni universalmente. Anche se il consumatore medio ha da tempo dimenticato il dibattito sulla frammentazione, il problema continua a perseguitare Android sviluppatori di app e apparentemente non c'è nulla da fare al riguardo se non risucchiarlo e gestire gli errori man mano che apparire.
Il triste stato di frammentazione
Un OEM in particolare riceve gran parte dell'odio per i mal di testa che causa durante lo sviluppo di un'app: Samsung. Gli sviluppatori si lamentano di Samsung ormai da anni, alcuni addirittura scrivono articoli feroci come "C'è un posto speciale per Samsung nell'inferno di Android" che descrive un bug particolarmente frustrante derivante da Dispositivi Samsung e libreria appcompat di supporto. Vorrei attirare l'attenzione su un paragrafo in particolare dello sfogo di Ambri, che delinea in modo eccellente il motivo per cui gli sviluppatori si preoccupano ancora della frammentazione:
Se sei uno sviluppatore Android, il tuo odio per i dispositivi Samsung è probabilmente sconfinato. Più di un utente medio, per il quale Samsung è sinonimo stupido Touchwiz E bloatware eccessivo, disprezzi Samsung perché non hai scelta. A causa di Samsung massiccia quota di mercato, semplicemente non puoi scegliere di non supportare i dispositivi Samsung. E questo è ciò che fa più male; il fatto che questa scelta ti venga tolta!
Anche questa non è una lamentela dei vecchi anni di esistenza di Android: questo post è stato pubblicato a metà dicembre dell'anno scorso. Sarò schietto e dichiarerò che non sono sicuro che questo problema sia stato già risolto ufficialmente, tuttavia, Sig. Ambri ha fornito una soluzione nel suo post per chiunque si imbatte nel suo sfogo tramite una ricerca su Google per il insetto. Tutto quello che devi fare è usare ProGuard con la seguente riga di codice:
# Samsung ruining all nice things-keep class !android.support.v7.view.menu.**, !android.support.design.internal.NavigationMenu, !android.support.design.internal.NavigationMenuPresenter, !android.support.design.internal.NavigationSubMenu, android.support.** {*;}
Non è poi così male, vero? Il problema, tuttavia, è che questa correzione è stata eliminata da Stack Overflow. Non fraintendermi, Stack Overflow è un ottimo sito web. Ma non è davvero una fonte ideale per scoprire correzioni per le tue app. Trovare qualcosa su Stack Overflow spesso implica immergersi in profondità nei collegamenti dopo molte ricerche su Google per tentativi ed errori. A volte troverai anche un altro utente che menziona lo stesso bug che hai riscontrato, ma senza una soluzione in vista. O ancora più frustranti sono le volte in cui trovi un thread in cui ha affermato l'utente originale hanno trovato una soluzione ma hanno abbandonato da tempo il thread senza istruire gli altri su come risolvere il problema problema.
Un esempio di un sottile problema di frammentazione
Non sono uno sviluppatore, ma ho abbastanza familiarità con le funzionalità di Android dopo anni di armeggiare con Tasker da aver iniziato a pseudo-programmare le mie soluzioni ai problemi che ho dovuto affrontare. E quando non riesco a capire qualcosa, lo cerco su Google, proprio come fanno tutti gli altri. Mentre stavo scrivendo il mio precedente articolo su cercando attività nascoste nell'app Impostazioni del telefono, mi sono imbattuto in un bug piuttosto strano che non riuscivo a spiegare. Un bug esclusivo dei dispositivi Huawei.
Ogni volta che provavo ad avviare determinate attività (come il menu "Test" che contiene le statistiche sull'utilizzo dell'app) all'interno dell'app Impostazioni, ricevevo sempre un errore di autorizzazione. In particolare, l'app che stavo utilizzando per avviare l'attività era priva dell'autorizzazione huawei.android.permission. HW_SIGNATURE_OR_SYSTEM. Nessun altro dispositivo che ho testato ha richiesto autorizzazioni univoche per avviare queste attività di Impostazioni, solo i telefoni con la versione Android di Huawei (EMUI). Un'analisi di com.android.settings ha rivelato che alcune attività all'interno dell'app Impostazioni erano effettivamente sotto un livello di protezione che richiedeva il firma o autorizzazione di sistema.
Sfortunatamente per me, questo significa che solo le app installate in /system o le app firmate con lo stesso firma poiché l'app Impostazioni sarebbe in grado di aprire queste attività utilizzando il metodo che facevo io tentando. Quando ho cercato su Google una risposta a questo errore, io (hai indovinato) mi sono imbattuto in a Discussione di stack overflow. Lo sviluppatore che ha postato il suo problema ha riscontrato lo stesso problema che ho riscontrato io (sebbene fosse in procinto di sviluppare effettivamente un'app). Il suo problema si è verificato quando ha tentato di eseguire il seguente codice:
<span >Intentspan><span > mainIntent span><span >=span><span >newspan><span >Intentspan><span >(span><span >Intentspan><span >.span><span >ACTION_MAINspan><span >,span><span >nullspan><span >);span><span >mainIntentspan><span >.span><span >addCategoryspan><span >(span><span >Intentspan><span >.span><span >CATEGORY_LAUNCHERspan><span >);span><span >Intentspan><span > pickIntent span><span >=span><span >newspan><span >Intentspan><span >(span><span >Intentspan><span >.span><span >ACTION_PICK_ACTIVITYspan><span >);span><span >pickIntentspan><span >.span><span >putExtraspan><span >(span><span >Intentspan><span >.span><span >EXTRA_TITLEspan><span >,span><span >"Pick App to Play in"span><span >);span><span >pickIntentspan><span >.span><span >putExtraspan><span >(span><span >Intentspan><span >.span><span >EXTRA_INTENTspan><span >,span><span > mainIntentspan><span >);span><span >thisspan><span >.span><span >startActivityForResultspan><span >(span><span >pickIntentspan><span >,span><span > REQUEST_PICK_APPLICATIONspan><span >);span>
A giudicare dalle stringhe nell'intento e dalla pagina web dello sviluppatore, probabilmente stava cercando di consentire all'utente di scegliere un'app di terze parti per riprodurre alcuni contenuti multimediali. La correzione, fornita dallo sviluppatore veterano Commonsware, era abbastanza semplice: usare Intento. CreateChooser invece di ACTION_PICK_ACTIVITY. Tuttavia, Perché dovremmo implementare questa correzione? Perché Huawei richiede innanzitutto questa autorizzazione? Perché avevamo bisogno di trovare una risposta su StackOverflow utilizzando una ricerca Google molto specifica?
Il paradosso della scelta
Per trovare una risposta, CommonsWare ha presentato una segnalazione di bug sul bug tracker di Android chiedendo a Google di esaminare il problema. In particolare, lo sviluppatore ha richiesto a Google di impedire ai requisiti di autorizzazione non documentati di impedire alle app di terze parti di accedere ad ACTION_PICK_ACTIVITY. Scrivendo questi requisiti in CTS, Huawei sarebbe costretta a conformarsi a questi cambiamenti.
Ad essere onesti, però, questo bug in sé non è un grosso problema. Anche se nessun'altra app che ho provato (come Tasker) è stata in grado di aggirare questa autorizzazione requisito e avviare determinate attività all'interno dell'app Impostazioni, non sono rimasto esattamente deluso il risultato. Ma quando mi sono ricordato dello sfogo del signor Ambri, ho capito che piccoli cambiamenti come questi devono essere molto frustranti da affrontare, soprattutto perché per quanto piccoli possano essere, senza dubbioaddizionare, a volte abbastanza da causare mal di testa. Una piccola modifica all'app Impostazioni potrebbe comportare una recensione negativa immeritata nei confronti di uno sviluppatore. Un piccolo cambiamento che è piuttosto scarsamente documentato e mi ha richiesto di cercare in Internet un thread di Stack Overflow. Quanti altri piccoli bug ci sono su altri dispositivi?
La maggiore concorrenza nello spazio mobile si è rivelata positiva per il consumatore, ma dopo aver visto come questi sottili cambiamenti attraverso così tante linee di prodotti diverse che possono influenzare gli sviluppatori, ho imparato ad apprezzare il punto di vista degli sviluppatori nei confronti frammentazione. Non è che la scelta in sé sia il problema, ma piuttosto che la comunità non sta facendo abbastanza per catalogare questi problemi. Come ha suggerito Ambri nel suo articolo, forse gli sviluppatori Android hanno bisogno della propria versione di caniuse.com O sdkcritic.com per raccogliere tutti i bug oscuri in un unico database. L'unica altra alternativa è convincere gli OEM a documentare adeguatamente queste modifiche o a smettere di apportarle in primo luogo, ma buona fortuna.
Crediti immagine in primo piano: OpenSignal