Kể từ ngày 27 tháng 3 năm 2025, bạn nên sử dụng android-latest-release thay vì aosp-main để xây dựng và đóng góp cho AOSP. Để biết thêm thông tin, hãy xem phần Thay đổi đối với AOSP.
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Cờ bản dựng là hằng số tại thời điểm tạo bản dựng và không thể thay đổi trong thời gian chạy. Các cờ này được dùng trong trường hợp không thể sử dụng cờ aconfig, chẳng hạn như
Bạn có một đoạn mã được biên dịch trước hoặc tạo sẵn mà bạn muốn đưa vào một bản dựng (không bắt buộc).
Bạn muốn thay đổi chính hệ thống xây dựng.
Bạn muốn đặt cờ xung quanh các phần phụ thuộc để quản lý kích thước mã.
Bạn muốn quản lý việc khởi chạy một tính năng, nhưng bạn cần kiểm tra giá trị của cờ trước khi hệ thống cung cấp cờ aconfig.
Khai báo cờ bản dựng
Cờ bản dựng được khai báo trong các tệp textproto. Cách khai báo cờ bản dựng:
Điều hướng đến WORKING_DIRECTORY/build/release/flag_declarations/
Tạo một tệp có tên là RELEASE_MY_FLAG_NAME.textproto.
Chỉnh sửa tệp và thêm một mục tương tự như sau:
name: "RELEASE_MY_FLAG_NAME"
namespace: "android_UNKNOWN"
description: "Control if we should read from new storage."
workflow: LAUNCH
containers: "product"
containers: "system"
containers: "system_ext"
containers: "vendor"
Trong trường hợp:
name chứa tên của cờ, đứng trước là RELEASE_. Chỉ được sử dụng chữ cái viết hoa và dấu gạch dưới.
namespace chứa không gian tên cho các nội dung đóng góp. Bạn phải làm việc với người đánh giá được chỉ định của Google để xác định không gian tên của mình. Nếu đang sử dụng
cờ phát hành tính năng để duy trì sự ổn định của bản sao AOSP của riêng mình, bạn có thể
sử dụng không gian tên theo ý muốn.
value là loại và giá trị ban đầu của cờ. Loại này có thể là bool_value hoặc string_value. Nếu loại là string_value thì giá trị phải nằm trong dấu ngoặc kép. Nếu không được chỉ định, giá trị sẽ là một chuỗi trống. Giá trị boolean được biểu thị dưới dạng true hoặc chuỗi trống cho giá trị false.
workflow là LAUNCH hoặc PREBUILT. Sử dụng LAUNCH cho các cờ boolean tiến từ false đến true, tương tự như các cờ phát hành tính năng.
Sử dụng PREBUILT cho các cờ đặt phiên bản, thường là của một phiên bản tạo sẵn.
containers loại mã bạn đang viết, chẳng hạn như "vendor" (nhà cung cấp) cho mã nhà cung cấp hoặc "product" (sản phẩm) cho mã sản phẩm. Nếu bạn không chắc chắn về giá trị cần sử dụng, hãy sử dụng cả 4 loại vùng chứa như trong mẫu trước.
Sử dụng cờ bản dựng trong tệp Soong
Trong tệp bản dựng và mô-đun mà bạn muốn truy vấn giá trị cờ, hãy sử dụng điều kiện để phân nhánh theo giá trị cờ. Ví dụ: trong đoạn mã sau, giá trị của cờ RELEASE__READ_FROM_NEW_STORAGE được truy vấn:
Nếu giá trị của cờ này là true, thì mô-đun libaconfig_storage_read_api_cc sẽ được liên kết động vào mô-đun cc_defaults.
Nếu giá trị của cờ này là false, thì sẽ không có điều gì xảy ra (default: [],).
Sử dụng cờ bản dựng trong tệp makefile
Trong tệp make, cờ bản dựng là một biến make chỉ có thể đọc. Mẫu tệp makefile sau đây truy cập vào một cờ bản dựng có tên là RELEASED_PACKAGE_NFC_STCK:
# NFC and Secure Element packagesPRODUCT_PACKAGES+=\
$(RELEASE_PACKAGE_NFC_STACK)\
Tag\
SecureElement\
android.hardware.nfc-service.st\
android.hardware.secure_element@1.0-service.st\
NfcOverlayCoral
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-27 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-07-27 UTC."],[],[],null,["# Declare and use a build flag\n\nBuild flags are build-time constants and can't be changed during runtime. These\nflags are used in circumstances where aconfig flags can't be used, such as\n\n- You have a precompiled or prebuilt piece of code that you want include optionally in a build.\n- You want to make changes to build system itself.\n- You want to put flags around dependencies to manage code size.\n- You want to manage the launch of a feature, but you need to check the value of the flag before aconfig flags are made available by the system.\n\nDeclare a build flag\n--------------------\n\nBuild flags are declared in textproto files. To declare a build flag:\n\n1. Navigate to \u003cvar translate=\"no\"\u003eWORKING_DIRECTORY\u003c/var\u003e`/build/release/flag_declarations/`\n2. Create a file called `RELEASE_`\u003cvar translate=\"no\"\u003eMY_FLAG_NAME\u003c/var\u003e`.textproto`.\n3. Edit the file and add an entry similar to the following:\n\n name: \"RELEASE_MY_FLAG_NAME\"\n namespace: \"android_UNKNOWN\"\n description: \"Control if we should read from new storage.\"\n workflow: LAUNCH\n containers: \"product\"\n containers: \"system\"\n containers: \"system_ext\"\n containers: \"vendor\"\n\n Where:\n - `name` contains the name of the flag preceded by `RELEASE_`. Only uppercase letters and underscore are allowed.\n - `namespace` contains the namespace for contributions. You must work with the assigned Google reviewer to determine your namespace. If you are using feature launch flags to maintain stability of your own AOSP mirror, you can use namespace however you like.\n - `value` is the initial type and value for the flag. The type can be `bool_value` or `string_value`. If type is `string_value` then the value must be in quotes. If not specified, the value is an empty string. Boolean values are represented as either `true` or the empty string for false.\n - `workflow` is either `LAUNCH` or `PREBUILT`. Use `LAUNCH` for boolean flags that advance from `false` to `true`, similar to feature launch flags. Use `PREBUILT` for flags that set a version, typically of a prebuilt.\n - `containers` the type of code you are writing, such as \"vendor\" for vendor code or \"product\" for product code. If you are in doubt of the value to use, use all four containers types as shown in the previous sample.\n\nUse a build flag in a Soong file\n--------------------------------\n\nIn the build file and module where you want to query the flag value, use a\nconditional to branch on the flag value. For example, in the following snippet,\nthe `RELEASE__READ_FROM_NEW_STORAGE` flag's value is queried: \n\n cc_defaults {\n name: \"aconfig_lib_cc_shared_link.defaults\",\n shared_libs: select(release_flag(\"RELEASE_READ_FROM_NEW_STORAGE\"), {\n true: [\"libaconfig_storage_read_api_cc],\n default: [],\n }),\n }\n\nIf this flag's value is `true`, the `libaconfig_storage_read_api_cc` module is\ndynamically linked into the `cc_defaults` module.\n\nIf this flag's value is `false`, nothing (`default: [],`) happens.\n\nUse a build flag in a makefile\n------------------------------\n\nIn the make file, a build flag is a read-only make variable. The following\nmakefile sample accesses a build flag called `RELEASED_PACKAGE_NFC_STCK`: \n\n # NFC and Secure Element packages\n PRODUCT_PACKAGES += \\\n $(RELEASE_PACKAGE_NFC_STACK) \\\n Tag \\\n SecureElement \\\n android.hardware.nfc-service.st \\\n android.hardware.secure_element@1.0-service.st \\\n NfcOverlayCoral\n\nThis flag's declaration has a `workflow` field set to `PREBUILT` in\n[`RELEASE_PACKAGE_NFC_STACK.textproto`](https://cs.android.com/android/platform/superproject/+/android-latest-release:build/release/flag_declarations/RELEASE_PACKAGE_NFC_STACK.textproto?q=%22RELEASE_PACKAGE_NFC_STACK%22&ss=android%2Fplatform%2Fsuperproject%2Fmain)\nand a string value of\n`com.android.nfcservices` [`RELEASE_PACKAGE_NFC_STACK.textproto`](https://cs.android.com/android/platform/superproject/+/android-latest-release:build/release/flag_values/ap3a/RELEASE_PACKAGE_NFC_STACK.textproto)\nthe flag values file for the `trunk_staging` development configuration.\n| **Note:** Flags whose `workflow` field is set to `LAUNCH` should always be compared to an empty string, for example if `flag == true` is written `ifneq (,$(RELEASE_MY_FLAG))` and if `flag == false` is written `ifeq (,$(RELEASE_MY_FLAG))`."]]