המדריך של Bazel: בניית אפליקציה ל-Android

מדריך זה מסביר איך לבנות אפליקציה פשוטה ל-Android באמצעות Bazel.

Bazel תומכת בבניית אפליקציות ל-Android באמצעות כללי Android.

המדריך הזה מיועד למשתמשי Windows, macOS ו-Linux, והוא לא דורש ניסיון בפיתוח אפליקציות של Bazel או Android. אין צורך לכתוב קוד Android במדריך הזה.

מה תלמדו

במדריך הזה תלמדו איך:

  • כדי להגדיר את הסביבה, מתקינים את Bazel ו-Android Studio ומורידים את הפרויקט לדוגמה.
  • צריך להגדיר סביבת עבודה ב-Bazel המכילה את קוד המקור של האפליקציה וקובץ WORKSPACE שמזהה את הרמה העליונה של ספריית Workspace.
  • עדכנו את הקובץ WORKSPACE כך שיכלול קובצי עזר חיצוניים תלויים, כמו Android SDK.
  • יצירת קובץ BUILD.
  • בונים את האפליקציה עם Bazel.
  • ניתן להפעיל ולהפעיל את האפליקציה באמולטור של Android או במכשיר פיזי.

לפני שמתחילים

התקנת Bazel

לפני שמתחילים במדריך, יש להתקין את התוכנה הבאה:

  • בזל. כדי להתקין, פועלים לפי הוראות ההתקנה.
  • Android Studio: כדי להתקין את האפליקציה, פועלים לפי השלבים להורדת Android Studio. יש להפעיל את אשף ההגדרה כדי להוריד את ה-SDK ולהגדיר את הסביבה.
  • (אופציונלי) Git. באמצעות git אפשר להוריד את פרויקט האפליקציה ל-Android.

קבלת הפרויקט לדוגמה

בפרויקט לדוגמה, השתמשו בפרויקט בסיסי של אפליקציית Android במאגר הדוגמאות של Bazel.

באפליקציה הזו יש לחצן אחד שמודפס את הפתיח כשלוחצים עליו:

הודעת פתיחה

איור 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/

Build עם Bazel

הגדרת סביבת העבודה

סביבת עבודה היא ספרייה שמכילה את קובצי המקור של פרויקט תוכנה אחד או יותר, ובבסיסה יש קובץ WORKSPACE.

הקובץ WORKSPACE עשוי להיות ריק או להכיל הפניות לתלויות חיצוניות הנדרשות כדי לבנות את הפרויקט.

קודם כל, מריצים את הפקודה הבאה כדי ליצור קובץ WORKSPACE ריק:

מערכת הפעלה (OS) 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.

שילוב עם Android SDK

Bazel צריכה להפעיל את ה-SDK של Android SDK כדי ליצור את האפליקציה. המשמעות היא שצריך להוסיף מידע לקובץ WORKSPACE כדי ש-Bazel יודעת איפה למצוא אותו.

יש להוסיף את השורה הבאה לקובץ WORKSPACE:

android_sdk_repository(name = "androidsdk")

המערכת תשתמש ב-Android SDK בנתיב שאליו מפנה משתנה הסביבה ANDROID_HOME ותזהה באופן אוטומטי את רמת ה-API הגבוהה ביותר ואת הגרסה האחרונה של כלי ה-build שהותקנו באותו מיקום.

אפשר להגדיר את המשתנה ANDROID_HOME כמיקום של ה-SDK של Android. מאתרים את הנתיב ל-SDK המותקן באמצעות מנהל ה-SDK של Android Studio. בהנחה שה-SDK מותקן במיקומי ברירת מחדל, תוכלו להשתמש בפקודות הבאות כדי להגדיר את המשתנה ANDROID_HOME:

מערכת הפעלה (OS) 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"

הפקודות שלמעלה קובעות את המשתנה רק עבור הסשן הנוכחי של המעטפת. כדי שהן יהיו קבועות, הפעילו את הפקודות הבאות:

מערכת הפעלה (OS) 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, את רמת ה-API ואת גרסת כלי ה-build. כדי לעשות זאת, צריך לכלול את המאפיינים 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, צריך גם להוריד את ה-NDK של Android ולהסביר ל-Bazel איפה הוא נמצא, על ידי הוספת השורה הבאה לקובץ ה-WORKSPACE:

android_ndk_repository(name = "androidndk")

בדומה ל-android_sdk_repository, הנתיב אל ה-NDK של Android מוסק ממשתנה הסביבה ANDROID_NDK_HOME כברירת מחדל. ניתן לציין את הנתיב באופן מפורש גם עם מאפיין path ב-android_ndk_repository.

למידע נוסף, קראו את המאמר שימוש בערכת הפיתוח המקורית של Android עם Bazel.

api_level היא גרסת ה-API של Android שאליה מטרגטים ה-SDK ו-NDK. לדוגמה, 23 ל-Android 6.0 ו-25 ל-Android 7.1. אם המדיניות לא מוגדרת באופן מפורש, api_level יוגדר כברירת מחדל לרמת ה-API הגבוהה ביותר הזמינה עבור android_sdk_repository ו-android_ndk_repository.

אין צורך להגדיר את רמות ה-API לאותו ערך ב-SDK וב-NDK. הדף הזה מכיל מפה מגרסאות Android לרמות אבטחה נתמכות של NDK.

