{"id":12299,"date":"2017-02-23T10:35:14","date_gmt":"2017-02-23T09:35:14","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=12299"},"modified":"2017-02-23T10:42:01","modified_gmt":"2017-02-23T09:42:01","slug":"android-come-risolvere-lerrore-del-superamento-del-limite-dei-64k-metodi","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/android-come-risolvere-lerrore-del-superamento-del-limite-dei-64k-metodi\/","title":{"rendered":"Android: come risolvere l&#8217;errore del superamento del limite dei 64K metodi"},"content":{"rendered":"<p>Android come tutti gli ambienti\u00a0basati sulla mentalit\u00e0 open source \u00e8 in continua crescita sia come SDK sia come strumenti che vengono offerti a corredo da Google o da realt\u00e0 di terze parti. Oltre a ci\u00f2, l&#8217;introduzione di Gradle come strumento di<em> build automation<\/em> in Android Studio ha portato con s\u00e9 un ottimo sistema di risoluzione delle dipendenze: quando abbiamo bisogno di nuove funzionalit\u00e0 non dobbiamo far altro che richiedere l&#8217;integrazione di una qualche libreria nel progetto.<\/p>\n<p>La convergenza di questi fattori ha prodotto, nel tempo, applicazioni che crescono sempre pi\u00f9\u00a0fino all&#8217;apparizione di uno strano messaggio nella fase di build\u00a0che, nel tempo,\u00a0si \u00e8 manifestato in varie forme ma il cui significato non \u00e8 mai cambiato: <strong>l&#8217;app contiene troppi metodi<\/strong> e soprattutto la loro quantit\u00e0 supera il limite di 65.536 o meglio 64K come piace dire agli informatici.<\/p>\n<h2>Il limite dei 64K<\/h2>\n<p>Il problema nasce dal fatto che all&#8217;interno di un APK &#8211; il pacchetto di installazione di un&#8217;app Android &#8211; esiste un archivio in formato DEX (destinato a Dalvik, la macchina virtuale di\u00a0Android) che non pu\u00f2 indirizzare pi\u00f9 di 65.536 metodi, compresi quelli gi\u00e0 esistenti nella piattaforma. Sempre pi\u00f9 spesso succede quindi che, al momento del build, l&#8217;inclusione di nuove librerie o anche solo l&#8217;aggiornamento di una di esse ad una versione pi\u00f9 recente (pensiamo a come crescono i Google Play Services) improvvisamente renda la nostra app non pi\u00f9 compilabile impedendoci di andare avanti con il lavoro. Visto che non \u00e8 stato possibile aumentare il numero di metodi integrabili in un archivio DEX, l&#8217;unica alternativa \u00e8 inserire pi\u00f9 di uno di questi all&#8217;interno dell&#8217;APK passando ad una <strong>configurazione <em>multidex<\/em><\/strong>.<\/p>\n<h2>Configurazione multidex<\/h2>\n<p>Per passare ad una configurazione multidex \u00e8 necessario agire su due file del progetto, quelli che classicamente regoliamo per ottenere il nostro risultato finale:<\/p>\n<ul>\n<li>nel file <strong>build.gradle<\/strong> (a livello di modulo) andiamo ad attivare il supporto multidex inserendo tra le dipendenze la direttiva:\n<pre class=\"lang:xhtml decode:true \">dependencies {\r\ncompile 'com.android.support:multidex:1.0.0'\r\n...\r\n...\r\n}<\/pre>\n<p>e \u00a0attivando il supporto:<\/p>\n<pre class=\"lang:xhtml decode:true\"> defaultConfig {\r\n        ...\r\n        ...\r\n        multiDexEnabled true\r\n        ...\r\n        ...\r\n    }<\/pre>\n<\/li>\n<li>nel file <strong>AndroidManifest.xml<\/strong> invece \u00e8 necessario fare in modo che la nostra applicazione sia una MultiDexApplication, semplicemente modificando in questa maniera il nodo <em>application<\/em>:\n<pre class=\"lang:xhtml decode:true \">&lt;application\r\n    android:name=\"android.support.multidex.MultiDexApplication\"&gt;\r\n    ...\r\n    ...\r\n&lt;\/application&gt;<\/pre>\n<p>&nbsp;<\/li>\n<\/ul>\n<p>Fatto ci\u00f2, si potr\u00e0 attivare un nuovo build del progetto e questa volta &#8211; forti del frazionamento dei metodi in pi\u00f9 file DEX &#8211; non verranno pi\u00f9 segnalati errori e potremo provare la nostra app.<\/p>\n<p>Nei limiti del possibile, sarebbe comunque preferibile cercare di <strong>evitare l&#8217;errore<\/strong>, ad esempio, limitando le dipendenze inserite nel progetto. Proprio la semplicit\u00e0 con cui Gradle ci mette a disposizione nuove funzionalit\u00e0, induce spesso ad usare librerie di cui potremmo fare a meno magari scrivendo un po pi\u00f9 di codice noi stessi: non sempre per sfruttarne una o due funzionalit\u00e0 vale la pena integrare una libreria intera, magari molto estesa. Pensando ad esempio ai <strong>Google Play Services<\/strong> sappiamo che la loro libreria client che integriamo nelle app per dialogare con i servizi Google \u00e8 molto estesa ed offre funzionalit\u00e0 per l&#8217;intero universo di Mountain View. Si potrebbe limitare il loro &#8220;peso&#8221; nel progetto richiedendo solo le API di cui abbiamo bisogno e ci\u00f2 \u00e8 possibile dalla versione 6.5.<\/p>\n<p>Quindi, invece di includere l&#8217;intera libreria dei Google Play Services:<\/p>\n<pre class=\"lang:xhtml decode:true\">dependencies {\r\n        compile 'com.google.android.gms:play-services:9.4.0'\r\n    }<\/pre>\n<p>potremmo introdurre &#8211; poniamo il caso &#8211; solo le API relative alle Google Maps:<\/p>\n<pre class=\"lang:xhtml decode:true\">dependencies{\r\ncom.google.android.gms:play-services-maps:9.4.0\r\n}<\/pre>\n<p>includendo cos\u00ec un numero minore di metodi. L&#8217;intera lista delle API richiamabili \u00e8 disponibile alla <a href=\"https:\/\/developers.google.com\/android\/guides\/setup?utm_campaign=dex-1214&amp;utm_source=dac&amp;utm_medium=blog\" target=\"_blank\">pagina ufficiale<\/a> che illustra le modalit\u00e0 di installazione della libreria.<\/p>\n<h2>Conclusioni<\/h2>\n<p>Quindi la morale della storia \u00e8: se incorriamo nel superamento del limite dei 64K metodi, niente panico, la soluzione esiste, ci\u00f2 non toglie che \u00e8 bene configurare un progetto in maniera che non si richiedano dipendenze di cui potremmo fare a meno. Il valore di un&#8217;app si misura in tanti modi: apprezzando efficienza e funzionalit\u00e0 incluse &#8211; certo &#8211; ma anche gustando un prodotto ottimizzato e dalle dimensioni ridotte quanto possibile.<\/p>\n<p>E voi che ne pensate? Vi \u00e8 mai capito di incorrere in un messaggio di errore simile a quelli di cui abbiamo parlato ? Commentate e raccontateci le vostre esperienze!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Android come tutti gli ambienti\u00a0basati sulla mentalit\u00e0 open source \u00e8 in continua crescita sia come SDK sia&#8230;<\/p>\n","protected":false},"author":561,"featured_media":12829,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1682,1],"tags":[1278,1541,1555,1574,1575,1583,1554],"class_list":["post-12299","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-tutorial-pratici","tag-android","tag-android-studio","tag-build-automation","tag-build-automation-android","tag-build-automation-android-studio","tag-google-play-services","tag-gradle"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=12299"}],"version-history":[{"count":6,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12299\/revisions"}],"predecessor-version":[{"id":12828,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12299\/revisions\/12828"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/12829"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=12299"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=12299"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=12299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}