عند تطوير مشروع لمنصة Android ، يجب أن يتعامل حتى أصغرها ، عاجلاً أم آجلاً ، مع بيئة التطوير. بالإضافة إلى Android SDK ، فأنت بحاجة إلى أحدث إصدار من Kotlin و Gradle وأدوات النظام الأساسي وأدوات البناء. وإذا تم حل جميع هذه التبعيات على جهاز المطور بدرجة أكبر باستخدام Android Studio IDE ، فيمكن أن يتحول كل تحديث على خادم CI / CD إلى صداع. إذا كان Docker هو الحل القياسي لمشكلة البيئة في تطوير الويب ، فلماذا لا نحاول حل مشكلة مماثلة معها في تطوير Android ...
بالنسبة لأولئك الذين لا يعرفون ما هو Docker - إذا كان الأمر بسيطًا جدًا ، فهذه أداة لإنشاء ما يسمى Docker. "حاويات" حيث يتم تضمين الحد الأدنى لنظام التشغيل ومجموعة البرامج الضرورية ، والتي يمكننا نشرها أينما نريد ، مع الحفاظ على البيئة. يتم تحديد ما سيكون بالضبط في الحاوية الخاصة بنا في Dockerfile ، والتي يتم تجميعها بعد ذلك في صورة تم إطلاقها في أي مكان وتمتلك خصائص عاطفية.
تم وصف عملية التثبيت وأساسيات Docker تمامًا على موقعها
الرسمي . لذلك ، مع التقدم قليلاً ، هنا لدينا مثل Dockerfile
# .. 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"
نقوم بحفظه في المجلد باستخدام مشروع Android الخاص بنا وبدء تجميع الحاوية باستخدام الأمر
docker build -t android-build:5.4-28-27 .
يحدد
الخيار -t علامة أو اسم الحاوية الخاصة بنا ، والتي تتكون عادةً من اسمها وإصدارها. في حالتنا ، أطلقنا عليها اسم android-build ، وفي الإصدار حددنا مجموعة من إصدارات أدوات gradle و android-sdk وأدوات النظام الأساسي. في المستقبل ، سيكون من الأسهل علينا البحث عن الصورة التي نحتاجها بالاسم باستخدام هذا "الإصدار".
بعد مرور التجميع ، يمكننا استخدام صورتنا محليًا ، يمكننا تحميلها باستخدام أمر
docker push إلى مستودع صور عام أو خاص لتنزيلها على أجهزة أخرى.
كمثال ، نجمع المشروع محليًا. للقيام بذلك ، قم بتنفيذ الأمر في مجلد المشروع
docker run --rm -v "$PWD":/home/gradle/ -w /home/gradle android-build:5.4.1-28-27 gradle assembleDebug
دعونا نرى ما يعنيه:
تشغيل عامل ميناء - الأمر إطلاق الصور نفسه
-
rm - يعني أنه بعد إيقاف الحاوية ، يزيل كل ما تم إنشاؤه في عملية حياته من وراءه
-v "$ PWD": / home / gradle / - يحمّل المجلد الحالي من خلال مشروع Android الخاص بنا إلى المجلد الداخلي للحاوية / home / gradle /
-w / home / gradle - يحدد دليل عمل الحاوية
android-build: 5.4.1-28-27 - اسم الحاوية التي
جمعناهاgradle assembleDebug - في الواقع فريق البناء الذي يبني مشروعنا
إذا سارت الأمور على ما يرام ، فبعد بضع ثوانٍ / دقائق سترى على الشاشة شيئًا مثل
BUILD SUCCESSFUL في 8m 3s ! وفي مجلد التطبيق / build / output / apk سيكون التطبيق المجمع.
بنفس الطريقة ، يمكنك القيام بمهام أخرى للمهارة - التحقق من المشروع ، تشغيل الاختبارات ، إلخ. الميزة الأساسية هي أنه إذا كنت بحاجة إلى إنشاء المشروع على أي جهاز آخر ، فلا داعي للقلق بشأن تثبيت البيئة بأكملها وسيكون ذلك كافياً لتنزيل الصورة اللازمة وتشغيل التجميع فيها.
لا تقوم الحاوية بتخزين أي تغييرات ، ويبدأ كل تجميع من نقطة الصفر ، مما يضمن من ناحية هوية التجميع بغض النظر عن المكان الذي تم إطلاقه فيه ، من ناحية أخرى ، في كل مرة يتعين عليك تنزيل جميع التبعيات وتجميع التعليمات البرمجية بأكملها مرة أخرى ، وقد يستغرق هذا وقتًا كبيرًا في بعض الأحيان. لذلك ، بالإضافة إلى البداية "الباردة" المعتادة ، لدينا خيار بدء التجميع مع الحفاظ على ما يسمى. "ذاكرة التخزين المؤقت" ، حيث نقوم بحفظ مجلد ~ / .gradle ببساطة بنسخه إلى مجلد العمل الخاص بالمشروع ، وفي بداية الإصدار التالي ، نعيده مرة أخرى. لقد وضعنا جميع إجراءات النسخ في نصوص منفصلة وبدأ أمر التشغيل نفسه في الظهور بهذا الشكل
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"
نتيجة لذلك ، تم تخفيض متوسط وقت تجميع المشروع بالنسبة لنا عدة مرات (اعتمادًا على عدد التبعيات في المشروع ، ولكن بدأ متوسط المشروع بالتجمع في دقيقة واحدة بدلاً من 5 دقائق).
كل هذا في حد ذاته منطقي فقط إذا كان لديك خادم CI / CD داخلي خاص بك ، والذي تشارك فيه أنت بنفسك. ولكن هناك الآن العديد من الخدمات السحابية التي تم حل كل هذه المشكلات فيها ولا داعي للقلق بشأن هذا ويمكنك أيضًا تحديد خصائص التجميع اللازمة في إعدادات المشروع.