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