يتضمّن هذا البرنامج التعليمي طريقة إنشاء تطبيق 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":
الشكل 2. تطبيق Bazel التعليمي
تهانينا. لقد ثبّت للتو تطبيق Android المتوافق مع Bazel.
لاحظ أن الأمر الفرعي mobile-install
يتيح أيضًا استخدام العلامة --incremental
التي يمكن استخدامها لنشر الأجزاء التي تغيّرت في التطبيق فقط منذ آخر عملية نشر.
وتتيح أيضًا استخدام العلامة --start_app
لتشغيل التطبيق فور تثبيته.
المزيد من القراءة
لمزيد من التفاصيل، يُرجى الاطلاع على الصفحات التالية:
- فتح المشاكل على GitHub
- مزيد من المعلومات حول التثبيت على الأجهزة الجوّالة
- دمج المهام التابعة الخارجية مثل AppCompat وغوافا وJUnit من مستودعات Maven باستخدام rules_jvm_external
- يمكنك إجراء اختبارات Robolectric من خلال دمج robolectric-bazel.
- اختبار تطبيقك باستخدام اختبارات قياس حالة Android
- دمج رمز C وC++ في تطبيق Android باستخدام NDK
- اطّلع على المزيد من مشاريع Bazel على:
نتمنى لك مبنى سعيدًا!