البرنامج التعليمي بازيل: إنشاء تطبيق متوافق مع Android

يتضمّن هذا البرنامج التعليمي طريقة إنشاء تطبيق Android بسيط باستخدام Bazel.

يدعم Bazel تطبيقات Android باستخدام قواعد Android.

هذا البرنامج التعليمي مخصّص لمستخدمي أنظمة التشغيل Windows وmacOS وLinux ولا يتطلب خبرة في مجال تطوير التطبيقات على Bazel أو Android. ولن تحتاج إلى كتابة أي رمز Android في هذا البرنامج التعليمي.

ما ستتعرَّف عليه

في هذا البرنامج التعليمي، ستتعرّف على كيفية:

  • يمكنك إعداد بيئتك من خلال تثبيت Bazel وAndroid Studio وتنزيل نموذج المشروع.
  • اضبط مساحة عمل في Bazel تتضمّن رمز المصدر للتطبيق وملف WORKSPACE يحدّد المستوى الأعلى لدليل مساحة العمل.
  • عدِّل ملف WORKSPACE لاحتواء المراجع على التبعيات الخارجية المطلوبة، مثل حزمة تطوير البرامج (SDK) لنظام التشغيل Android.
  • أنشِئ ملف BUILD.
  • بناء التطبيق باستخدام Bazel
  • انشر التطبيق وشغِّله على محاكي Android أو جهاز فعلي.

قبل البدء

تثبيت Bazel

قبل بدء البرنامج التعليمي، ثبِّت البرنامج التالي:

  • البندق. للتثبيت، اتّبِع تعليمات التثبيت.
  • استوديو Android: لتثبيت التطبيق، اتّبِع خطوات تنزيل "استوديو Android". نفِّذ معالج الإعداد لتنزيل حزمة تطوير البرامج (SDK) وإعداد بيئتك.
  • (اختياري) المقياس. استخدِم git لتنزيل مشروع تطبيق Android.

الحصول على نموذج المشروع

بالنسبة إلى نموذج المشروع، استخدِم مشروعًا أساسيًا لتطبيق Android في مستودع أمثلة Bazel's.

يحتوي هذا التطبيق على زر واحد يطبع رسالة ترحيب عند النقر عليه:

تحية الزر

الشكل 1. تحية على زر تطبيق Android.

انسَخ المستودع باستخدام git (أو نزِّل ملف ZIP مباشرةً):

git clone https://github.com/bazelbuild/examples

يمكنك الاطّلاع على نموذج المشروع لهذا البرنامج التعليمي في examples/android/tutorial. وبالنسبة إلى بقية البرنامج التعليمي، سيتم تنفيذ الأوامر الواردة في هذا الدليل.

مراجعة الملفات المصدر

ألقِ نظرة على ملفات المصدر للتطبيق.

.
├── README.md
└── src
    └── main
        ├── AndroidManifest.xml
        └── java
            └── com
                └── example
                    └── bazel
                        ├── AndroidManifest.xml
                        ├── Greeter.java
                        ├── MainActivity.java
                        └── res
                            ├── layout
                            │   └── activity_main.xml
                            └── values
                                ├── colors.xml
                                └── strings.xml

الملفات والأدلة الرئيسية هي:

الاسم الموقع
ملفات بيان Android src/main/AndroidManifest.xml وsrc/main/java/com/example/bazel/AndroidManifest.xml
ملفات مصدر Android src/main/java/com/example/bazel/MainActivity.java وGreeter.java
دليل ملفات الموارد src/main/java/com/example/bazel/res/

إنشاء المحتوى باستخدام Bazel

إعداد مساحة العمل

workspace هي دليل يحتوي على ملفات المصدر لمشروع برمجي واحد أو أكثر، ويتضمّن ملف WORKSPACE في جذره.

قد يكون ملف WORKSPACE فارغًا أو قد يحتوي على إشارات إلى العناصر التابعة الخارجية المطلوبة لإنشاء مشروعك.

أولاً، شغِّل الأمر التالي لإنشاء ملف WORKSPACE فارغ:

نظام التشغيل Command
Linux وmacOS touch WORKSPACE
نظام التشغيل Windows (موجّه الأوامر) type nul > WORKSPACE
نظام التشغيل Windows (PowerShell) New-Item WORKSPACE -ItemType file

رياضة الجري

يمكنك الآن التحقق مما إذا كان تطبيق Bazel يعمل بشكل صحيح باستخدام الأمر:

bazel info workspace

إذا اطبع Bazel مسار الدليل الحالي، فأنت على ما يرام. في حال عدم توفّر الملف WORKSPACE، قد تظهر لك رسالة خطأ مثل:

