אפשר להשתמש בדגלי aconfig בקוד Java, C, C++ ו-Rust. מערכת ה-Build של AOSP מפעילה כלי שנקרא aconfig, שמשמש ליצירת ספרייה של שיטות ספציפיות לשפה שבהן אפשר להשתמש כדי לגשת לערך של כל דגל. לפני שיוצרים את הספרייה, צריך להצהיר על הדגלים ולהוסיף אותם לבנייה.
הצהרה על דגל aconfig ל-Java
כדי להצהיר על דגל aconfig ב-Java:
בספרייה שבה נמצא הקוד החדש, יוצרים קובץ עם הסיומת
.aconfig, למשלmy_new_aconfig_flag_declarations.aconfig. קובץ aconfig הוא קובץ פרוטו טקסט שפועל לפי סכימה סטנדרטית.מוסיפים הצהרה על סימון שדומה לזו:
package: "com.example.android.aconfig.demo.flags" container: "system" flag { name: "my_new_flag" namespace: "aconfig_demo_namespace" description: "This flag controls untested code" bug: "<none>" }כאשר:
-
package, בשילוב עם שם הדגל, מספק מפתח ייחודי. ב-Java, הגדרתpackageל-foo.barיוצרת אוטומטית מחלקה בשםfoo.bar.Flags. ב-C++, שמות של שיטות גישה לסימון יהיוfoo::bar::"flagname". דגלים באותו קובץ הצהרה שייכים לאותו חבילה, אבל כמה קובצי הצהרה יכולים לתרום דגלים לאותה חבילה.
containerמגדיר אוסף של קוד שנבנה ונשלח יחד כקובץ בינארי. המאגרים התקפים הםsystem,vendor,system_ext,product,name.of.apexו-name.of.apk.
nameמכיל את שם הדגל, שכולל רק אותיות קטנות, קווים תחתונים ומספרים.
namespaceמכיל את מרחב השמות של התרומות. כדי לקבוע את מרחב השמות, צריך לעבוד עם בודק Google שהוקצה לכם. אם אתם משתמשים בדגלים להשקת תכונות כדי לשמור על יציבות של שיקוף AOSP משלכם, אתם יכולים להשתמש במרחב השמות איך שאתם רוצים.
descriptionמכיל תיאור קצר של התכונה או השינוי שסומנו.
bugהוא מספר הבאג שמשויך לתרומת הקוד החדשה. אתם צריכים לעבוד עם בודק Google שהוקצה לכם כדי לקבוע אתbug. אם אתם משתמשים בדגלים להשקת תכונות כדי לשמור על יציבות של שיקוף AOSP משלכם, אתם יכולים להשתמש במספר המעקב של הבאג או להשתמש ב-<none>.
-
שומרים את הקובץ ויוצאים מהעורך.
הגדרת הגרסה
אחרי שמצהירים על הדגל, מגדירים את ה-build כך שיוכל ליצור את קוד הספרייה שמשמש לגישה לערך של הדגל.
בקובץ הבנייה
Android.bp, מוסיפים קטעaconfig_declarationsשדומה לזה:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }כאשר:
-
nameמכיל את שם ההצהרה שכולל רק אותיות קטנות, קווים תחתונים ומספרים. -
packageמכיל את אותו שם חבילה שמופיע בהצהרה. -
srcsמכיל את השם של קובץ.aconfigשבו מוגדר הדגל.
-
שומרים את הקובץ ויוצאים מהעורך.
הצהרה על דגל aconfig עבור C ו-C++
כדי להצהיר על דגל aconfig עבור C ו-C++:
בספרייה שבה נמצא הקוד החדש, יוצרים קובץ עם הסיומת
.aconfig, למשלmy_new_aconfig_flag_declarations.aconfig. קובץ aconfig הוא קובץ פרוטו טקסט שפועל לפי סכימה סטנדרטית.מוסיפים הצהרה על סימון שדומה לזו:
package: "com.example.android.aconfig.demo.flags" container: "system" flag { name: "my_new_flag" namespace: "aconfig_demo_namespace" description: "This flag controls untested code" bug: "<none>" }כאשר:
-
package, בשילוב עם שם הדגל, מספק מפתח ייחודי. ב-Java, הגדרתpackageל-foo.barיוצרת אוטומטית מחלקה בשםfoo.bar.Flags. ב-C++, שמות של שיטות גישה לסימון יהיוfoo::bar::"flagname". דגלים באותו קובץ הצהרה שייכים לאותו חבילה, אבל כמה קובצי הצהרה יכולים לתרום דגלים לאותה חבילה.
containerמגדיר אוסף של קוד שנבנה ונשלח יחד כקובץ בינארי. המאגרים התקפים הםsystem,vendor,system_ext,product,name.of.apexו-name.of.apk.
nameמכיל את שם הדגל, שכולל רק אותיות קטנות, קווים תחתונים ומספרים.
namespaceמכיל את מרחב השמות של התרומות. כדי לקבוע את מרחב השמות, צריך לעבוד עם בודק Google שהוקצה לכם. אם אתם משתמשים בדגלים להשקת תכונות כדי לשמור על יציבות של שיקוף AOSP משלכם, אתם יכולים להשתמש במרחב השמות איך שאתם רוצים.
descriptionמכיל תיאור קצר של התכונה או השינוי שסומנו.
bugהוא מספר הבאג שמשויך לתרומת הקוד החדשה. אתם צריכים לעבוד עם בודק Google שהוקצה לכם כדי לקבוע אתbug. אם אתם משתמשים בדגלים להשקת תכונות כדי לשמור על יציבות של שיקוף AOSP משלכם, אתם יכולים להשתמש במספר המעקב של הבאג או להשתמש ב-<none>.
-
שומרים את הקובץ ויוצאים מהעורך.
הגדרת הגרסה
אחרי שמצהירים על הדגל, מגדירים את ה-build כך שיוכל ליצור את קוד הספרייה שמשמש לגישה לערך של הדגל.
בקובץ הבנייה
Android.bp, מוסיפים קטעaconfig_declarationsשדומה לזה:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }כאשר:
-
nameמכיל את שם ההצהרה שכולל רק אותיות קטנות, קווים תחתונים ומספרים. -
packageמכיל את אותו שם חבילה שמופיע בהצהרה. -
srcsמכיל את השם של קובץ ה-aconfig שבו הוגדר הדגל.
-
באותו קובץ, יוצרים יעד
cc_aconfig_libraryשדומה לזה:cc_aconfig_library { name: "aconfig_demo_flags_c_lib", aconfig_declarations: "aconfig_demo_flags", }כאשר:
-
nameמכיל את שם הספרייה שכולל רק אותיות קטנות, קווים תחתונים ומספרים. -
aconfig_declarationsמכיל את אותוnameשבו נעשה שימוש בהצהרה.
יעד הבנייה
cc_aconfig_libraryמפעיל Codegen של C או C++, שיוצר ספרייה עם הקוד שנוצר בזמן הבנייה.ספריית CC aconfig דומה ליעד של ספריית CC, אבל יש לה אפשרויות כמו
vendor_available,product_available,host_supportedו-vndk. אם יעד הבנייהcc_aconfig_libraryדורש סוג מסוים של וריאציות, יכול להיות שתצטרכו להוסיף גם את ההגדרה המתאימה ביעד של ספריית CC aconfig. לדוגמה, אם יעד הבנייה של ההורה הואvendor_availableעם הערךtrue, יכול להיות שתרצו להגדיר גם אתvendor_availableעם הערךtrueביעדcc_aconfig_libraryהזה.אחרי שמוסיפים את יעד הבנייה הזה, הקוד יכול לגשת לספרייה הזו. אפשר לכלול את הספרייה הזו באמצעות התחביר של
static_libאו שלshared_lib. אם רוצים להוסיף את הספרייה הזו כstatic_lib, צריך להוסיף תלות שלshared_libב-server_configurable_flags. בשלב 3 מוצגות הוראות להכללת ספריית הדגלים שנוצרה על ידי הקוד ב-libexample_cpp_lib.-
יוצרים יעד שמשתמש בדגלי aconfig, כמו בדוגמה הבאה
cc_library:cc_library { name: "libexample_cpp_lib", srcs: ["src/example_cpp_lib.cc"], double_loadable: true, cflags: [ "-Wall", "-Werror", "-Wno-unused-function", "-Wno-unused-parameter", ], header_libs: [ "jni_headers", ], shared_libs: [ "server_configurable_flags", ], static_libs: [ "aconfig_demo_flags_c_lib", ], export_include_dirs: ["src/include"], }כאשר:
-
shared_libsכולל תלויות נוספות שנדרשות לסימוני aconfig. -
static_libsהוא השם של הספרייה שנוצרת על ידי הבנייה לפי השדהcc_aconfig_librarynameבשלב 2. אחרי שיוצרים רשומה שלcc_libraryעם השם של הספרייה הסטטית, אפשר להשתמש בדגלי aconfig בקוד.
-
הצהרה על דגל aconfig ב-Rust
כדי להצהיר על דגל aconfig עבור Rust:
בספרייה שבה נמצא הקוד החדש, יוצרים קובץ עם הסיומת
.aconfig, למשלmy_new_aconfig_flag_declarations.aconfig. קובץ aconfig הוא קובץ פרוטו טקסט שפועל לפי סכימה סטנדרטית.מוסיפים הצהרה על סימון שדומה לזו:
package: "com.example.android.aconfig.demo.flags" container: "system" flag { name: "my_new_flag" namespace: "aconfig_demo_namespace" description: "This flag controls untested code" bug: "<none>" }כאשר:
-
package, בשילוב עם שם הדגל, מספק מפתח ייחודי. ב-Java, הגדרתpackageל-foo.barיוצרת אוטומטית מחלקה בשםfoo.bar.Flags. ב-C++, שמות של שיטות גישה לסימון יהיוfoo::bar::"flagname". דגלים באותו קובץ הצהרה שייכים לאותו חבילה, אבל כמה קובצי הצהרה יכולים לתרום דגלים לאותה חבילה.
containerמגדיר אוסף של קוד שנבנה ונשלח יחד כקובץ בינארי. המאגרים התקפים הםsystem,vendor,system_ext,product,name.of.apexו-name.of.apk.
nameמכיל את שם הדגל, שכולל רק אותיות קטנות, קווים תחתונים ומספרים.
namespaceמכיל את מרחב השמות של התרומות. כדי לקבוע את מרחב השמות, צריך לעבוד עם בודק Google שהוקצה לכם. אם אתם משתמשים בדגלים להשקת תכונות כדי לשמור על יציבות של שיקוף AOSP משלכם, אתם יכולים להשתמש במרחב השמות איך שאתם רוצים.
descriptionמכיל תיאור קצר של התכונה או השינוי שסומנו.
bugהוא מספר הבאג שמשויך לתרומת הקוד החדשה. אתם צריכים לעבוד עם בודק Google שהוקצה לכם כדי לקבוע אתbug. אם אתם משתמשים בדגלים להשקת תכונות כדי לשמור על יציבות של שיקוף AOSP משלכם, אתם יכולים להשתמש במספר המעקב של הבאג או להשתמש ב-<none>.
-
שומרים את הקובץ ויוצאים מהעורך.
הגדרת הגרסה
אחרי שמצהירים על הדגל, מגדירים את ה-build כך שיוכל ליצור את קוד הספרייה שמשמש לגישה לערך של הדגל.
בקובץ ה-build
Android.bp, מוסיפים קטעaconfig_declarationsשדומה לזה:aconfig_declarations { name: "aconfig_demo_flags", package: "com.example.android.aconfig.demo.flags", srcs: [ "my_new_aconfig_flag_declarations.aconfig" ], }כאשר:
-
nameמכיל את שם ההצהרה שכולל רק אותיות קטנות, קווים תחתונים ומספרים. -
packageמכיל את אותו שם חבילה שמופיע בהצהרה. -
srcsמכיל את השם של קובץ ה-aconfig שבו הוגדר הדגל.
-
יוצרים
rust_aconfig_libraryיעד שדומה לדוגמה הבאה. יעד זה מפעיל את Rust Codegen ויוצר ספריית Rust עם הקוד שנוצר במהלך משך זמן של תהליך build.rust_aconfig_library { name: "libaconfig_demo_flags_rust", crate_name: "aconfig_demo_flags_rust", aconfig_declarations: "aconfig_demo_flags", }כאשר:
-
nameמכיל את שם ההצהרה שכולל רק אותיות קטנות, קווים תחתונים ומספרים. -
crate_nameמכיל את אותו שם חבילה שמופיע בהצהרה. -
aconfig_declarationsמכיל את אותוnameשבו נעשה שימוש בהצהרה.
אחרי השינוי הזה, הקוד שלכם יכול להסתמך על ספריית Rust הזו.
-
באותו קובץ, יוצרים רשומה של
rust_libraryשדומה לזו:rust_library { name: "libexample_lib", rustlibs: [ "libaconfig_demo_flags_rust", ] }הדוגמה הזו מאפשרת ליעדי הבנייה של קוד המקור
libexample_demo_flags_rustלכלול את ספריית הדגלים שנוצרה על ידי הקוד.שומרים את הקובץ ויוצאים מהעורך.