מדריך זה מסביר איך לבנות אפליקציה פשוטה ל-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' שונה מהיררכיית החבילה של 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" והפעל אותו:
איור 2. אפליקציית המדריך של Bazel.
מזל טוב! התקנת עכשיו את האפליקציה הראשונה שלך ל-Bazel.
חשוב לזכור שפקודת המשנה mobile-install
תומכת גם בדגל --incremental
שיכול לשמש לפריסה רק של החלקים באפליקציה שהשתנו מאז הפריסה האחרונה.
הוא תומך גם בסימון --start_app
כדי להפעיל את האפליקציה מיד לאחר ההתקנה.
קריאה נוספת
פרטים נוספים מופיעים בדפים הבאים:
- בעיות פתוחות ב-GitHub
- למידע נוסף על התקנה בנייד
- משלבים יחסי תלות חיצוניים כמו Appcompat, Guaba ו-JUnit ממאגר Maven באמצעות rules_jvm_external
- הרצת בדיקות Robolectric באמצעות השילוב של robolectric-bazel.
- בדיקת האפליקציה באמצעות בדיקות אינסטרומנטציה ל-Android
- שילוב של קוד C ו-C++ באפליקציה ל-Android עם NDK
- עוד פרויקטים לדוגמה ב-Bazel:
בניין שמח!