Skip to content

Instantly share code, notes, and snippets.

@danielesegato
Created October 23, 2014 11:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danielesegato/863082a659dd1ee9f9a2 to your computer and use it in GitHub Desktop.
Save danielesegato/863082a659dd1ee9f9a2 to your computer and use it in GitHub Desktop.
TESTCASE: Debug very slow on ART for method Html.fromHtml() - android bug 77984
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btnParse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="ParseString" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<TextView
android:id="@+id/txtResult"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
package com.neosperience.projects.playgroundandroid;
import android.app.Activity;
import android.os.Bundle;
import android.text.Html;
import android.text.Spanned;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class SlowARTDebugActivity extends Activity implements View.OnClickListener {
private static final String TEST_HTML = "<p>Di che si tratta? Un protocollo di sicurezza che impedisce ad un computer, all&#8217;accensione, di avviare un software che non sia certificato&#8230; In sostanza rende impossibile avviare un live CD o un sistema operativo che non sia certificato.</p> <p>I fatti:</p> <ul> <li>la certificazione a<strong>Windows 8</strong> richiede che il sistema abbia UEFI Secure Booting ABILITATO</li> <li>la certificazione a Windows 8 NON richiede che l&#8217;utente abbia la possibilità di disabilitare l&#8217;UEFI, e vi sono dei produttori di hardware (computer) che hanno già affermato che questo non sarà possibile</li> <li>la certificazione a Windows 8 NON richiede che il computer venga fornito con altre chiavi se non quelle Microsoft (ovvero, certificati firmati da Microsoft)</li> <li>Un sistema che viene venduto con UEFI abilitato (e non disabilitabile) e contiene solo chiavi Microsoft avvierà sempre e solo sistemi operativi Microsoft</li> </ul> <p>Avete presente quel bollino che trovate sui vostri computer con il logo di Windows?</p> <p>Sul mio portatile ne ho uno con il simbolo di Windows e la scritta &#8220;Windows 7&#8243;.</p> <p>I produttori di computer, per ottenere la certificazione di Microsoft DEVONO sottostare al programma di certificazione di Microsoft, chi ottiene il Logo di certificazione ottiene incentivi da Microsoft.</p> <p>Ogni produttore può decidere, in autonomia, se sottostare al programma di certificazione ma, siccome Windows è in posizione dominante (90% del mercato circa) ottenere la certificazione è fondamentale per non perdere competitività con gli altri produttori. È facile prevedere che tutti i produttori venderanno PC con UEFI Secure Booting attivo, come richiesto per la certificazione Microsoft.</p> <p>In genere questa certificazione si applica ai PC OEM, ovvero quelli con Windows preinstallato, la quasi-totalità dei computer acquistati dai comuni mortali <span class='wp-smiley wp-emoji wp-emoji-smile' title=':)'>:)</span></p> <blockquote><p><strong>Fonte</strong>: <em>Mathew Garret</em> (aka <strong><a title=\"Mathew Garret Blog\" href=\"http://mjg59.dreamwidth.org/\">mjg59</a></strong>) e nello specifico <em><a title=\"UEFI Secure Booting\" href=\"http://mjg59.dreamwidth.org/5552.html\">questo</a></em> e <em><a title=\"UEFI Secure Boot (part2)\" href=\"http://mjg59.dreamwidth.org/5850.html\">questo</a></em> post sul suo blog; mjg59 è uno sviluppatore Red Hat molto attivo nella community Linux; ultima fonte è <a title=\"Building Windows 8\" href=\"http://blogs.msdn.com/b/b8/archive/2011/09/22/protecting-the-pre-os-environment-with-uefi.aspx\">Microsoft stessa</a>.</p></blockquote> <p>Interrompo il lungo silenzio per riassumere quanto dice <em>mjg59</em> nei suoi due articoli linkati qui sopra: in italiano, sia per dar eco alla notizia che NON DEVE passare inosservata sia per permettere anche ai non anglofoni di venirne informati.</p> <p><strong>È presto per andare nel panico ma è il caso di iniziare a preoccuparsi</strong>.</p> <h1>Vi state chiedendo, più nello specifico, cosa questo comporta?</h1> <p>Comincio subito spiegando un po&#8217; meglio a cosa serve e come funziona questo UEFI Secure Booting, senza andare troppo nel tecnico:</p> <div><span id=\"more-292\"></span></div> <h2>Spiegazione semi-tecnica</h2> <p>Sostanzialmente il vostro computer, quando si avvia, dopo le inizializzazioni (tipicamente gestite dal BIOS) manda in esecuzione sul processore (CPU) del vostro computer il <strong>boot loader</strong> del vostro sistema operativo.</p> <p>Il <strong>boot loader</strong> può essere, in realtà, qualunque software in grado di gestire l&#8217;avvio del vostro PC: windows ha il suo bootloader, Linux ne ha diversi (grub, lilo, &#8230;), se avviate da LiveCD/DVD o chiavetta USB state eseguendo altri programmi che &#8220;sanno&#8221; come avviare il vostro computer, d&#8217;ora in avanti chiamerò &#8220;<strong>software di avvio</strong>&#8221; il generico programma che si occupa di far avviare il vostro computer.</p> <p>In realtà l&#8217;<em>UEFI Secure Booting</em> parla di <strong>Firmware</strong>, il che significa, più in generale, qualunque software, compresi software interni ai dispositivi fisici nel vostro computer (<em>schede video, schede di rete, &#8230;.</em>) vedremo più sotto che questo comporta problemi anche per chi non è interessato a sistemi operativi NON-Windows.</p> <p>Richiedere che il <em>software di avvio</em> sia certificato significa FIRMARE digitalmente il software e controllare che la firma sia valida prima di eseguirlo.</p> <p>Tipicamente questo avviene generando delle chiavi, una <em>pubblica</em> ed una <em>privata</em>: la <strong>chiave privata</strong> è segreta e viene usata per firmare il <em>software di avvio</em> prima di venderlo / distribuirlo; la <strong>chiave pubblica</strong> viene invece installata nei computer ed è in grado di determinare se la firma è valida (perché firmata con la corrispettiva <strong>chiave privata</strong>) o, in caso negativo, negare l&#8217;avvio.</p> <h2>Perché questo è un problema?</h2> <p>Per l&#8217;UEFI Secure Booting non esistono Certification Authorities, il che significa che ogni produttore di hardware potrà scegliere (oltre alle chiavi microsoft) di includere le chiavi che più ritiene opportune.</p> <p>Microsoft è in una posizione avvantaggiata perché può richiedere che su tutti i computer vi siano le proprie chiavi, nessun altro è nella stessa posizione per farlo, ne Red Hat, ne Canonical (Ubuntu) ne AMD, nVidia, Intel.</p> <p>Sono i produttori dei computer (Dell, Asus, Acer, &#8230;.) a decidere quali <em>chiavi pubbliche</em> installare sui computer prima di venderli, e sono sempre loro a decidere se dare la possibilità a chi li compra di disabilitare l&#8217;UEFI Secure Booting (tipicamente tramite BIOS). Come già detto, però, nessun produttore sceglierà di rinunciare alla certificazione Microsoft perché verrebbe messo in una posizione di svantaggio rispetto agli altri.</p> <p>È importante comprendere che questo interessa anche i dispositivi installati sul vostro computer: <strong>se voleste cambiare la scheda video o la scheda di rete il computer potrebbe non avviarsi più</strong>: dipende dalle chiavi installate, se la scheda di rete che avete comprato non è riconosciuta come certificata dal vostro PC questo potrebbe rifiutare di avviarsi.</p> <blockquote><p>A mio personale parere questo non avverrà perché i produttori sigleranno accordi appositamente per evitare che succeda, pagando Microsoft o i singoli fornitori per assicurarsi che le proprie chiavi siano inserite in tutti i computer&#8230; significa però aumento dei costi per l&#8217;utente finale, su qualcuno quelle spese devono ricadere.</p></blockquote> <h2>Cosa può fare chi comprerà un computer con Windows 8?</h2> <p>Occorrerà prestare attenzione durante l&#8217;acquisto ecco quindi un piccolo sommario delle casistiche possibili.</p> <p>Per il momento non esiste alcun modo di conoscere queste informazioni a priori se non cercando su Internet prima di recarsi a comprare.</p> <p>Non esiste infatti, per ora, alcun obbligo per i produttori di comunicare al cliente finale questo tipo di informazioni.</p> <h3>Se sul vostro computer è IMPOSSIBILE disabilitare UEFI Secure Booting + solo chiavi Microsoft</h3> <blockquote><p>Questo è il caso peggiore.</p> <p>In questo caso NULLA se non prodotti Microsoft certificati potranno essere avviati sul computer.</p> <p>Nessun hardware potrà essere cambiato se il nuovo hardware non è certificato da Microsoft (quali saranno le richieste di microsoft perché l&#8217;hardware sia certificato?)</p> <p>Niente Linux, niente Live CD/DVD, niente boot da chiavetta, nulla che Microsoft non abbia certificato.</p> <p>Per quel che ne so potrebbe essere impossibile avviare una versione precedente di Windows (come Windows Vista o Windows 7) a meno che Microsoft le fornisca firmate (non sono informato in merito e non so se le precedenti versioni sono state distribuite certificandole).</p></blockquote> <h3>Se sul vostro computer è IMPOSSIBILE disabilitare UEFI Secure Booting + chiavi di diversi fornitori</h3> <blockquote><p>La situazione è identica al caso precedente con la differenza che potrete avere software di avvio e dispositivi hardware firmati da Microsoft oppure da uno degli altri fornitori per cui è stata installata una chiave.</p> <p>Per capire cosa questo significa vi descriverò una situazione molto <strong>improbabile</strong>, ma plausibile: immaginate che Dell stringa un accordo con Canonical (Ubuntu), e che quindi Dell installi nei propri computer le chiavi Microsoft (necessarie alla certificazione) e le chiavi Ubuntu. (NOTA: ho preso Dell e Ubuntu in modo totalmente casuale, l&#8217;esempio è valido con qualunque altra accoppiata).</p> <p>Supponendo quindi che questo sia il PC in vostro possesso potrete installare Ubuntu ma nessun altra distribuzione Linux. Non potreste comunque installare versioni non certificate da Canonical del kernel e/o del boot loader. La vostra libertà sarebbe quindi, comunque, limitata.</p> <p>Quindi in sostanza, ciò che potete fare, dipenderebbe dalle chiavi installate e da ciò che i proprietari delle chiavi hanno previsto; se non è stato previsto per voi dai produttori, non lo potete fare.</p> <p>A prescindere dalle chiavi installate avrete sempre delle limitazioni, specialmente se siete un po&#8217; tecnici e volete poter utilizzare il PC che avete comprato come più vi aggrada.</p> <p>Ad esempio non sarà possibile utilizzare Grub2, l&#8217;attuale boot loader predefinito di Ubuntu e molte altre distribuzioni, per problemi di incompatibilità della licenza (GPLv3) [vedi sotto].</p> <p>Non potrete mai compilare una versione personalizzata del kernel (Linux/FreeBSD) o del boot loader, non verrebbe riconosciuto come certificato.</p></blockquote> <h3>Se sul vostro computer è POSSIBILE disabilitare UEFI Secure Booting</h3> <blockquote><p>A patto che UEFI Secure Booting venga disabilitato qualunque software (compreso Linux) e dispositivo può essere installato.</p> <p>In futuro, quando acquisterete un computer ASSICURATEVI di cosa state comprando e informatevi bene che l&#8217;UEFI si possa disabilitare prima di pagare!</p> <p>Mi resta un dubbio, ma è solo un dubbio, Windows 8 si rifiuterà di avviarsi senza l&#8217;UEFI Secure Booting abilitato?</p> <p>Se così fosse il Dual Booting Windows 8 / Linux non sarebbe possibile.</p> <p>Questo però, ripeto, è solo un mio dubbio, non esiste al momento alcuna indicazione in merito.</p></blockquote> <h3>Se sul vostro computer è POSSIBILE UEFI Secure Booting + possibile installare proprie chiavi</h3> <blockquote><p>Questo è il caso più &#8220;roseo&#8221;.</p> <p>Avete la possibilità di disabilitare l&#8217;UEFI Secure Booting, installando quindi quel che volete ma, gli utenti più tecnici, avrebbero anche la possibilità di aggiungere le proprie chiavi e firmare i propri software e/o hardware perché funzionino (_solo_ sul proprio computer) anche con UEFI Secure Booting attivo.</p> <p>L&#8217;ironia è che comunque, anche volendolo, non potrete impedire a Windows 8 di avviarsi a meno che non vi sia fornita anche la possibilità di rimuovere le chiavi.</p></blockquote> <h2>I software GPLv3 sono tagliati fuori dall&#8217;UEFI Secure Booting</h2> <p>Se prendiamo in esame la <strong>GPLv3</strong> notiamo che questa obbligherebbe, firmando il software di avvio, a rilasciare anche la <strong>chiave privata:</strong> il che renderebbe inutile l&#8217;UEFI Secure Booting in quanto chiunque potrebbe firmare il proprio software e l&#8217;UEFI lo accetterebbe come valido, questo è sufficiente a farci capire che mai nessun produttore hardware includerebbe una simile chiave nel sistema.</p> <p><strong>Grub2</strong>, il recente boot loader Linux utilizzato da quasi tutte le moderne distribuzioni, utilizza la licenza GPLv3: non potrà mai essere firmato e quindi non funzionerà mai con UEFI Secure Booting attivo.</p> <h3>La natura di Linux</h3> <p>Il suo predecessore Grub (versione 1) è sotto a GPLv2, ma questo non risolverebbe il problema.</p> <p>Prima di tutto perché Linux si sta evolvendo in modo da includere il boot loader stesso che quindi non sarà più un software separato (ecco perché parlavo di impossibilità di ricompilare il kernel), in secondo luogo perché gli utenti Linux e gli sviluppatori Linux sono abituati e hanno bisogno di compilare il kernel e il boot loader in proprio e non è pertanto sufficiente limitarsi ad utilizzare versioni compilate e firmate da fornitori certificati.</p> <h2>Concludendo</h2> <p>Microsoft afferma di non voler togliere agli utenti finali il controllo del proprio computer, ma i fatti dicono il contrario.</p> <p>Al momento della scrittura di questo post NON esistono hardware in commercio che supportino il protocollo UEFI Secure Booting e l&#8217;unico produttore che ha un&#8217;implementazione è Intel.</p> <p>Potrebbe risolversi tutto in fumo nei prossimi mesi, ma è importante restare sul chi vive e seguire attentamente la faccenda, seguite le fonti che vi ho indicato ad inizio articolo, io tenterò di mantenere questo post aggiornato ma non posso garantirlo. Aggiornamenti e altre segnalazioni correlate sono benvenute nei commenti.</p> <p><em>Leggete i commenti per link di aggiornamento.</em></p><br />Archiviato in:<a href='http://natonelbronx.wordpress.com/category/informatica/microsoft/giochi-sporchi-di-microsoft/'>Giochi sporchi di microsoft</a>, <a href='http://natonelbronx.wordpress.com/category/informatica/hardware/'>Hardware</a>, <a href='http://natonelbronx.wordpress.com/category/links/'>Links</a>, <a href='http://natonelbronx.wordpress.com/category/informatica/linux/'>Linux</a>, <a href='http://natonelbronx.wordpress.com/category/segnalazioni/'>Segnalazioni</a> Tagged: <a href='http://natonelbronx.wordpress.com/tag/linux/'>Linux</a>, <a href='http://natonelbronx.wordpress.com/tag/microsoft-2/'>microsoft</a>, <a href='http://natonelbronx.wordpress.com/tag/uefi/'>uefi</a>, <a href='http://natonelbronx.wordpress.com/tag/windows8/'>windows8</a> <a rel=\"nofollow\" href=\"http://feeds.wordpress.com/1.0/gocomments/natonelbronx.wordpress.com/292/\"><img alt=\"\" border=\"0\" src=\"http://feeds.wordpress.com/1.0/comments/natonelbronx.wordpress.com/292/\" /></a> <img alt=\"\" border=\"0\" src=\"http://pixel.wp.com/b.gif?host=natonelbronx.wordpress.com&#038;blog=585625&#038;post=292&#038;subd=natonelbronx&#038;ref=&#038;feed=1\" width=\"1\" height=\"1\" />";
private Button btnParse;
private TextView txtResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.slow_art_debug);
findViews();
}
private void findViews() {
btnParse = (Button)findViewById( R.id.btnParse );
txtResult = (TextView)findViewById( R.id.txtResult );
btnParse.setOnClickListener( this );
}
@Override
public void onClick(View v) {
if ( v == btnParse ) {
Spanned spanned = Html.fromHtml(TEST_HTML);
txtResult.setText(spanned);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment