BazelCon 2022 מגיע בין 16 ל-17 בנובמבר לניו יורק באינטרנט.
הירשמו עוד היום!

כללי Android

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

כללים

android_binary

android_binary(name, deps, srcs, assets, assets_dir, compatible_with, crunch_png, custom_package, debug_key, debug_signing_keys, debug_signing_lineage_file, densities, deprecation, dex_shards, dexopts, distribs, enable_data_binding, exec_compatible_with, exec_properties, features, incremental_dexing, instruments, javacopts, key_rotation_min_sdk, licenses, main_dex_list, main_dex_list_opts, main_dex_proguard_specs, manifest, manifest_values, multidex, nocompress_extensions, package_id, plugins, proguard_apply_dictionary, proguard_apply_mapping, proguard_generate_mapping, proguard_specs, resource_configuration_filters, resource_files, restricted_to, shrink_resources, tags, target_compatible_with, testonly, visibility)

יוצר קבצים של חבילת אפליקציות ל-Android (.APK).

יעדי פלט מרומזים

  • name.apk: קובץ חבילה של אפליקציה ל-Android החתום באמצעות מפתחות ניפוי באגים ומיושר לפנים, אפשר להשתמש בו לפיתוח ולניפוי באגים באפליקציה. לא ניתן לשחרר את האפליקציה לאחר חתימה על מפתחות ניפוי הבאגים.
  • name_unsigned.apk: גרסה לא חתומה של הקובץ שלמעלה, שייתכן שחתומה על ידי מפתחות הגרסה לפני ההשקה לציבור.
  • name_deploy.jar: ארכיון Java שמכיל את הסגירה העקיפה של היעד הזה.

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

  • name_proguard.jar: ארכיון Java שמכיל תוצאה של הרצת ProGuard ב-name_deploy.jar. הפלט נוצר רק אם צוין המאפיין proguard_specs.
  • name_proguard.map: תוצאת קובץ מיפוי של הפעלת ProGuard ב-name_deploy.jar. הפלט נוצר רק אם צוין המאפיין proguard_specs ומוגדר proguard_create_mapping או shrink_resources.

דוגמאות

דוגמאות לכללים ל-Android אפשר למצוא בספריית examples/android של עץ המקור בזל.

ארגומנטים

מאפיינים
name

Name; required

שם ייחודי ליעד הזה.

deps

List of labels; optional

רשימת הספריות האחרות שיש לקשר ליעד הבינארי. סוגי הספריות המותרים הם: android_library, java_library עם מגבלת android ו-cc_library עיטוף או יצירה של .so ספריות מקוריות לפלטפורמת היעד של Android.
srcs

List of labels; optional

רשימת קובצי המקור שעובדו כדי ליצור את היעד.

הידור של srcs קבצים מסוג .java. לקריאה ולהורדה של הנתונים, לא כדאי להזין את השם של קובץ המקור .java שנוצר ב-srcs. במקום זאת, יש להזין את השם של הכלל התלוי ב-srcs, כפי שמתואר בהמשך.

