{"id":37565,"date":"2019-10-31T22:18:20","date_gmt":"2019-10-31T19:18:20","guid":{"rendered":"https:\/\/prohoster.info\/blog\/sborka-android-proekta-v-docker-kontejnere\/"},"modified":"2019-10-31T22:18:20","modified_gmt":"2019-10-31T19:18:20","slug":"sborka-android-proekta-v-docker-kontejnere","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/sborka-android-proekta-v-docker-kontejnere","title":{"rendered":"Assemblaggio del progetto Android in un contenitore Docker","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Sviluppando un progetto per la piattaforma Android, anche il pi\u00f9 piccolo, prima o poi ci si deve confrontare con l'ambiente di sviluppo. Oltre all'Android SDK, \u00e8 necessario avere l'ultima versione di Kotlin, Gradle, platform-tools e build-tools. E se sulla macchina del programmatore tutte queste dipendenze vengono risolte principalmente utilizzando l'IDE Android Studio, sul server CI\/CD, ogni aggiornamento pu\u00f2 trasformarsi in un incubo. Se nel web-development, la soluzione ai problemi ambientali \u00e8 diventata lo standard Docker, perch\u00e9 non provare a risolvere la stessa problematica anche nello sviluppo Android...<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nPer coloro che non sanno cos'\u00e8 Docker \u2014 in parole semplici, \u00e8 uno strumento per la creazione dei cosiddetti \"contenitori\" che contengono un nucleo minimo del sistema operativo e il set necessario di software, che possiamo distribuire dove vogliamo, mantenendo comunque l'ambiente. Cosa ci sar\u00e0 nel nostro contenitore \u00e8 definito nel Dockerfile, che poi viene compilato in un'immagine eseguibile ovunque e dotata di propriet\u00e0 di idempotenza.<\/p>\n<p>Il processo di installazione e le basi di Docker sono ben descritti nel suo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.docker.com\/get-started\">sito ufficiale<\/a><\/noindex>. Pertanto, andando un po' oltre, ecco come \u00e8 venuto il nostro Dockerfile<\/p>\n<pre><code class=\"plaintext\"># \u0422.\u043a. \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 Android-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Gradle, \n# \u0438 \u043f\u043e \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u043e\u043c\u0443 \u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u0435\u0441\u0442\u044c \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Docker-\u043e\u0431\u0440\u0430\u0437 \n# \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0432\u0437\u044f\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u0441 \u043d\u0443\u0436\u043d\u043e\u0439 \u043d\u0430\u043c \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Gradle\nFROM gradle:5.4.1-jdk8\n\n# \u0417\u0430\u0434\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u043e\u0439 \u0434\u043b\u044f Android SDK \u0438 \n# \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\nENV SDK_URL=\"https:\/\/dl.google.com\/android\/repository\/sdk-tools-linux-3859397.zip\" \n    ANDROID_HOME=\"\/usr\/local\/android-sdk\" \n    ANDROID_VERSION=28 \n    ANDROID_BUILD_TOOLS_VERSION=28.0.3\n\n# \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0442\u0443\u0434\u0430 SDK \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0430\u0440\u0445\u0438\u0432,\n# \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\nRUN mkdir \"$ANDROID_HOME\" .android \n    &amp;&amp; cd \"$ANDROID_HOME\" \n    &amp;&amp; curl -o sdk.zip $SDK_URL \n    &amp;&amp; unzip sdk.zip \n    &amp;&amp; rm sdk.zip \n# \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0440\u043e\u0447\u043a\u0430\u0445 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \n# \u0441 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\u043c\u0438. \u041d\u0430 \u043e\u0444. \u0441\u0430\u0439\u0442\u0435 Android \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0447\u0442\u043e \u043c\u044b \n# \u043c\u043e\u0436\u0435\u043c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0441 \u043c\u0430\u0448\u0438\u043d \u0433\u0434\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u044d\u0442\u0438 \n# \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043b\u0438 \u0438 \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \n# \u0438\u0445 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f\n    &amp;&amp; mkdir \"$ANDROID_HOME\/licenses\" || true \n    &amp;&amp; echo \"24333f8a63b6825ea9c5514f83c2829b004d1\" &gt; \"$ANDROID_HOME\/licenses\/android-sdk-license\" \n    &amp;&amp; echo \"84831b9409646a918e30573bab4c9c91346d8\" &gt; \"$ANDROID_HOME\/licenses\/android-sdk-preview-license\"    \n\n# \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 SDK \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 build-tools, platform-tools\nRUN $ANDROID_HOME\/tools\/bin\/sdkmanager --update\nRUN $ANDROID_HOME\/tools\/bin\/sdkmanager \"build-tools;${ANDROID_BUILD_TOOLS_VERSION}\" \n    \"platforms;android-${ANDROID_VERSION}\" \n    \"platform-tools\"\n<\/code><\/pre>\n<p>\nLo salviamo nella cartella del nostro progetto Android e avviamo la costruzione del contenitore con il comando<\/p>\n<pre><code class=\"bash\">docker build -t android-build:5.4-28-27 .<\/code><\/pre>\n<p>\nParametro <i>-t<\/i> assegna un tag o un nome al nostro contenitore, che di solito consiste nel suo nome e nella versione. Nel nostro caso lo abbiamo chiamato android-build e nella versione abbiamo indicato la combinazione delle versioni di gradle, android-sdk e platform-tools. In futuro sar\u00e0 pi\u00f9 semplice cercare l'immagine di cui abbiamo bisogno per nome utilizzando tale \"versione\".<\/p>\n<p>Dopo che la compilazione \u00e8 completata, possiamo utilizzare la nostra immagine localmente, oppure possiamo caricarla con il comando <i>docker push<\/i> su un repository pubblico o privato di immagini per scaricarla su altre macchine.<\/p>\n<p>Come esempio, assembleremo un progetto localmente. Per fare ci\u00f2, nella cartella del progetto eseguiamo il comando<\/p>\n<pre><code class=\"bash\">docker run --rm -v \"$PWD\":\/home\/gradle\/ -w \/home\/gradle android-build:5.4.1-28-27 gradle assembleDebug<\/code><\/pre>\n<p>\nAnalizziamo cosa significa: <\/p>\n<p><i>docker run<\/i> \u2014 il comando stesso per eseguire l'immagine<br \/>\n<i>-rm<\/i> \u2014 indica che dopo l'arresto del contenitore elimina tutto ci\u00f2 che \u00e8 stato creato durante la sua vita<br \/>\n<i>-v &#171;$PWD&#187;:&#x2F;home&#x2F;gradle&#x2F;<\/i> \u2014 monta la cartella attuale con il nostro progetto Android nella cartella interna del contenitore \/home\/gradle\/<br \/>\n<i>-w \/home\/gradle<\/i> \u2014 imposta la directory di lavoro del contenitore<br \/>\n<i>android-build:5.4.1-28-27<\/i> \u2014 il nome del nostro contenitore, che abbiamo assemblato<br \/>\n<i>gradle assembleDebug<\/i> \u2014 il comando di build che compila il nostro progetto<\/p>\n<p>Se tutto va bene, dopo un paio di secondi\/minuti vedrete sul vostro schermo qualcosa di simile a <b>BUILD SUCCESSFUL in 8m 3s<\/b>Ogni tanto nella cartella app\/build\/output\/apk ci sar\u00e0 l'applicazione compilata.<\/p>\n<p>Allo stesso modo, si possono eseguire altre attivit\u00e0 di gradle \u2014 controllare il progetto, eseguire test, ecc. Il principale vantaggio \u00e8 che se abbiamo bisogno di compilare il progetto su un'altra macchina, non dobbiamo preoccuparci di installare tutto l'ambiente, basta scaricare l'immagine necessaria e avviare la compilazione su di essa.<\/p>\n<p>Il container non conserva alcuna modifica, e ogni compilazione inizia da zero, il che da una parte garantisce l'identit\u00e0 della compilazione indipendentemente dal luogo in cui viene eseguita, ma dall'altra ogni volta dobbiamo scaricare tutte le dipendenze e ricompilare tutto il codice da zero, il che a volte pu\u00f2 richiedere un tempo significativo. Pertanto, oltre al normale avvio \"freddo\", abbiamo l'opzione di avviare una compilazione mantenendo il cosiddetto \"cache\", dove salviamo la cartella ~\/ .gradle semplicemente coprendola nella cartella di lavoro del progetto, e all'inizio della successiva compilazione la restituiamo indietro. Tutte le procedure di copia sono state estratte in script separati e il comando stesso di avvio \u00e8 diventato<\/p>\n<pre><code class=\"bash\">docker run --rm -v \"$PWD\":\/home\/gradle\/ -w \/home\/gradle android-build:5.4.1-28-27 \/bin\/bash -c \".\/pre.sh; gradle assembleDebug; .\/post.sh\"<\/code><\/pre>\n<p>\nIl risultato \u00e8 che il tempo medio di compilazione del progetto \u00e8 diminuito di diversi volte (a seconda del numero di dipendenze nel progetto, ma in media un progetto cos\u00ec \u00e8 diventato compilabile in 1 minuto invece di 5 minuti).<\/p>\n<p>Tutto questo ha senso solo se avete un proprio server CI\/CD interno, di cui vi occupate voi stessi. Ma ora ci sono molti servizi cloud in cui tutti questi problemi sono stati risolti e non dovete preoccuparvene, e le propriet\u00e0 necessarie della compilazione possono essere indicate anche nelle impostazioni del progetto.<\/p>\n<p class=\"for_users_only_msg\">Solo gli utenti registrati possono partecipare al sondaggio. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Accedi<\/a><\/noindex>, per favore.<\/p>\n<h2 class=\"default-block__polling-title\">Utilizzate un sistema CI\/CD interno o un servizio esterno?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Utilizziamo un server interno<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Utilizziamo un servizio esterno<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Non utilizziamo CI\/CD<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Altro<\/p>\n<\/li>\n<\/ul>\n<p>    Hanno votato 42 utenti. Si sono astenuti 16 utenti.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/465193\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Android, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041a\u0440\u043e\u043c\u0435 Android SDK, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f Kotlin, Gradle, platform-tools, build-tools. \u0418 \u0435\u0441\u043b\u0438 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043c\u0435\u0440\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Android Studio IDE, \u0442\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 CI\/CD \u043a\u0430\u0436\u0434\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37565","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Android, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/sborka-android-proekta-v-docker-kontejnere\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u0431\u043e\u0440\u043a\u0430 Android-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Android, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/sborka-android-proekta-v-docker-kontejnere\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:18:20+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:18:20+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Compilazione di un progetto Android in un container Docker | ProHoster","description":"Sviluppando un progetto per la piattaforma Android, anche il pi\u00f9 piccolo, prima o poi vi troverete ad affrontare l'ambiente di sviluppo.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/sborka-android-proekta-v-docker-kontejnere","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u0431\u043e\u0440\u043a\u0430 Android-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 | ProHoster","og:description":"\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Android, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/sborka-android-proekta-v-docker-kontejnere","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:18:20+00:00","article:modified_time":"2019-10-31T19:18:20+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37565","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 18:24:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:24:24","updated":"2026-01-23 18:24:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/37565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=37565"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/37565\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=37565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=37565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=37565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}