{"id":12506,"date":"2017-05-29T18:19:22","date_gmt":"2017-05-29T16:19:22","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=12506"},"modified":"2017-05-29T18:19:52","modified_gmt":"2017-05-29T16:19:52","slug":"configurare-build-variant-in-android-studio","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/configurare-build-variant-in-android-studio\/","title":{"rendered":"Configurare build variant in Android Studio"},"content":{"rendered":"<p>La flessibilit\u00e0 offerta da Gradle permette anche di creare delle <em>build variant<\/em>, versioni diverse della medesima app all&#8217;interno dello stesso progetto. Se ne possono immaginare vari casi di utilizzo come la produzione di una versione demo ed una completa, una gratuita e una a pagamento e molti altri ancora.<\/p>\n<p>In questo post, considereremo gli aspetti della configurazione Gradle che devono essere manipolati per permettere la creazione di pi\u00f9 build variant, ad ognuno dei quali potr\u00e0 essere fornito un insieme diverso di risorse, impostazioni e codice Java.<\/p>\n<h2>Build type e flavor<\/h2>\n<p>Una build variant \u00e8 costituita dalla congiunzione di un <strong>build type<\/strong> e di un <strong>flavor<\/strong>. Per quanto riguarda i primi, al momento della creazione di un nuovo modulo, ne vengono creati due in automatico da Android Studio: i build type release e debug.<\/p>\n<p>Se ne trova traccia nel file build.gradle del modulo:<\/p>\n<pre class=\"lang:java decode:true\">android {\r\n...\r\n...\r\nbuildTypes {\r\n        release {\r\n            minifyEnabled false\r\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\r\n        }\r\n    }\r\n...\r\n...\r\n}<\/pre>\n<p>Gli attributi che vengono inseriti al loro interno rappresentano un diverso atteggiamento del build type rispetto a quello di default. Se, ad esempio, volessimo inserire un aspetto differente per il build type debug ci basterebbe inserire un blocco <code>debug {...}<\/code>\u00a0all&#8217;interno del nodo <em>buildTypes {&#8230;}<\/em>.<\/p>\n<p>Anche la creazione di un flavor si risolve in un nodo di tipo <em>productFlavors<\/em>, da inserire all&#8217;interno del blocco <em>android<\/em> sebbene esternamente a quello di tipo <em>buildTypes<\/em>:<\/p>\n<pre class=\"lang:java decode:true \">android {\r\n    ...\r\n    ...\r\n    buildTypes {\r\n                 ...\r\n                 ...\r\n               }\r\n    productFlavors {\r\n        firstFlavorName {\r\n            ...\r\n            ...\r\n        }\r\n        secondFlavorName {\r\n            ...\r\n            ...\r\n        }\r\n    }\r\n}<\/pre>\n<p>dove al posto delle stringhe firstFlavorName e secondFlavorName andrebbero indicati i nomi che si vogliono assegnare.<\/p>\n<p>A dimostrazione del fatto che un build variant \u00e8 composto dall&#8217;incrocio di un build type e di un flavor, \u00a0si noti che anche il suo nome risulta dalla concatenazione del nome di un flavor con quello dei vari build type. Vediamo subito degli esempi.<\/p>\n<h2>Risorse diverse nei vari build variant<\/h2>\n<p>Immaginiamo che per qualche motivo vogliamo che una nostra app abbia un colore di sfondo diverso a seconda del flavor che stiamo considerando. Definiamo pertanto due flavor &#8211; assegniamo loro nomi tipici per esempi di questo tipo come <em>demo<\/em> e <em>full<\/em> &#8211; e supponiamo di voler un layout con\u00a0sfondo rosa nel\u00a0primo e viola nel\u00a0secondo.<br \/>\nProcediamo cos\u00ec:<\/p>\n<ul>\n<li>nel file <strong>build.gradle<\/strong> del modulo inseriamo la definizione dei flavor con eventuali\u00a0impostazioni che potrebbero interessarci:\n<pre class=\"lang:java decode:true\">productFlavors\r\n            {\r\n                demo{\r\n                    applicationId=\"it.devapp.esempiobuildvariants.pink\"\r\n                    versionName=\"1.0-pink\"\r\n                }\r\n\r\n                full{\r\n                    applicationId=\"it.devapp.esempiobuildvariants.purple\"\r\n                    versionName=\"1.0-purple\"\r\n                }\r\n            }<\/pre>\n<\/li>\n<li>sincronizziamo il progetto con i nuovi file di gradle;<\/li>\n<li>creiamo ulteriori cartelle di risorse, a partire dalla cartella <em>src<\/em> del modulo, all&#8217;interno delle quali inseriremo le sole risorse che variano da un flavor all&#8217;altro. Nel nostro caso, predisporremo solo una risorsa colore di nome <em>sfondo<\/em> (la figura seguente riporta la visualizzazione <em>Project<\/em>):<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_01.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12507\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_01.jpg\" alt=\"android-grable-build-variants_img_01\" width=\"317\" height=\"359\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_01.jpg 317w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_01-265x300.jpg 265w\" sizes=\"auto, (max-width: 317px) 100vw, 317px\" \/><\/a><\/li>\n<li>infine, per fare in modo che la risorsa venga presa in considerazione la assegniamo all&#8217;attributo <em>background<\/em> della nostra app in relazione al layout che abbiamo fissato.<\/li>\n<\/ul>\n<p>I Build Variant creati potranno essere consultati nel relativo pannello che si apre cliccando sull&#8217;etichetta <em>Build Variants<\/em>, in basso a sinistra nell&#8217;interfaccia di\u00a0Android Studio:<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_02.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12511\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_02.jpg\" alt=\"android-grable-build-variants_img_02\" width=\"359\" height=\"240\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_02.jpg 359w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_02-300x201.jpg 300w\" sizes=\"auto, (max-width: 359px) 100vw, 359px\" \/><\/a><\/p>\n<p>Aprendo\u00a0il file di layout dell&#8217;Activity &#8211; per noi, <em>activity_main.xml<\/em> &#8211; noteremo nell&#8217;anteprima\u00a0la differenza di\u00a0colore di sfondo.<\/p>\n<p>Questo nel caso di un Build Variant con flavor <em>demo<\/em>:<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_03.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12510\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_03.jpg\" alt=\"android-grable-build-variants_img_03\" width=\"773\" height=\"349\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_03.jpg 773w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_03-300x135.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_03-768x347.jpg 768w\" sizes=\"auto, (max-width: 773px) 100vw, 773px\" \/><\/a><\/p>\n<p>e questo nel caso di un Build Variant con flavor <em>full<\/em>:<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_04.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12509\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_04.jpg\" alt=\"android-grable-build-variants_img_04\" width=\"769\" height=\"364\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_04.jpg 769w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_04-300x142.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_04-768x364.jpg 768w\" sizes=\"auto, (max-width: 769px) 100vw, 769px\" \/><\/a><\/p>\n<h2>Diversificare i sorgenti<\/h2>\n<p>Oltre a fornire risorse diverse, le build variant possono distinguersi per funzionalit\u00e0 \u00a0e per questo motivo\u00a0\u00e8 necessario predisporre classi con il medesimo nome in flavor diversi.<\/p>\n<p>Immaginiamo che si voglia\u00a0fare in modo che all&#8217;avvio dell&#8217;Activity &#8211; solo nel flavor <em>demo<\/em> &#8211; \u00a0venga presentata una finestra di dialogo che porti a conoscenza che si sta guardando una versione non full del software. Dovremo creare due classi MainActivity nelle cartelle relative ai due flavor ma facendo attenzione a non mettere una classe con lo stesso nome sotto la cartella <em>main<\/em>: ci\u00f2 produrrebbe un errore di classe duplicata.<\/p>\n<p>Aggiungendo il seguente codice Java nel metodo <em>onCreate<\/em> della MainActivity presente sotto la cartella <em>demo<\/em>:<\/p>\n<pre class=\"lang:java decode:true\">new AlertDialog.Builder(this)                                         \r\n        .setMessage(\"Attenzione: versione DEMO dell'app!\")            \r\n        .setPositiveButton(\"Chiudi\", null)                            \r\n        .show();<\/pre>\n<p>all&#8217;avvio dell&#8217;app in una build variant con questo flavor verremo accolti dal seguente messaggio:<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_05.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12513\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_05.jpg\" alt=\"android-grable-build-variants_img_05\" width=\"331\" height=\"312\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_05.jpg 331w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2016\/10\/android-grable-build-variants_img_05-300x283.jpg 300w\" sizes=\"auto, (max-width: 331px) 100vw, 331px\" \/><\/a><\/p>\n<p>Ci\u00f2 non avverr\u00e0 passando ad una build variant con flavor <em>full<\/em> e lanciando l&#8217;app. Tra l&#8217;altro notando il colore dello sfondo, si vede che \u00e8 rosa (reso pi\u00f9 scuro dall&#8217;apparizione della finestra di dialogo) che dimostra ulteriormente che \u00e8 stato utilizzato il flavor demo.<\/p>\n<h2>Conclusioni<\/h2>\n<p>L&#8217;utilizzo delle build variant dimostra come l&#8217;introduzione di Gradle in Android Studio sia stato davvero un potenziamento importante\u00a0considerando la flessibilit\u00e0 nella configurazione che permette. Soprattutto, un aspetto molto interessante consiste nella semplicit\u00e0 sintattica delle direttive da fornire nei file build.gradle per diversificare i comportamenti: per il resto si tratta per lo pi\u00f9\u00a0di una\u00a0riorganizzazione di file e cartelle.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La flessibilit\u00e0 offerta da Gradle permette anche di creare delle build variant, versioni diverse della medesima app&#8230;<\/p>\n","protected":false},"author":561,"featured_media":13054,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1278,1541,1554],"class_list":["post-12506","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-pratici","tag-android","tag-android-studio","tag-gradle"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12506","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=12506"}],"version-history":[{"count":5,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12506\/revisions"}],"predecessor-version":[{"id":12516,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/12506\/revisions\/12516"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/13054"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=12506"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=12506"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=12506"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}