ERROR: The 'info' command is only supported from within a workspace.

الدمج مع حزمة تطوير البرامج (SDK) لنظام التشغيل Android

يحتاج Bazel إلى تشغيل حزمة تطوير البرامج (SDK) لنظام التشغيل Android SDK لإنشاء التطبيق. هذا يعني أنك تحتاج إلى إضافة بعض المعلومات إلى ملف WORKSPACE حتى يعرف Bazel مكان العثور عليها.

أضِف السطر التالي إلى ملف WORKSPACE:

android_sdk_repository(name = "androidsdk")

ستستخدم هذه الحزمة حزمة تطوير البرامج (SDK) لنظام التشغيل Android في المسار الذي يشير إليه متغيّر البيئة ANDROID_HOME، وسترصد تلقائيًا أعلى مستوى من واجهة برمجة التطبيقات وأحدث إصدار من أدوات الإصدار المثبّتة في ذلك الموقع الجغرافي.

يمكنك ضبط المتغير ANDROID_HOME على موقع حزمة تطوير البرامج (SDK) لنظام التشغيل Android. ابحث عن المسار إلى حزمة تطوير البرامج (SDK) المُثبّتة باستخدام مدير تطوير البرامج في "استوديو Android". بافتراض أنّ حزمة تطوير البرامج (SDK) مثبّتة في المواقع التلقائية، يمكنك استخدام الأوامر التالية لضبط المتغيّر ANDROID_HOME:

نظام التشغيل Command
Linux export ANDROID_HOME=$HOME/Android/Sdk/
macOS export ANDROID_HOME=$HOME/Library/Android/sdk
نظام التشغيل Windows (موجّه الأوامر) set ANDROID_HOME=%LOCALAPPDATA%\Android\Sdk
نظام التشغيل Windows (PowerShell) $env:ANDROID_HOME="$env:LOCALAPPDATA\Android\Sdk"

تعمل الأوامر الواردة أعلاه على ضبط المتغيّر فقط لجلسة واجهة المستخدم الحالية. ولإجراء ذلك بشكل دائم، شغِّل الأوامر التالية:

نظام التشغيل Command
Linux echo "export ANDROID_HOME=$HOME/Android/Sdk/" >> ~/.bashrc
macOS echo "export ANDROID_HOME=$HOME/Library/Android/Sdk/" >> ~/.bashrc
نظام التشغيل Windows (موجّه الأوامر) setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk"
نظام التشغيل Windows (PowerShell) [System.Environment]::SetEnvironmentVariable('ANDROID_HOME', "$env:LOCALAPPDATA\Android\Sdk", [System.EnvironmentVariableTarget]::User)

ويمكنك أيضًا تحديد المسار المطلق لحزمة تطوير البرامج (SDK) لنظام التشغيل Android ومستوى واجهة برمجة التطبيقات وإصدار أدوات الإصدار المطلوب استخدامه من خلال تضمين السمات path وapi_level وbuild_tools_version. وفي حال عدم تحديد api_level وbuild_tools_version، ستستخدم القاعدة android_sdk_repository أحدث إصدار معنيّ بحزمة تطوير البرامج (SDK). يمكنك تحديد أي تركيبة من هذه السمات، طالما أنها متوفّرة في حزمة تطوير البرامج (SDK)، على سبيل المثال:

android_sdk_repository(
    name = "androidsdk",
    path = "/path/to/Android/sdk",
    api_level = 25,
    build_tools_version = "30.0.3"
)

في نظام التشغيل Windows، لاحظ أنّ السمة path يجب أن تستخدم المسار ذي النمط المختلط، أي أنّه مسار Windows مع شرطة مائلة للأمام:

android_sdk_repository(
    name = "androidsdk",
    path = "c:/path/to/Android/sdk",
)

اختياري: إذا أردت تجميع رمز أصلي في تطبيق Android، عليك أيضًا تنزيل Android NDK وإخبار Bazel بمكان العثور عليه عن طريق إضافة السطر التالي إلى ملف WORKSPACE:

android_ndk_repository(name = "androidndk")

وعلى غرار android_sdk_repository، يتم تلقائيًا استنتاج المسار إلى Android NDK من متغيّر البيئة ANDROID_NDK_HOME. ويمكن أيضًا تحديد المسار صراحةً باستخدام السمة path في android_ndk_repository.

لمزيد من المعلومات، يُرجى الاطّلاع على استخدام حزمة تطوير البرامج المتوافقة مع نظام التشغيل Android مع Bazel.

api_level هو إصدار واجهة برمجة تطبيقات Android الذي تستهدفه حزمة تطوير البرامج (SDK) وNDK، على سبيل المثال: 23 لنظام التشغيل Android 6.0 و25 لنظام التشغيل Android 7.1. في حال عدم ضبط هذه السياسة بشكلٍ صريح، سيتم تلقائيًا ضبط السمة api_level على أعلى مستوى متاح من واجهة برمجة التطبيقات للسمتَين android_sdk_repository وandroid_ndk_repository.

ليس من الضروري ضبط مستويات واجهة برمجة التطبيقات على القيمة نفسها لحزمة تطوير البرامج (SDK) وNDK. تحتوي هذه الصفحة على خريطة من إصدارات Android إلى مستويات واجهة برمجة التطبيقات المتوافقة مع NDK.

إنشاء ملف BUILD

يصف ملف BUILD العلاقة بين مجموعة من مخرجات الإصدار، مثل موارد Android المجمّعة من aapt أو ملفات الفئة من javac واعتمادياتها. قد تكون هذه المهام التابعة ملفات مصدر (Java أو C++ ) في مساحة العمل أو نتائج إنشاء أخرى. تتم كتابة ملفات BUILD بلغة Starlark.

ملفات BUILD هي جزء من مفهوم في Bazel يُعرف باسم التسلسل الهرمي للحزمة. التدرج الهرمي للحزمة هو بنية منطقية تتراكب على بنية الدليل في مساحة العمل. كل حزمة هي دليل (وأدلةه الفرعية) يحتوي على مجموعة ذات صلة من ملفات المصدر وملف BUILD. تشمل الحزمة أيضًا أي أدلة فرعية، باستثناء تلك التي تحتوي على ملف BUILD الخاص بها. اسم الحزمة هو المسار لملف BUILD المرتبط بـ WORKSPACE.

يُرجى العِلم أنّ العرض الهرمي لحزمة Bazel يختلف عن التسلسل الهرمي لحزمة Java في دليل تطبيقات Android الذي يتضمّن ملف BUILD، على الرغم من أنّ الأدلة قد يتم تنظيمها بشكل متطابق.

بالنسبة إلى تطبيق Android البسيط في هذا البرنامج التعليمي، تتضمّن ملفات المصدر في src/main/ حزمة Bazel واحدة. قد يحتوي مشروع أكثر تعقيدًا على العديد من الحِزم المتداخلة.

إضافة قاعدة android_library

يتضمّن ملف BUILD أنواعًا مختلفة من إقرارات Bazel. والنوع الأكثر أهمية هو قاعدة الإنشاء التي تخبر Bazel بكيفية إنشاء إخراج برمجيات متوسطة أو نهائية من مجموعة من ملفات المصدر أو تبعيات أخرى. توفّر Bazel قاعدتين للإصدار، android_library وandroid_binary، يمكنك استخدامهما لإنشاء تطبيق Android.

في هذا البرنامج التعليمي، ستستخدم أولاً القاعدة android_library لإبلاغ Bazel بإنشاء وحدة مكتبة مكتبة Android من رمز مصدر التطبيق وملفات الموارد. بعد ذلك، ستستخدم قاعدة android_binary لإعلام Bazel بكيفية إنشاء حزمة تطبيقات Android.

يمكنك إنشاء ملف BUILD جديد في الدليل src/main/java/com/example/bazel، والإعلان عن هدف android_library جديد:

src/main/java/com/example/bazel/BUILD:

package(
    default_visibility = ["//src:__subpackages__"],
)

android_library(
    name = "greeter_activity",
    srcs = [
        "Greeter.java",
        "MainActivity.java",
    ],
    manifest = "AndroidManifest.xml",
    resource_files = glob(["res/**"]),
)

تحتوي قاعدة الإصدار android_library على مجموعة من السمات التي تحدّد المعلومات التي يحتاجها Bazel لإنشاء وحدة مكتبة من الملفات المصدر. يُرجى ملاحظة أن اسم القاعدة هو greeter_activity. وستشير إلى القاعدة التي تستخدم هذا الاسم كاعتمادية في قاعدة android_binary.

إضافة قاعدة android_binary

تُنشئ القاعدة android_binary حزمة تطبيق Android (ملف .apk) لتطبيقك.

يمكنك إنشاء ملف BUILD جديد في الدليل src/main/، والإعلان عن هدف android_binary جديد:

src/main/BUILD:

android_binary(
    name = "app",
    manifest = "AndroidManifest.xml",
    deps = ["//src/main/java/com/example/bazel:greeter_activity"],
)