יצירת קובץ BUILD

קובץ BUILD מתאר את הקשר בין קבוצה של פלטי פלט, כמו הידור משאבי ה-Android מ-aapt או קבצים לכיתה מ-javac והתלות שלהם. יחסי תלות אלה עשויים להיות קובצי מקור (Java, C++ ) בסביבת העבודה או בתוצאות build אחרות. קובצי BUILD כתובים בשפה שנקראת Starlark.

BUILD קבצים הם חלק מקונספט ב-Bazel הידוע כהיררכיית החבילות. היררכיית החבילות היא מבנה לוגי שמכסה את מבנה הספרייה בסביבת העבודה שלכם. כל חבילה היא ספרייה (וספריות המשנה שלה) שמכילה קבוצה קשורה של קובצי מקור וקובץ BUILD. החבילה כוללת גם ספריות משנה, לא כולל תיקיות שמכילות קובץ BUILD משלה. שם החבילה הוא הנתיב לקובץ BUILD ביחס ל-WORKSPACE.

יש לשים לב שהיררכיית החבילות של Bazel&#39 שונה מהיררכיית החבילה של Java בספריית האפליקציות שלכם ל-Android שבה נמצא הקובץ BUILD, אבל יכול להיות שהספריות מאורגנות באופן זהה.

לאפליקציית Android הפשוטה במדריך הזה, קובצי המקור ב-src/main/ מורכבים מחבילה אחת בלבד. פרויקט מורכב יותר עשוי לכלול הרבה חבילות מקוננות.

הוספת כלל מסוג android_library

קובץ BUILD מכיל מספר סוגים שונים של הצהרות עבור Bazel. הסוג החשוב ביותר הוא כלל הבנייה, שמסביר ל-Bazel איך לבנות פלט תוכנה ביניים או סופי מקבוצה של קובצי מקור או יחסי תלות אחרים. Bazel מספקת שני כללי build, 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 שלמעלה. פירוש הדבר הוא שכאשר בזל בונה את הפלט של הכלל הזה, היא בודקת תחילה אם הפלט של כלל הספרייה נוצר greeter_activity. אם לא, Bazel יוצרת אותו ואז משתמשת בפלט הזה לבניית קובץ חבילת האפליקציה.

עכשיו שומרים את הקובץ וסוגרים אותו.

יוצרים את האפליקציה

אפשר לנסות לפתח את האפליקציה! מריצים את הפקודה הבאה כדי ליצור את היעד: android_binary:

bazel build //src/main:app

פקודת המשנה build מורה ל-Bazel לבנות את היעד הבא. היעד מצוין כשם של כלל build בקובץ BUILD, וכן נתיב החבילה ביחס לספריית סביבת העבודה. בדוגמה הזו, היעד הוא app ונתיב החבילה הוא //src/main/.

שימו לב שלפעמים תוכלו להשמיט את נתיב החבילה או את שם היעד, בהתאם לספריית העבודה הנוכחית שלכם בשורת הפקודה ולשם היעד. פרטים נוספים על התוויות והנתיבים לטירגוט אפשר למצוא בקטע תוויות.

Bazel תתחיל לבנות את האפליקציה לדוגמה. במהלך תהליך ה-build, הפלט שלה ייראה כך:

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

מאתרים את תוצרי ה-build

Bazel שמה את הפלט של פעולות ה-build וגם של מערכות הביניים, בספריות פלט לכל משתמש וסביבת עבודה. הספריות האלה מיוצגות בצורה סימולטנית מהמיקומים הבאים ברמה העליונה של ספריית הפרויקט, כאשר WORKSPACE הוא:

  • ב-bazel-bin מאוחסנות קובצי הפעלה בינאריים ופלטי build אחרים שניתן להפעיל
  • ב-bazel-genfiles מאחסנים קובצי מקור מתווך שנוצרו על ידי כללי Bazel
  • ב-bazel-out נשמרים סוגי פלט אחרים של גרסאות build

Bazel מאחסנת את קובץ .apk של Android שנוצר באמצעות הכלל android_binary בספריית bazel-bin/src/main, שבה שם ספריית המשנה src/main נגזר על שם החבילה של Bazel.

בשורת הפקודה, מציינים את התוכן של הספרייה הזו ומוצאים את הקובץ app.apk:

מערכת הפעלה (OS) 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 לפני הפריסה. אפשר גם לבחור להתקין את האפליקציה באמולטור Android שכלול ב-Android Studio. יש לוודא שאמולטור פועל לפני ביצוע הפקודה הבאה.

הזן את הפרטים הבאים:

bazel mobile-install //src/main:app

לאחר מכן, אתר את ה "Bazel guide App" והפעל אותו:

אפליקציית מדריך של Bazel

איור 2. אפליקציית המדריך של Bazel.

מזל טוב! התקנת עכשיו את האפליקציה הראשונה שלך ל-Bazel.

חשוב לזכור שפקודת המשנה mobile-install תומכת גם בדגל --incremental שיכול לשמש לפריסה רק של החלקים באפליקציה שהשתנו מאז הפריסה האחרונה.

הוא תומך גם בסימון --start_app כדי להפעיל את האפליקציה מיד לאחר ההתקנה.

קריאה נוספת

פרטים נוספים מופיעים בדפים הבאים:

בניין שמח!