srcs קבצים מסוג .srcjar לא ארוזים ומעובדים. (מומלץ להשתמש באפשרות הזאת אם צריך ליצור קבוצה של קובצי JavaScript עם ג'ירולה או תוסף build).

assets

List of labels; optional

רשימת הנכסים לאריזה. בדרך כלל, זהו glob של כל הקבצים בספרייה assets. ניתן גם לעיין בכללים אחרים (כל כלל שמפיק קבצים) או קבצים שיוצאו בחבילות האחרות, כל עוד כל הקבצים האלה נמצאים בספרייה assets_dir בחבילה המתאימה.
assets_dir

String; optional

המחרוזת שמספקת את הנתיב לקבצים ב-assets. הזוג assets ו-assets_dir מתארים נכסים ארוזים, וצריך לספק את שני המאפיינים או את שניהם.
crunch_png

Boolean; optional; default is True

לבצע חיתוך PNG (או לא). זה לא תלוי בעיבוד של 9 עדכונים, שהם תמיד מתבצעים. זהו פתרון זמני שהוצא משימוש עבור באג Aapt שתוקן ב-aapt2.
custom_package

String; optional

חבילת Java שעבורה המערכת תיצור מקורות של Java. כברירת מחדל, המערכת מסיקה את החבילה מהספרייה שבה נמצא קובץ ה-BUILD שמכיל את הכלל. אפשר לציין חבילה אחרת אבל לא מומלץ להשתמש בה, כי היא עלולה לגרום להתנגשויות בין classpath לבין ספריות אחרות שיזוהו רק בזמן הריצה.
debug_key

Label; optional; default is @bazel_tools//tools/android:debug_keystore

קובץ המכיל את מאגר ניפוי הבאגים שישמש לחתימה על APK של ניפוי באגים. בדרך כלל לא ברצונך להשתמש במפתח שאינו מפתח ברירת המחדל, לכן יש להשמיט את המאפיין הזה.

אזהרה: אין להשתמש במפתחות הייצור, הם צריכים להיות מוגנים היטב ולא נמצאים בעץ המקור.

debug_signing_keys

List of labels; optional

רשימת הקבצים, ניפוי הבאגים של מאגר המפתחות, שישמשו לחתימה על APK של ניפוי באגים. בדרך כלל לא מומלץ להשתמש במפתחות אחרים מלבד מפתח ברירת המחדל, ולכן יש להשמיט את המאפיין הזה.

אזהרה: אין להשתמש במפתחות הייצור, הם צריכים להיות מוגנים היטב ולא נמצאים בעץ המקור.

debug_signing_lineage_file

Label; optional

קובץ שמכיל את שילוט החתימה של ניפוי הבאגים של המפתחות. בדרך כלל לא מומלץ להשתמש במפתחות אחרים מלבד מפתח ברירת המחדל, ולכן יש להשמיט את המאפיין הזה.

אזהרה: אין להשתמש במפתחות הייצור, הם צריכים להיות מוגנים היטב ולא נמצאים בעץ המקור.

densities

List of strings; optional

ערכי דחיסות לסינון במהלך בניית ה-APK. כך פוחת משאבים שניתן לצייר ברסטר שלא ייטענו במכשיר עם דחיסות המסך שצוינה, כדי להקטין את גודל ה-APK. בנוסף, קטע תואם של מסכים תואמים יתווסף למניפסט אם הוא עדיין לא מכיל דף עסקי של Superset.
dex_shards

Integer; optional; default is 1

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

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

dexopts

List of strings; optional

סימונים נוספים בשורת הפקודה בכלי dx במהלך יצירת class.dex. כפוף להחלפה "make variable" ו-אסימון מעטפת בור.
enable_data_binding

Boolean; optional; default is False

אם המדיניות מוגדרת כ-True, הכלל הזה מעבד ביטויים כדי לחייב את הנתונים במשאבי הפריסה שכלולים במאפיין resource_files. ללא ההגדרה הזו, ביטויים של קישור נתונים מניבים כשלים ב-build.

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

  1. הגדרת המאפיין הזה לכל כללי Android שתלויים בכלל הזה. הסיבה לכך היא שהתלויים יורשים את הביטויים של קישור הנתונים של הכלל באמצעות מיזוג משאבים. לכן הם צריכים גם לבנות נתונים שמחייבים לנתח את הביטויים האלה.
  2. יש להוסיף רשומה deps = בספריית זמן הריצה המחייבת נתונים לכל היעדים שמגדירים את המאפיין הזה. המיקום של הספרייה הזו תלוי בהגדרת המאגר.
incremental_dexing

Integer; optional; nonconfigurable; default is -1

אילוץ ליצור את היעד באמצעות או ללא פענוח מצטבר, ביטול ברירות מחדל וסימון --incremental_dexing.
instruments

Label; optional

היעד android_binary לכלי נגינה.

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

javacopts

List of strings; optional

אפשרויות מהדר נוספות ליעד הזה. כפוף להחלפה "make variable" ו-אסימון מעטפת בור.

אפשרויות המהדרים האלה מועברות ל-Java אחרי האפשרויות של המהדר הגלובלי.

key_rotation_min_sdk

String; optional

מגדירה את גרסת הפלטפורמה המינימלית של Android (רמת API) שעבורה צריך להשתמש במפתח החתימה של ה-APK' כדי לייצר את חתימת ה-APK&#39. מפתח החתימה המקורי עבור ה-APK ישמש לכל גרסאות הפלטפורמה הקודמות.
main_dex_list

Label; optional

קובץ טקסט מכיל רשימה של שמות כיתות. כיתות שהוגדרו באמצעות קובצי הכיתה האלה מועברות ל-class.dex הראשי. לדוגמה:
          android/support/multidex/MultiDex$V19.class
          android/support/multidex/MultiDex.class
          android/support/multidex/MultiDexApplication.class
          com/google/common/base/Objects.class
                    
חובה להשתמש באפליקציה multidex="manual_main_dex".
main_dex_list_opts

List of strings; optional

אפשרויות לשורת פקודה להעברה לבונה הראשי של רשימת Dex. ניתן להשתמש באפשרות הזו כדי להשפיע על הכיתות שכלולות ברשימה הראשית של Dex.
main_dex_proguard_specs

List of labels; optional

הקבצים שישמשו כמפרט של Proguard כדי לקבוע אילו כיתות צריך לשמור ב-Dex הראשי. מותר רק אם המאפיין multidex מוגדר לערך legacy.
manifest

Label; required

השם של קובץ המניפסט של Android, בדרך כלל AndroidManifest.xml. חייב להיות מוגדר אם מוגדרים משאבים או נכסים.
manifest_values

Dictionary: String -> String; optional

מילון של ערכים שיוחלפו במניפסט. כל מופע של ${name} במניפסט יוחלף בערך התואם לשם במילון הזה. appId, versionCode, versionName, minSdkversion,, כאשר manifest_merger מוגדר כדור קודם, רק ל-applicationId, versionCode ו- versionName תהיה השפעה.
multidex

String; optional; default is "native"

האם לפצל קוד למספר קובצי Dex.
ערכים אפשריים:
  • native: פיצול הקוד למספר קובצי Dex אם חרגת מהמגבלה של 64K באינדקס. ההנחה היא שתמיכה בפלטפורמה מקורית בטעינה של מחלקות Multiplex בזמן ריצה. האפשרות הזו פועלת רק במכשירי Android L ואילך.
  • legacy: פיצול הקוד למספר קובצי Dex אם חרגת מהמגבלה של 64K באינדקס. צריך להניח שכיתות Multiplexex נטענות באמצעות קוד האפליקציה (כלומר, אין תמיכה בפלטפורמה מקורית).
  • manual_main_dex: פיצול הקוד למספר קובצי Dex אם חרגת מהמגבלה של 64K באינדקס. כדי לציין את התוכן של קובץ ה-Dex הראשי, צריך לספק רשימה של כיתות בקובץ טקסט באמצעות המאפיין main_dex_list.
  • off: אוספים את כל הקוד לקובץ אחד (dex) בודד, גם אם הוא חורג ממגבלת האינדקס.
nocompress_extensions

List of strings; optional

רשימה של סיומות קבצים שנשארות לא דחוסות בקובץ APK.
package_id

Integer; optional; default is 0

מזהה החבילה שיש להקצות למשאבים הבינאריים האלה.

מידע נוסף זמין בארגומנט --package-id של AAPT2. בדרך כלל אפשר להשאיר את הערך לא מוגדר, וכתוצאה מכך ערך ברירת המחדל הוא 127 (0x7F).

plugins

List of labels; optional

יישומי פלאגין של מהדר Java שירוצים בזמן ההידור. כל java_plugin שצוין במאפיין יישומי הפלאגין יופעל בכל פעם שהיעד הזה נוצר. משאבים שיופקו על ידי הפלאגין ייכללו במאגר התוצאות של היעד.
proguard_apply_dictionary

Label; optional

קובץ לשימוש כמיפוי לפרוגרטור. קובץ עם הפרדה בין שורות "words" שיש לשלוף ממנו כשמשנים שמות של כיתות וחברים במהלך ערפול קוד (obfuscation).
proguard_apply_mapping

Label; optional

קובץ לשימוש כמיפוי לפרוגרטור. קובץ מיפוי שנוצר על ידי proguard_generate_mapping לשימוש חוזר כדי להחיל את אותו המיפוי על גרסת build חדשה.
proguard_generate_mapping

Boolean; optional; nonconfigurable; default is False

האם ליצור קובץ מיפוי של Proguard. קובץ המיפוי ייווצר רק אם צוין proguard_specs. בקובץ הזה יצוין המיפוי בין השם המקורי, שם המחלקה, השיטה ושדות השדות.

אזהרה: אם משתמשים במאפיין הזה, המפרט של Proguard לא צריך להכיל את -dontobfuscate או את -printmapping.

proguard_specs

List of labels; optional

קבצים שישמשו כמפרט Proguard. הקובץ הזה מתאר את קבוצת המפרטים שישמשו את Proguard.
resource_configuration_filters

List of strings; optional

רשימה של מסנני הגדרת משאבים, כגון 'en' שתגביל את המשאבים ב-APK רק לתצורה ב-'en' כדי להפעיל פסאודוקליזציה, יש לכלול את en_XA ו/או ar_XB אזורים גיאוגרפיים.
resource_files

List of labels; optional

רשימת המשאבים לחבילה. בדרך כלל, זהו glob של כל הקבצים בספרייה res.
גם כאן אפשר להפנות לקבצים שנוצרו (מכללי יצירה) באמצעות תווית. ההגבלה היחידה היא שהפלט שנוצר צריך להיות תחת אותה &ספרייה;res" כמו כל קובצי משאבים אחרים הכלולים.
shrink_resources

Integer; optional; default is -1

האם לבצע כיווץ משאבים. משאבים שלא נעשה בהם שימוש בקובץ הבינארי יוסרו מה-APK. אפשרות זו נתמכת רק בכללים שמשתמשים במשאבים מקומיים (כלומר, המאפיינים manifest ו-resource_files) ודורש ProGuard. הוא פועל בעיקר באותו אופן כמו משאב המשאבים של Gradle (https://developer.android.com/studio/build/shrink-code.html#shrink-resources).

ההבדלים הבולטים:

  • המשאבים ב-values/ יוסרו וכן משאבים המבוססים על קבצים
  • משתמש/ת ב-strict mode כברירת מחדל
  • הסרה של משאבי מזהה שאינם בשימוש נתמכת רק באמצעות aapt2
אם מופעלת כיווץ משאבים, המערכת תיצור גם name_files/resource_shrinker.log ותפרט את הניתוחים ואת המחיקות שבוצעו.

ערכים אפשריים:

  • shrink_resources = 1: הפעלה של כיווץ משאבים ב-Android
  • shrink_resources = 0: השבתה של כיווץ המשאב של Android
  • shrink_resources = -1: כיווץ מתבצע באמצעות הסימון --android_resource_shrinking.

aar_import (ייבוא)

aar_import(name, deps, data, aar, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exports, features, licenses, restricted_to, srcjar, tags, target_compatible_with, testonly, visibility)

הכלל הזה מאפשר שימוש בקובצי .aar כספריות עבור כללים מסוג android_library ו-android_binary.

דוגמאות

    aar_import(
        name = "google-vr-sdk",
        aar = "gvr-android-sdk/libraries/sdk-common-1.10.0.aar",
    )

    android_binary(
        name = "app",
        manifest = "AndroidManifest.xml",
        srcs = glob(["**.java"]),
        deps = [":google-vr-sdk"],
    )

ארגומנטים

מאפיינים
name

Name; required

שם ייחודי ליעד הזה.

aar

Label; required

קובץ ה-.aar שיש לספק ליעדים של Android שתלויים ביעד הזה.
exports

List of labels; optional

יעדים לייצוא לכלל שתלוי בכלל הזה. פרטים נוספים זמינים כאן: Java_library.exports.
srcjar

Label; optional

קובץ JAR שמכיל את קוד המקור של קובצי ה-JAR המעורבים.

Android_library

android_library(name, deps, srcs, data, assets, assets_dir, compatible_with, custom_package, deprecation, distribs, enable_data_binding, exec_compatible_with, exec_properties, exported_plugins, exports, exports_manifest, features, idl_import_root, idl_parcelables, idl_preprocessed, idl_srcs, javacopts, licenses, manifest, neverlink, plugins, proguard_specs, resource_files, restricted_to, tags, target_compatible_with, testonly, visibility)

הכלל הזה מקבץ ומעביר את המקורות שלו לקובץ .jar. ספריית ריצה בזמן android.jar ל-Android נכללת באופן לא מפורש בנתיב של מחלקת האוסף.

יעדי פלט מרומזים

  • libname.jar: ארכיון Java.
  • libname-src.jar: ארכיון המכיל את המקורות ("source gar").
  • name.aar: חבילה של Android 'aar' המכילה את ארכיון Java ואת המשאבים של היעד הזה. הוא לא מכיל את הסגירה העקיפה.

דוגמאות

דוגמאות לכללים ל-Android אפשר למצוא בספריית examples/android של עץ המקור בזל.

הדוגמה הבאה מראה איך להגדיר את idl_import_root. מתן הרשאה ל-//java/bazel/helloandroid/BUILD:

android_library(
    name = "parcelable",
    srcs = ["MyParcelable.java"], # bazel.helloandroid.MyParcelable

    # MyParcelable.aidl will be used as import for other .aidl
    # files that depend on it, but will not be compiled.
    idl_parcelables = ["MyParcelable.aidl"] # bazel.helloandroid.MyParcelable

    # We don't need to specify idl_import_root since the aidl file
    # which declares bazel.helloandroid.MyParcelable
    # is present at java/bazel/helloandroid/MyParcelable.aidl
    # underneath a java root (java/).
)

android_library(
    name = "foreign_parcelable",
    srcs = ["src/android/helloandroid/OtherParcelable.java"], # android.helloandroid.OtherParcelable
    idl_parcelables = [
        "src/android/helloandroid/OtherParcelable.aidl" # android.helloandroid.OtherParcelable
    ],

    # We need to specify idl_import_root because the aidl file which
    # declares android.helloandroid.OtherParcelable is not positioned
    # at android/helloandroid/OtherParcelable.aidl under a normal java root.
    # Setting idl_import_root to "src" in //java/bazel/helloandroid
    # adds java/bazel/helloandroid/src to the list of roots
    # the aidl compiler will search for imported types.
    idl_import_root = "src",
)

# Here, OtherInterface.aidl has an "import android.helloandroid.CallbackInterface;" statement.
android_library(
    name = "foreign_interface",
    idl_srcs = [
        "src/android/helloandroid/OtherInterface.aidl" # android.helloandroid.OtherInterface
        "src/android/helloandroid/CallbackInterface.aidl" # android.helloandroid.CallbackInterface
    ],

    # As above, idl_srcs which are not correctly positioned under a java root
    # must have idl_import_root set. Otherwise, OtherInterface (or any other
    # interface in a library which depends on this one) will not be able
    # to find CallbackInterface when it is imported.
    idl_import_root = "src",
)

# MyParcelable.aidl is imported by MyInterface.aidl, so the generated
# MyInterface.java requires MyParcelable.class at compile time.
# Depending on :parcelable ensures that aidl compilation of MyInterface.aidl
# specifies the correct import roots and can access MyParcelable.aidl, and
# makes MyParcelable.class available to Java compilation of MyInterface.java
# as usual.
android_library(
    name = "idl",
    idl_srcs = ["MyInterface.aidl"],
    deps = [":parcelable"],
)

# Here, ServiceParcelable uses and thus depends on ParcelableService,
# when it's compiled, but ParcelableService also uses ServiceParcelable,
# which creates a circular dependency.
# As a result, these files must be compiled together, in the same android_library.
android_library(
    name = "circular_dependencies",
    srcs = ["ServiceParcelable.java"],
    idl_srcs = ["ParcelableService.aidl"],
    idl_parcelables = ["ServiceParcelable.aidl"],
)

ארגומנטים

מאפיינים
name

Name; required

שם ייחודי ליעד הזה.

deps

List of labels; optional

רשימת הספריות האחרות שיש לקשר אליהן. סוגי הספריות המותרים הם: android_library, java_library עם מגבלת android ו-cc_library עיטוף או יצירה של .so ספריות מקוריות עבור פלטפורמת היעד של Android.
srcs

List of labels; optional

רשימת הקבצים ב-.java או ב-.srcjar שעובדו כדי ליצור את היעד.

הידור של srcs קבצים מסוג .java. לקריאה ולהורדה של הנתונים, לא כדאי להזין את השם של קובץ המקור .java שנוצר ב-srcs. במקום זאת, יש להזין את השם של הכלל התלוי ב-srcs, כפי שמתואר בהמשך.

srcs קבצים מסוג .srcjar לא ארוזים ומעובדים. (מומלץ להשתמש באפשרות הזאת אם צריך ליצור קבוצה של קובצי JavaScript עם ג'ירולה או תוסף build).

אם המדיניות srcs תושמט, תלות כלשהי שצוינה ב-deps מיוצאת מהכלל הזה (מידע נוסף על ייצוא של יחסי תלות הייצוא זמין ב-Java_library's. אבל ההתנהגות הזו תוצא משימוש בקרוב. כדאי לנסות לא להסתמך עליה.

assets

List of labels; optional

רשימת הנכסים לאריזה. בדרך כלל, זהו glob של כל הקבצים בספרייה assets. ניתן גם לעיין בכללים אחרים (כל כלל שמפיק קבצים) או קבצים שיוצאו בחבילות האחרות, כל עוד כל הקבצים האלה נמצאים בספרייה assets_dir בחבילה המתאימה.
assets_dir

String; optional

המחרוזת שמספקת את הנתיב לקבצים ב-assets. הזוג assets ו-assets_dir מתארים נכסים ארוזים, וצריך לספק את שני המאפיינים או את שניהם.
custom_package

String; optional

חבילת Java שעבורה המערכת תיצור מקורות של Java. כברירת מחדל, המערכת מסיקה את החבילה מהספרייה שבה נמצא קובץ ה-BUILD שמכיל את הכלל. אפשר לציין חבילה אחרת אבל לא מומלץ להשתמש בה, כי היא עלולה לגרום להתנגשויות בין classpath לבין ספריות אחרות שיזוהו רק בזמן הריצה.
enable_data_binding

Boolean; optional; default is False

אם המדיניות מוגדרת כ-True, הכלל הזה מעבד ביטויים כדי לחייב את הנתונים במשאבי הפריסה שכלולים במאפיין resource_files. ללא ההגדרה הזו, ביטויים של קישור נתונים מניבים כשלים ב-build.

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

  1. הגדרת המאפיין הזה לכל כללי Android שתלויים בכלל הזה. הסיבה לכך היא שהתלויים יורשים את הביטויים של קישור הנתונים של הכלל באמצעות מיזוג משאבים. לכן הם צריכים גם לבנות נתונים שמחייבים לנתח את הביטויים האלה.
  2. יש להוסיף רשומה deps = בספריית זמן הריצה המחייבת נתונים לכל היעדים שמגדירים את המאפיין הזה. המיקום של הספרייה הזו תלוי בהגדרת המאגר.
exported_plugins

List of labels; optional

רשימה של java_pluginיים (למשל, מעבדי הערות) לייצוא לספריות שתלויות ישירות בספרייה הזו.

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

exports

List of labels; optional

סגירת כל הכללים שמגיעים דרך המאפיינים exports נחשבת לתלויות ישירות של כל כלל שתלוי ישירות ביעד שהוגדר עם exports.

ה-exports אינם ייצוגים ישירים של הכלל שאליו הם שייכים.

exports_manifest

Integer; optional; default is 1

האם לייצא רשומות מניפסט ל-android_binary יעדים שתלויים ביעד הזה. אף פעם לא מייצאים מאפיינים של uses-permissions.
idl_import_root

String; optional

הנתיב היחסי בחבילה של עץ העץ של החבילה ב-Java שמכיל מקורות לא פעילים שכלולים בספרייה הזו.

הנתיב הזה ישמש כבסיס לייבוא כשעיבוד מקורות לא פעילים התלויים בספרייה הזו.

אם מציינים את idl_import_root, גם idl_parcelables וגם idl_srcs צריכים להיות בנתיב שצוין על ידי חבילת Java של האובייקט שהם מייצגים מתחת ל-idl_import_root. אם לא מציינים את idl_import_root, המאפיינים idl_parcelables ו-idl_srcs חייבים להיות בנתיב שצוין על ידי החבילה שלהם בשורש Java.

דוגמאות.

idl_parcelables

List of labels; optional

רשימת הגדרות Android IDL ליבוא כייבוא. הקבצים האלה יהיו זמינים לייבוא עבור כל יעד android_library שתלוי בספרייה הזו, ישירות או באמצעות הסגירה הטרמינלית שלו, אבל לא יתורגמו ל-Java ולא ייווצרו ממנו.

יש לכלול רק .aidl קבצים שתואמים ישירות ל-.java מקורות בספרייה הזו (למשל, הטמעות מותאמות אישית של Parlicable), אחרת צריך להשתמש ב-idl_srcs.

כדי למצוא את הקבצים האלה, צריך למקם אותם בצורה נכונה. למידע נוסף על משמעות המאפיין, ניתן לעיין בתיאור של idl_import_root.

idl_preprocessed

List of labels; optional

רשימת הגדרות של מכשירי Android IDL מעובדים מראש, לצורך ייבוא. הקבצים האלה יהיו זמינים לייבוא עבור כל יעד android_library שתלוי בספרייה הזו, ישירות או באמצעות הסגירה הטרמינלית שלו, אבל לא יתורגמו ל-Java ולא ייווצרו ממנו.

יש לכלול רק .aidl קבצים שעובדו מראש התואמים ישירות ל-.java מקורות בספרייה הזו (למשל, הטמעות מותאמות אישית של Parlicable). אחרת, צריך להשתמש ב-idl_srcs עבור הגדרות Android IDL שצריך לתרגם לממשקי Java ולהשתמש ב-idl_parcelable לקובצי AIDL שלא עברו עיבוד.

idl_srcs

List of labels; optional

רשימת הגדרות של Android IDL לתרגום לממשקי Java. אחרי שיוצרים את ממשקי Java, הם יקובצו יחד עם התוכן של srcs.

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

כדי למצוא את הקבצים האלה, צריך למקם אותם בצורה נכונה. למידע נוסף על משמעות המאפיין, ניתן לעיין בתיאור של idl_import_root.

javacopts

List of strings; optional

אפשרויות מהדר נוספות ליעד הזה. כפוף להחלפה "make variable" ו-אסימון מעטפת בור.

אפשרויות המהדרים האלה מועברות ל-Java אחרי האפשרויות של המהדר הגלובלי.

manifest

Label; optional

השם של קובץ המניפסט של Android, בדרך כלל AndroidManifest.xml. חייב להיות מוגדר אם מוגדרים משאבים או נכסים.

Boolean; optional; default is False

יש להשתמש בספרייה הזו לאיסוף בלבד ולא בזמן ריצה. התוצאות של כלל שסומן בתור neverlink לא ישמשו ליצירה של .apk. שימושי אם הספרייה תסופק על ידי סביבת זמן הריצה במהלך הביצוע.
plugins

List of labels; optional

יישומי פלאגין של מהדר Java שירוצים בזמן ההידור. כל java_plugin שצוין במאפיין יישומי הפלאגין יופעל בכל פעם שהיעד הזה נוצר. משאבים שיופקו על ידי הפלאגין ייכללו במאגר התוצאות של היעד.
proguard_specs

List of labels; optional

קבצים שישמשו כמפרט Proguard. תיאורים אלה מתארים את קבוצת המפרטים שישמשו את Proguard. אם תצוין, הם יתווספו לכל יעד android_binary בהתאם לספרייה הזו. הקבצים המוקצים כאן צריכים לכלול רק כללים לא ברורים, כלומר -dontnote, --nowart, denonsiders וכללים שמתחילים ב--keep. אפשרויות אחרות יכולות להופיע ב-proguard_specs של android_binary\u33 בלבד, כדי להבטיח מיזוגים לא אוטומטיים.
resource_files

List of labels; optional

רשימת המשאבים לחבילה. בדרך כלל, זהו glob של כל הקבצים בספרייה res.
גם כאן אפשר להפנות לקבצים שנוצרו (מכללי יצירה) באמצעות תווית. ההגבלה היחידה היא שהפלט שנוצר צריך להיות תחת אותה &ספרייה;res" כמו כל קובצי משאבים אחרים הכלולים.

android_instrumentation_test

android_instrumentation_test(name, data, args, compatible_with, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, licenses, local, restricted_to, shard_count, size, support_apks, tags, target_compatible_with, target_device, test_app, testonly, timeout, toolchains, visibility)

כלל android_instrumentation_test מפעיל בדיקות אינסטרומנטציה ל-Android. הכלי יפעיל אמולטור, יתקין את האפליקציה הנבדקת, את אפליקציית הבדיקה ואת כל האפליקציות הדרושות, ויריץ את הבדיקות שמוגדרות בחבילת הבדיקה.

המאפיין test_app מציין את android_binary שמכיל את הבדיקה. android_binary בתורו, מציין את האפליקציה android_binary בבדיקה דרך מאפיין האמצעים שלה.

דוגמה

# java/com/samples/hello_world/BUILD

android_library(
    name = "hello_world_lib",
    srcs = ["Lib.java"],
    manifest = "LibraryManifest.xml",
    resource_files = glob(["res/**"]),
)

# The app under test
android_binary(
    name = "hello_world_app",
    manifest = "AndroidManifest.xml",
    deps = [":hello_world_lib"],
)
# javatests/com/samples/hello_world/BUILD

android_library(
    name = "hello_world_test_lib",
    srcs = ["Tests.java"],
    deps = [
      "//java/com/samples/hello_world:hello_world_lib",
      ...  # test dependencies such as Espresso and Mockito
    ],
)

# The test app
android_binary(
    name = "hello_world_test_app",
    instruments = "//java/com/samples/hello_world:hello_world_app",
    manifest = "AndroidManifest.xml",
    deps = [":hello_world_test_lib"],
)

android_instrumentation_test(
    name = "hello_world_uiinstrumentation_tests",
    target_device = ":some_target_device",
    test_app = ":hello_world_test_app",
)

ארגומנטים

מאפיינים
name

Name; required

שם ייחודי ליעד הזה.

support_apks

List of labels; optional

חבילות APK אחרות להתקנה במכשיר לפני התחלת בדיקת האינסטרומנטציה.
target_device

Label; required

ה-android_device שבו ברצונך לבצע את הבדיקה.

כדי להריץ את הבדיקה באמולטור שכבר פועל או במכשיר פיזי, צריך להשתמש בארגומנטים הבאים: --test_output=streamed --test_arg=--device_broker_type=LOCAL_ADB_SERVER --test_arg=--device_serial_number=$device_identifier

test_app

Label; required

היעד android_binary שמכיל את שיעורי הבדיקה. היעד android_binary חייב לציין את היעד שנבדק באמצעות המאפיין instruments.

android_local_test

android_local_test(name, deps, srcs, data, args, compatible_with, custom_package, densities, deprecation, enable_data_binding, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, javacopts, jvm_flags, licenses, local, manifest, manifest_values, nocompress_extensions, plugins, resource_configuration_filters, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, shard_count, size, stamp, tags, target_compatible_with, test_class, testonly, timeout, toolchains, use_launcher, visibility)

הכלל הזה נועד לבדיקת כללים של android_library באופן מקומי (בניגוד למכשיר). היא פועלת עם מסגרת הבדיקה של Robolectric של Android. באתר Android Robolectric אפשר למצוא פרטים על כתיבת בדיקות Robolectric.

יעדי פלט מרומזים

  • name.jar: ארכיון Java של הבדיקה.
  • name-src.jar: ארכיון המכיל את המקורות ("source gar").
  • name_deploy.jar: ארכיון פריסת Java שמתאים לפריסה (נבנה רק אם נשלח בקשה במפורש).

דוגמאות

כדי להשתמש ב-Robolectric עם android_local_test, מוסיפים מאגר Robolectric לקובץ WORKSPACE:

http_archive(
    name = "robolectric",
    urls = ["https://github.com/robolectric/robolectric/archive/<COMMIT>.tar.gz"],
    strip_prefix = "robolectric-<COMMIT>",
    sha256 = "<HASH>",
)
load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories")
robolectric_repositories()
פעולה זו מאחזרת את הכללים של maven_jar הנדרשים עבור Robolectric. לאחר מכן, כל כלל android_local_test צריך להיות תלוי @robolectric//bazel:robolectric. דוגמה:

android_local_test(
    name = "SampleTest",
    srcs = [
        "SampleTest.java",
    ],
    manifest = "LibManifest.xml",
    deps = [
        ":sample_test_lib",
        "@robolectric//bazel:robolectric",
    ],
)

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

ארגומנטים

מאפיינים
name

Name; required

שם ייחודי ליעד הזה.

deps

List of labels; optional

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

רשימת הכללים המותרים ב-deps היא android_library, aar_import, java_import, java_library, ו-java_lite_proto_library.

srcs

List of labels; optional

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

הידור של srcs קבצים מסוג .java. לקריאה ולהורדה של הנתונים, לא כדאי להזין את השם של קובץ המקור .java שנוצר ב-srcs. במקום זאת, יש להזין את השם של הכלל התלוי ב-srcs, כפי שמתואר בהמשך.

srcs קבצים מסוג .srcjar לא ארוזים ומעובדים. (מומלץ להשתמש באפשרות הזאת אם צריך ליצור קבוצה של קובצי JavaScript עם ג'ירולה או תוסף build).

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

המאפיין srcs הוא שדה חובה ולא ניתן להשאיר אותו ריק, אלא אם צוין runtime_deps.

custom_package

String; optional

חבילת Java שבה ייווצר ה-R class. כברירת מחדל, המערכת מסיקה את החבילה מהספרייה שבה נמצא קובץ ה-BUILD שמכיל את הכלל. אם משתמשים במאפיין הזה, כנראה צריך להשתמש גם ב-test_class.
densities

List of strings; optional

ערכי דחיסות לסינון במהלך בניית ה-APK. בנוסף, קטע תואם של מסכים תואמים יתווסף למניפסט אם הוא לא מכיל SuperstarkListing מסוג Superset.
enable_data_binding

Boolean; optional; default is False

אם המדיניות מוגדרת כ-True, הכלל הזה מעבד הפניות לשיוך נתונים המשמשות בתלויות המופעלות של קישור נתונים. ללא ההגדרה הזו, לתלויות משויכות של נתונים לא יהיו תהליכי יצירת קוד ברמת הקובץ הבינארי ועשויים לגרום לכשלים ב-build.
javacopts

List of strings; optional

אפשרויות מהדר נוספות לספרייה הזו. כפוף להחלפה "make variable" ו-אסימון מעטפת בור.

אפשרויות המהדרים האלה מועברות ל-Java אחרי האפשרויות של המהדר הגלובלי.

jvm_flags

List of strings; optional

רשימת סימונים להטמעה בסקריפט wrapper שנוצרו עבור ההפעלה של הקובץ הבינארי הזה. בכפוף ל-$(location) ול-"Make variable", ולהחלפה של מעטפת המעטפת.

סקריפט ה-wrapper עבור קובץ בינארי של Java כולל הגדרה של JAWSPath (כדי למצוא את כל הצנצנות התלויות) ולהפעיל את כלי התרגום הנכון ל-Java. שורת הפקודה שנוצרה על ידי הסקריפט wrapper כוללת את שם המחלקה הראשית ואחריה "$@", כדי שאפשר יהיה להעביר ארגומנטים אחרים אחרי שם הכיתה. עם זאת, צריך לציין ארגומנט לפני שם המחלקה בשורת הפקודה כדי לנתח את הנתונים לפי ה-JVM. התוכן של jvm_flags מתווסף לסקריפט ה-wrapper לפני פרסום שם הכיתה.

לתשומת ליבך, למאפיין הזה אין השפעה על פלט *_deploy.jar.

manifest

Label; optional

השם של קובץ המניפסט של Android, בדרך כלל AndroidManifest.xml. יש להגדיר אותם אם קיימים ב-resource_files או בנכסים אם אחד מהמניפסטים מהספריות בבדיקה כולל תג minSdkVersion.
manifest_values

Dictionary: String -> String; optional

מילון של ערכים שיוחלפו במניפסט. כל מופע של ${name} במניפסט יוחלף בערך התואם לשם במילון הזה. המאפיינים applicationId, versionCode, versionName, minSdkVersion, targetSdkVersion וגם maxSdkVersion יעקפו גם את המאפיינים התואמים של המניפסט ושל תגי Use-sdk. המערכת תתעלם מ-packageName והיא תוגדר מ-applicationId אם תצוין, או מהחבילה במניפסט. אין צורך במניפסט לכלל כדי להשתמש ב- manifest_values.
nocompress_extensions

List of strings; optional

רשימה של סיומות קבצים שלא יישמרו דחוסות ב-APK של המשאב.
plugins

List of labels; optional

יישומי פלאגין של מהדר Java שירוצים בזמן ההידור. כל ערך של java_plugin שצוין במאפיין זה יופעל בכל פעם שהכלל הזה ייווצר. ספרייה יכולה לרשת בירושה גם יישומי פלאגין מתלויים שמשתמשים ב-exported_plugins. המשאבים שנוצרו על ידי הפלאגין ייכללו במאגר שנוצר על ידי הכלל הזה.
resource_configuration_filters

List of strings; optional

רשימה של מסנני תצורת משאבים, כגון 'en' שתגביל את המשאבים ב-APK רק לתצורה ב-'en'
resource_jars

List of labels; optional

הוצא משימוש: במקום זאת, יש להשתמש ב-'Java_import' וב-'deps' או ב-runtime_deps.
resource_strip_prefix

String; optional

הקידומת של הקטע שרוצים להסיר ממשאבי Java.

אם מציינים את הקידומת, הנתיב יוסר מכל הקובץ במאפיין resources. קובץ שגיאה לא יכול להיות בספרייה הזו. אם לא מצוין (ברירת המחדל), הנתיב של קובץ המשאב נקבע בהתאם ללוגיקה של חבילת ה-Java של קובצי מקור. לדוגמה, קובץ מקור ב-stuff/java/foo/bar/a.txt ימוקם ב-foo/bar/a.txt.

runtime_deps

List of labels; optional

ספריות שיהיו זמינות לאפליקציה הבינארית הסופית או לבדיקה בזמן ריצה בלבד. כמו deps הרגיל, הן יופיעו בנתיב הריצה בזמן הריצה, אבל בניגוד להן, לא בנתיב הסיווג של זמן הרינדור. כאן ניתן לראות את יחסי התלות הדרושים בזמן הריצה בלבד. כלים לניתוח נתונים תלויים צריכים להתעלם מיעדים שמופיעים ב-runtime_deps וגם ב-deps.
stamp

Integer; optional; default is 0

האם מקודדים מידע על מבנה למכשיר הבינארי ערכים אפשריים:
  • stamp = 1: תמיד יש להחתים את המידע על הגרסה הבינארית, גם בגרסאות build של --nostamp. אין להשתמש בהגדרה הזו, כי היא עלולה לסגור את השמירה במטמון הבינארי של כל פעולה בינארית ופעולות שתלויות בה.
  • stamp = 0: תמיד להחליף את פרטי ה-build בערכים קבועים. כך נשמרת השמירה במטמון של תוצאות ה-build.
  • stamp = -1: הטמעת פרטי ה-build נמצאת בשליטת התכונה --[no]stamp.

קבצים בינאריים עם חותמת לא נוצרים מחדש, אלא אם תלויות בהם.

test_class

String; optional

מחלקה של Java שתיטען על ידי מפעיל הבדיקה.

המאפיין הזה מציין את השם של מחלקת Java שיש להריץ באמצעות הבדיקה הזו. לעיתים רחוקות יש צורך להגדיר זאת. אם הארגומנט הזה לא יופיע, ייעשה שימוש במחלקת Java ששמה תואם לname של כלל android_local_test זה. יש להוסיף להערה את שיעור הבדיקה באמצעות org.junit.runner.RunWith.

use_launcher

Boolean; optional; default is True

האם הקובץ הבינארי אמור להשתמש במרכז אפליקציות מותאם אישית.

אם המאפיין הזה מוגדר כ-false, המערכת תתעלם מהמאפיין מרכז האפליקציות ומהסמן --java_launcher הקשור ליעד הזה.

מכשיר Android

android_device(name, cache, compatible_with, default_properties, deprecation, distribs, exec_compatible_with, exec_properties, features, horizontal_resolution, licenses, platform_apks, ram, restricted_to, screen_density, system_image, tags, target_compatible_with, testonly, vertical_resolution, visibility, vm_heap)

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

הכלל הזה מתאים לשימוש בסימון -run_under כדי לבצע בדיקה ראשונית ולרוץ באמצעות Blaze. היא מבצעת אמולטור, מעתיקים את היעד שנבדק או מופעל לאמולטור ובודקת אותו או מפעילה אותו לפי הצורך.

המדיניות android_device תומכת ביצירת תמונות KVM אם ה-system_image הבסיסי מבוסס על X86 ומבצע אופטימיזציה לארכיטקטורה I686 לכל היותר. כדי להשתמש ב-KVM, יש להוסיף את tags = ['requires-kvm'] לכלל android_device.

יעדי פלט מרומזים

  • name_images/userdata.dat: יש קובצי תמונה ותמונות מצב להפעלה של האמולטור
  • name_images/emulator-meta-data.pb: מכיל מידע סידורי שנדרש כדי להעביר את האמולטור כדי להפעיל אותו מחדש.

דוגמאות

הדוגמה הבאה מראה איך להשתמש ב-android_device. //java/android/helloandroid/BUILD מכיל

android_device(
    name = "nexus_s",
    cache = 32,
    default_properties = "nexus_s.properties",
    horizontal_resolution = 480,
    ram = 512,
    screen_density = 233,
    system_image = ":emulator_images_android_16_x86",
    vertical_resolution = 800,
    vm_heap = 32,
)

filegroup(
    name = "emulator_images_android_16_x86",
    srcs = glob(["androidsdk/system-images/android-16/**"]),
)

//java/android/helloandroid/nexus_s.properties מכיל:

ro.product.brand=google
ro.product.device=crespo
ro.product.manufacturer=samsung
ro.product.model=Nexus S
ro.product.name=soju

כלל זה ייצור תמונות וסקריפט התחלה. אפשר להפעיל את האמולטור באופן מקומי על ידי ביצוע פעולה בסיסית :xx_s -- --action=start. הסקריפט חושף את הדגלים הבאים:

  • --adb_port: היציאה שאליה יש לחשוף את adb. אם ברצונך להנפיק פקודות adb לאמולטור, זו היציאה שבה תתבצע התחברות ל-adb.
  • --emulator_port: היציאה לחשיפה של מסוף ניהול הטלמטרים של האמולטור.
  • --activate_display: מפעיל את האמולטור עם מסך אם הוא נכון (ברירת מחדל false).
  • --action: התחלה או הריגה.
  • - -APKs_to_Install: רשימה של חבילות APK להתקנה באמולטור.

ארגומנטים

מאפיינים
name

Name; required

שם ייחודי ליעד הזה.

cache

Integer; required

הגודל במגה-בייט של מחיצת המטמון של האמולטור. הערך המינימלי הוא 16 מגה-בייט.
default_properties

Label; optional

קובץ מאפיינים יחיד שימוקם ב-/default.prop באמולטור. המדיניות הזו מאפשרת למחבר/ת להגדיר עוד יותר אמולטור כך שייראה כמו מכשיר אמיתי (במיוחד עבור בקרה של מחרוזות UserAgent והתנהגויות אחרות שעשויות לגרום לאפליקציה או לשרת לפעול באופן שונה בהתאם למכשיר ספציפי). המאפיינים בקובץ הזה יעקפו את המאפיינים לקריאה בלבד שהוגדרו בדרך כלל על ידי האמולטור כמו ro.product.model.
horizontal_resolution

Integer; required

רזולוציית המסך האופקית בפיקסלים לצורך אמולציה. הערך המינימלי הוא 240.
platform_apks

List of labels; optional

רשימה של חבילות APK להתקנה במכשיר בזמן ההפעלה.
ram

Integer; required

רמת ה-RAM של אמולציה למכשיר. הם מיועדים לכל המכשיר, לא רק לאפליקציה ספציפית שמותקנת במכשיר. הערך המינימלי הוא 64 מגה-בייט.
screen_density

Integer; required

הדחיסות של המסך האמולטור בפיקסלים לאינץ'. הערך המינימלי הוא 30 ppi.
system_image

Label; required

קבוצת קבצים הכוללת את הקבצים הבאים:
  • System.img: מחיצת המערכת
  • kernel-qemu: הליבה של Linux האמולטור ייטען
  • ramdisk.img: התמונה שבה רוצים להשתמש בזמן האתחול
  • userdata.img: מחיצת נתוני המשתמש הראשונית
  • source.properties: קובץ נכסים המכיל מידע על
הקבצים האלה הם חלק מחבילת Android או מסופקים על ידי צד שלישי (לדוגמה Intel מספקת תמונות בגודל x86).
vertical_resolution

Integer; required

רזולוציית המסך האנכי במדמה. הערך המינימלי הוא 240.
vm_heap

Integer; required

הגודל במגה-בייט של ערימת המכונה הווירטואלית ש-Android תשתמש בכל תהליך. הערך המינימלי הוא 16 מגה-בייט.

android_ndk_repository

android_ndk_repository(name, api_level, path, repo_mapping)

מגדירה את Bazel לשימוש ב-Android NDK כדי לתמוך בבניית יעדים של Android עם קוד מקומי.

חשוב לשים לב לכך שבבניין עבור Android דרוש גם כלל android_sdk_repository בקובץ WORKSPACE.

למידע נוסף, קראו את המסמך המלא על שימוש ב-Android NDK עם Bazel.

דוגמאות

android_ndk_repository(
    name = "androidndk",
)

בדוגמה שלמעלה, ה-NDK של Android יאותר מ-$ANDROID_NDK_HOME ויזהה את רמת ה-API הגבוהה ביותר שבה הוא תומך.

android_ndk_repository(
    name = "androidndk",
    path = "./android-ndk-r20",
    api_level = 24,
)

בדוגמה שלמעלה, ייעשה שימוש ב-Android NDK בתוך סביבת העבודה שלך ב-./android-ndk-r20. היא תשתמש בספריות ברמת ה-API ברמה 24 במהלך עריכת קוד ה-JNI.

Cpufeatures

Android NDK מכיל את ספריית ה-cpufeatures, שיכולה לשמש לזיהוי המעבד (CPU) של המכשיר בזמן הריצה. הדוגמה הבאה ממחישה כיצד להשתמש ב-ppufeatures עם Bazel.

# jni.cc
#include "ndk/sources/android/cpufeatures/cpu-features.h"
...
# BUILD
cc_library(
    name = "jni",
    srcs = ["jni.cc"],
    deps = ["@androidndk//:cpufeatures"],
)

ארגומנטים

מאפיינים
name

Name; required

שם ייחודי ליעד הזה.

api_level

Integer; optional; nonconfigurable; default is 0

רמת ה-API של Android שיש לבנות עליה. אם לא מצוין, ייעשה שימוש ברמת ה-API הגבוהה ביותר.
path

String; optional; nonconfigurable

נתיב מוחלט או יחסי ל-NDK של Android. יש להגדיר את המאפיין הזה או את משתנה הסביבה $ANDROID_NDK_HOME.

ניתן להוריד את ה-NDK של Android באתר המפתחים של Android .

repo_mapping

Dictionary: String -> String; optional

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

לדוגמה, רשומה "@foo": "@bar" מצהירה שבכל זמן המאגר הזה תלוי ב-"@foo" (כמו תלות ב-"@foo//some:target"), הוא צריך לפתור את התלות בתוך "@bar" בכל העולם ("@bar//some:target").

android_sdk_repository

android_sdk_repository(name, api_level, build_tools_version, path, repo_mapping)

מגדירה את Bazel לשימוש ב-Android SDK מקומי כדי לתמוך בבניית יעדים של Android.

דוגמאות

המינימום להגדרת SDK ל-Android עבור Bazel הוא להוסיף כלל android_sdk_repository בשם "androidsdk" לקובץ WORKSPACE ולהגדיר את משתנה $ANDROID_HOME הסביבה בנתיב של ה-Android SDK. Bazel תשתמש ברמה הגבוהה ביותר של ממשק ה-API של Android, ותיצור גרסה של כלים שתותקן ב-Android SDK כברירת מחדל.
android_sdk_repository(
    name = "androidsdk",
)

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

android_sdk_repository(
    name = "androidsdk",
    path = "./sdk",
    api_level = 19,
    build_tools_version = "25.0.0",
)

הדוגמה שלמעלה מראה גם את השימוש בנתיב יחסי ל-SDK של Android. אפשרות זו שימושית אם ה-SDK של Android הוא חלק מסביבת העבודה ב-Bazel (למשל, אם היא מסומנת לבקרת גרסאות).

ספריות תמיכה

ספריות התמיכה זמינות ב-Android SDK Manager בתור "Android Support Repository". זוהי קבוצת גרסאות של ספריות Android נפוצות, כמו ספריות Support ו-AppCompat, שארוזות כמאגר מקומי של Maven. המוצר android_sdk_repository יוצר יעדי Bazel לכל אחת מהספריות האלה. ניתן להשתמש בהן בהתאם לתלויות של היעדים android_binary ו-android_library.

השמות של היעדים שנוצרו נגזרים מהקואורדינטות של Maven בספריות במאגר התמיכה של Android, בפורמט @androidsdk//${group}:${artifact}-${version}. הדוגמה הבאה ממחישה כיצד android_library תלוי בגרסה 25.0.0 של ספריית Appcomv7.

android_library(
    name = "lib",
    srcs = glob(["*.java"]),
    manifest = "AndroidManifest.xml",
    resource_files = glob(["res/**"]),
    deps = ["@androidsdk//com.android.support:appcompat-v7-25.0.0"],
)

ארגומנטים

מאפיינים
name

Name; required

שם ייחודי ליעד הזה.

api_level

Integer; optional; nonconfigurable; default is 0

רמת ה-API של Android שיש לבנות נגדה כברירת מחדל. אם לא צוין ערך, ייעשה שימוש ברמת ה-API הגבוהה ביותר.

רמת ה-API המשמשת לבניית build נתון יכולה להתבטל על ידי התכונה android_sdk. android_sdk_repository יוצר יעד android_sdk לכל רמת API שמותקנת ב-SDK עם השם @androidsdk//:sdk-${level}, בין אם צוין מאפיין זה ובין אם לא. לדוגמה, כדי ליצור שיטה שמתאימה לרמת API שאינה מוגדרת כברירת מחדל: bazel build --android_sdk=@androidsdk//:sdk-19 //java/com/example:app.

כדי להציג את כל android_sdk היעדים שנוצרו על ידי android_sdk_repository , ניתן להפעיל את bazel query "kind(android_sdk, @androidsdk//...)".

build_tools_version

String; optional; nonconfigurable

הגרסה של כלי ה-build של Android שאפשר להשתמש בהם מתוך ה-Android SDK. אם לא צוין אחרת, ייעשה שימוש בגרסה העדכנית ביותר של כלי ה-build.

ל-Bazel נדרשת כלי build בגרסה 30.0.0 ואילך.

path

String; optional; nonconfigurable

נתיב מוחלט או יחסי ל-Android SDK. יש להגדיר את המאפיין הזה או את משתנה הסביבה $ANDROID_HOME.

אפשר להוריד את ה-SDK של Android באתר המפתחים של Android.

repo_mapping

Dictionary: String -> String; optional

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

לדוגמה, רשומה "@foo": "@bar" מצהירה שבכל זמן המאגר הזה תלוי ב-"@foo" (כמו תלות ב-"@foo//some:target"), הוא צריך לפתור את התלות בתוך "@bar" בכל העולם ("@bar//some:target").