تشير هذه السمة deps إلى مخرجات القاعدة greeter_activity التي أضفتها إلى ملف BUILD أعلاه. هذا يعني أنّه عند إنشاء Bazel لإخراج هذه القاعدة، تتحقّق أولاً ممّا إذا كان تم إنشاء ناتج قاعدة المكتبة greeter_activity وحديثًا. وإذا لم يكن الأمر كذلك، سينشئه التطبيق ثم يستخدم المخرجات لإنشاء ملف حزمة التطبيق.

والآن، احفظ الملف وأغلقه.

إنشاء التطبيق

يُرجى محاولة إنشاء التطبيق. شغِّل الأمر التالي لإنشاء هدف android_binary:

bazel build //src/main:app

يفرض الأمر الفرعي build على Bazel إنشاء الهدف التالي. يتم تحديد الهدف باعتباره اسم قاعدة إصدار داخل ملف BUILD، بالإضافة إلى مسار الحزمة المرتبط بدليل مساحة العمل. في هذا المثال، الهدف هو app ومسار الحزمة هو //src/main/.

تجدر الإشارة إلى أنه يمكنك أحيانًا حذف مسار الحزمة أو اسم الهدف، اعتمادًا على دليل العمل الحالي في سطر الأوامر واسم الهدف. لمزيد من التفاصيل عن التصنيفات والمسارات المستهدفة، يُرجى الاطّلاع على التصنيفات.

سيبدأ Bazel في إنشاء نموذج للتطبيق. أثناء عملية الإنشاء، سيبدو الناتج مثل ما يلي:

INFO: Analysed target //src/main:app (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //src/main:app up-to-date:
  bazel-bin/src/main/app_deploy.jar
  bazel-bin/src/main/app_unsigned.apk
  bazel-bin/src/main/app.apk

تحديد مخرجات الإصدار

تضع Bazel مخرجات عمليات الإصدار المتوسطة والأخيرة في مجموعة من أدلة المخرجات لكل مستخدم في كل مساحة عمل. يتم ربط هذه الأدلة من المواقع الجغرافية التالية على المستوى الأعلى من دليل المشروع، حيث تكون العلامة WORKSPACE:

  • تخزّن bazel-bin الملفات التنفيذية الثنائية ومخرجات الإصدار القابلة للتشغيل الأخرى
  • تخزّن bazel-genfiles ملفات المصدر الوسيطة التي يتم إنشاؤها من خلال قواعد Bazel
  • تخزّن bazel-out أنواعًا أخرى من مخرجات الإصدار

يخزّن Bazel ملف Android .apk الذي تم إنشاؤه باستخدام القاعدة android_binary في الدليل bazel-bin/src/main، حيث يكون اسم الدليل الفرعي src/main مشتقًا من اسم حزمة Bazel.

في موجِّه الأوامر، اعرض محتوى هذا الدليل وابحث عن ملف app.apk:

نظام التشغيل Command
Linux وmacOS ls bazel-bin/src/main
نظام التشغيل Windows (موجّه الأوامر) dir bazel-bin\src\main
نظام التشغيل Windows (PowerShell) ls bazel-bin\src\main

تشغيل التطبيق

يمكنك الآن نشر التطبيق على جهاز Android أو محاكٍ متصل من سطر الأوامر باستخدام الأمر bazel mobile-install. يستخدم هذا الأمر مجموعة إعدادات Android Debug Bridge (adb) للتواصل مع الجهاز. يجب إعداد جهازك لاستخدام adb باتباع التعليمات الواردة في Android Debug Bridge قبل النشر. يمكنك أيضًا اختيار تثبيت التطبيق على محاكي Android المضمّن في "استوديو Android". تأكّد من أنّ المحاكي قيد التشغيل قبل تنفيذ الأمر أدناه.

أدخل ما يلي:

bazel mobile-install //src/main:app

بعد ذلك، ابحث عن "Bazel Webinar App&quot:

تطبيق Bazel التعليمي

الشكل 2. تطبيق Bazel التعليمي

تهانينا. لقد ثبّت للتو تطبيق Android المتوافق مع Bazel.

لاحظ أن الأمر الفرعي mobile-install يتيح أيضًا استخدام العلامة --incremental التي يمكن استخدامها لنشر الأجزاء التي تغيّرت في التطبيق فقط منذ آخر عملية نشر.

وتتيح أيضًا استخدام العلامة --start_app لتشغيل التطبيق فور تثبيته.

المزيد من القراءة

لمزيد من التفاصيل، يُرجى الاطلاع على الصفحات التالية:

نتمنى لك مبنى سعيدًا!