Прављење Андроид пројекта у Доцкер контејнеру

Када развијате пројекат за Андроид платформу, чак и најмањи, пре или касније морате се позабавити развојним окружењем. Поред Андроид СДК-а, потребно је имати најновију верзију Котлина, Градле-а, алата за платформу, алата за изградњу. А ако се на машини програмера све ове зависности решавају у већој мери помоћу Андроид Студио ИДЕ, онда на ЦИ/ЦД серверу свако ажурирање може да се претвори у главобољу. А ако је у веб развоју Доцкер постао стандардно решење за проблем окружења, зашто онда не бисте покушали да решите сличан проблем у Андроид развоју користећи га...

За оне који не знају шта је Доцкер, поједностављено речено, то је алат за креирање тзв. „контејнери“ који садрже минимално језгро ОС-а и неопходан сет софтвера који можемо да применимо где год желимо, уз очување окружења. Шта ће тачно бити у нашем контејнеру одређује се у Доцкерфиле-у, који се затим склапа у слику која се може покренути било где и има својства идемпотенције.

Процес инсталације и основе Доцкер-а су савршено описани у његовом званични сајт. Стога, гледајући мало унапред, ово је Доцкерфиле са којим смо завршили:

# Т.к. основным инструментом для сборки Android-проектов является Gradle, 
# и по счастливому стечению обстоятельств есть официальный Docker-образ 
# мы решили за основу взять именно его с нужной нам версией Gradle
FROM gradle:5.4.1-jdk8

# Задаем переменные с локальной папкой для Android SDK и 
# версиями платформы и инструментария
ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" 
    ANDROID_HOME="/usr/local/android-sdk" 
    ANDROID_VERSION=28 
    ANDROID_BUILD_TOOLS_VERSION=28.0.3

# Создаем папку, скачиваем туда SDK и распаковываем архив,
# который после сборки удаляем
RUN mkdir "$ANDROID_HOME" .android 
    && cd "$ANDROID_HOME" 
    && curl -o sdk.zip $SDK_URL 
    && unzip sdk.zip 
    && rm sdk.zip 
# В следующих строчках мы создаем папку и текстовые файлы 
# с лицензиями. На оф. сайте Android написано что мы 
# можем копировать эти файлы с машин где вручную эти 
# лицензии подтвердили и что автоматически 
# их сгенерировать нельзя
    && mkdir "$ANDROID_HOME/licenses" || true 
    && echo "24333f8a63b6825ea9c5514f83c2829b004d1" > "$ANDROID_HOME/licenses/android-sdk-license" 
    && echo "84831b9409646a918e30573bab4c9c91346d8" > "$ANDROID_HOME/licenses/android-sdk-preview-license"    

# Запускаем обновление SDK и установку build-tools, platform-tools
RUN $ANDROID_HOME/tools/bin/sdkmanager --update
RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" 
    "platforms;android-${ANDROID_VERSION}" 
    "platform-tools"

Чувамо га у фасциклу са нашим Андроид пројектом и почињемо да правимо контејнер помоћу команде

docker build -t android-build:5.4-28-27 .

Параметар -t специфицира ознаку или назив нашег контејнера, који се обично састоји од његовог имена и верзије. У нашем случају смо га назвали андроид-буилд, ау верзији смо навели скуп верзија градле, андроид-сдк и платформ-тоолс. У будућности ће нам бити лакше да тражимо слику која нам је потребна по имену користећи ову „верзију“.

Након што се склоп заврши, можемо користити нашу слику локално, можемо је преузети командом доцкер пусх у јавно или приватно складиште слика да бисте га преузели на друге машине.

Као пример, хајде да направимо пројекат локално. Да бисте то урадили, у фасцикли са пројектом покрените команду

docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebug

Хајде да схватимо шта то значи:

доцкер рун - сама команда за покретање слике
-рм — значи да након што се контејнер заустави, он брише све што је створено током свог живота
-в "$ПВД":/хоме/градле/ — монтира тренутну фасциклу са нашим Андроид пројектом у интерну фасциклу контејнера /хоме/градле/
-в /хоме/градле — специфицира радни директоријум контејнера
андроид-буилд:5.4.1-28-27 — назив нашег контејнера који смо прикупили
градле ассемблеДебуг — стварни монтажни тим који саставља наш пројекат

Ако све прође како треба, за пар секунди/минута видећете на екрану нешто слично ГРАДЊА УСПЕШНА за 8м 3с! А фолдер апп/буилд/оутпут/апк ће садржати састављену апликацију.

Слично томе, можете обављати друге градле задатке - проверити пројекат, покренути тестове итд. Главна предност је у томе што ако треба да изградимо пројекат на било којој другој машини, не морамо да бринемо о инсталацији целог окружења, а биће довољно да преузмемо потребну слику и покренемо буилд у њој.

Контејнер не чува никакве измене, а сваки склоп се покреће од нуле, што, с једне стране, гарантује идентитет склопа без обзира на то где је покренут, са друге стране, сваки пут када морате да преузмете све зависности и поново компајлирајте сав код, а то понекад може потрајати значајно време. Стога, поред уобичајеног „хладног” старта, имамо опцију покретања монтаже уз одржавање тзв. „кеш“, где чувамо фасциклу ~/.градле једноставним копирањем у радну фасциклу пројекта, а на почетку следеће израде враћамо је назад. Преместили смо све процедуре копирања у засебне скрипте и сама команда за покретање почела је да изгледа овако

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"

Као резултат тога, наше просечно време израде пројекта је смањено неколико пута (у зависности од броја зависности од пројекта, али је просечан пројекат тако почео да се склапа за 1 минут уместо за 5 минута).

Све ово само по себи има смисла само ако имате свој интерни ЦИ/ЦД сервер, који сами подржавате. Али сада постоји много услуга у облаку у којима су сви ови проблеми решени и не морате да бринете о томе, а неопходна својства изградње такође се могу навести у подешавањима пројекта.

Само регистровани корисници могу учествовати у анкети. Пријавите се, Добродошао си.

Да ли свој ЦИ/ЦД систем држите у кући или користите услугу треће стране?

  • Користимо интерни сервер

  • Коришћење спољне услуге

  • Не користимо ЦИ/ЦД

  • други

42 корисника је гласало. 16 корисника је било уздржано.

Извор: ввв.хабр.цом

Додај коментар