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.
Cuttlefish: Tạo thiết bị tuỳ chỉnh
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.
Trang này mô tả cách tạo thiết bị Cuttlefish tuỳ chỉnh. Cuttlefish bao gồm các loại thiết bị được xác định trước ở nhiều kiểu dáng như được liệt kê trong AndroidProducts.mk
. Ngoài các tuỳ chọn tuỳ chỉnh thiết bị chung được mô tả trong phần Thêm thiết bị mới, bạn có thể thực hiện các tuỳ chỉnh dành riêng cho Cuttlefish, chẳng hạn như các cấu hình cài đặt trước của bo mạch thiết bị ảo (vsoc_x86_64, vsoc_arm64, vsoc_riscv64), hạt nhân tạo sẵn, trình tải khởi động tạo sẵn, thuộc tính của nhà cung cấp, cấu hình hệ thống, hỗ trợ ảo hoá lồng nhau và các tuỳ chọn hiển thị. Để biết danh sách đầy đủ các tham số thời gian xây dựng có thể tuỳ chỉnh, hãy xem device/google/cuttlefish/vsoc_x86_64/phone/aosp_cf.mk
.
Các bước sau đây mô tả cách tạo một thiết bị big_phone
x86-64 giả định có kích thước lớn gấp 10 lần so với một thiết bị Cuttlefish thông thường.
Kế thừa từ một mục tiêu hiện có
Cách kế thừa từ một mục tiêu hiện có:
- Tạo thư mục
device/google/cuttlefish/vsoc_x86_64/big_phone
.
- Tạo một tệp
aosp_cf.mk
trong thư mục đó.
$(call inherit-product, device/google/cuttlefish/vsoc_x86_64_phone.mk)
PRODUCT_NAME: big_phone
PRODUCT_DEVICE: vsoc_x86_64
PRODUCT_MANUFACTURER := My Company
PRODUCT_MODEL: My Company very large phone
PRODUCT_VENDOR_PROPERTIES += \
ro.soc.manufacturer=$(PRODUCT_MANUFACTURER) \
ro.soc.model=$(PRODUCT_DEVICE)
Thêm mục tiêu bữa trưa
Chèn mục tiêu lunch
vào tệp device/google/cuttlefish/AndroidProducts.mk
:
PRODUCT_MAKEFILES := \
...
big_phone:$(LOCAL_DIR)/vsoc_x86_64/big_phone/aosp_cf.mk
...
lunch big_phone
Xác định cấu hình JSON
Để khởi chạy thiết bị Cuttlefish, hãy tạo một tệp cấu hình JSON có tên big_phone.json
với cấu trúc phân cấp đại diện cho các thuộc tính thiết bị. Ví dụ: trong tệp cấu hình JSON, bạn có thể chỉ định các tuỳ chọn như RAM được phân bổ cho máy ảo và cấu hình màn hình. Tệp này không nhất thiết phải nằm trong cây AOSP.
Để biết thông tin chi tiết về định dạng JSON cho cấu hình, hãy xem phần Cấu hình chuẩn.
{
"instances":
[
{
"vm": {
"memory_mb": 40960,
},
"graphics": {
"displays": [
{
"width": 7200,
"height": 12800,
"dpi": 320
}
]
}
}
]
}
Để chạy cấu hình, hãy chạy:
cvd create --config_file=big_phone.json
Chạy launch_cvd (cũ)
Một số thuộc tính cấu hình nhất định không có trong định dạng cấu hình JSON phân cấp. Đối với các cấu hình như vậy, bạn có thể đặt giá trị mặc định của cờ launch_cvd
từ một từ điển JSON cấp một. Để biết danh sách đầy đủ tất cả các tuỳ chọn cấu hình, hãy xem cf_flags_validator.cpp
.
Phần sau đây mô tả ví dụ về cách ghi đè các giá trị mặc định của các tuỳ chọn cờ launch_cvd
bằng cách sử dụng tệp cấu hình JSON và cho phép trình chạy Cuttlefish khởi chạy cấu hình tuỳ chỉnh.
Tạo tệp cấu hình JSON, device/google/cuttlefish/shared/config/config_big_phone.json
, với các giá trị tuỳ chỉnh.
{
"x_res": 7200,
"y_res": 12800,
"dpi": 320,
"memory_mb": 40960,
"ddr_mem_mb": 49150,
}
Để trình chạy Cuttlefish khởi chạy cấu hình big_phone
, hãy đảm bảo trình chạy này có quyền truy cập vào tệp device/google/cuttlefish/shared/config/config_big_phone.json
bằng cách làm như sau:
Khai báo cấu phần phần mềm JSON dưới dạng cấu phần phần mềm bản dựng bằng cách thêm bài thơ prebuilt_etc_host
vào tệp device/google/cuttlefish/shared/config/Android.bp
.
prebuilt_etc_host {
name: "cvd_config_big_phone.json",
src: "config_big_phone.json",
sub_dir: "cvd_config",
}
Thêm nội dung khai báo cấu phần phần mềm bản dựng thu được vào trình chạy Cuttlefish bằng cách chạy nội dung sau trong device/google/cuttlefish/shared/device.mk
.
$(call soong_config_append,cvd,launch_configs,cvd_config_big_phone)
Tạo tệp android_info.txt
và liên kết cấu hình big_phone
với tệp bằng cách thêm dòng sau vào device/google/cuttlefish/vsoc_x86_64/big_phone/aosp_cf.mk
:
TARGET_BOARD_INFO_FILE := device/google/cuttlefish/vsoc_x86_64/<var>big_phone</var>/android-info.txt
Gắn nhãn loại thiết bị bằng cấu hình big_phone
bằng cách điền device/google/cuttlefish/vsoc_x86_64/big_phone/android-info.txt
bằng nội dung sau:
config=big_phone
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,["# Cuttlefish: Create a custom device\n\nThis page describes how to create a customized Cuttlefish device. Cuttlefish\nincludes predefined device types in different form factors as listed in\n[`AndroidProducts.mk`](https://cs.android.com/android/platform/superproject/+/android-latest-release:device/google/cuttlefish/AndroidProducts.mk). In addition to the general device customization\noptions described in\n[Adding a new device](/docs/setup/create/new-device), you can make\nCuttlefish-specific customizations such as virtual device board\nconfiguration presets (vsoc_x86_64, vsoc_arm64, vsoc_riscv64), kernel prebuilts,\nbootloader prebuilts, vendor properties, system configurations, nested\nvirtualization support, and display options. For a full list of the\nbuild time parameters that can be customized, see\n[`device/google/cuttlefish/vsoc_x86_64/phone/aosp_cf.mk`](https://cs.android.com/android/platform/superproject/+/android-latest-release:device/google/cuttlefish/vsoc_x86_64/phone/aosp_cf.mk).\n\nThe following steps describe how to create a fictional x86-64\n\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e device ten times the size of an ordinary\nCuttlefish device.\n\nInherit from an existing target\n-------------------------------\n\nTo inherit from an existing target:\n\n- Create a `device/google/cuttlefish/vsoc_x86_64/`\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e directory.\n- Create an `aosp_cf.mk` file in that directory.\n\n $(call inherit-product, device/google/cuttlefish/vsoc_x86_64_phone.mk)\n\n PRODUCT_NAME: \u003cvar translate=\"no\"\u003e\u003cspan class=\"devsite-syntax-n\"\u003ebig_phone\u003c/span\u003e\u003c/var\u003e\n PRODUCT_DEVICE: vsoc_x86_64\n PRODUCT_MANUFACTURER := \u003cvar translate=\"no\"\u003eMy\u003cspan class=\"devsite-syntax-w\"\u003e \u003c/span\u003eCompany\u003c/var\u003e\n PRODUCT_MODEL: \u003cvar translate=\"no\"\u003e\u003cspan class=\"devsite-syntax-n\"\u003eMy\u003c/span\u003e \u003cspan class=\"devsite-syntax-n\"\u003eCompany\u003c/span\u003e \u003cspan class=\"devsite-syntax-n\"\u003every\u003c/span\u003e \u003cspan class=\"devsite-syntax-n\"\u003elarge\u003c/span\u003e \u003cspan class=\"devsite-syntax-n\"\u003ephone\u003c/span\u003e\u003c/var\u003e\n\n PRODUCT_VENDOR_PROPERTIES += \\\n ro.soc.manufacturer=$(PRODUCT_MANUFACTURER) \\\n ro.soc.model=$(PRODUCT_DEVICE)\n\nAdd a lunch target\n------------------\n\nInsert the `lunch` target into the\n`device/google/cuttlefish/AndroidProducts.mk` file: \n\n PRODUCT_MAKEFILES := \\\n ...\n \u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e:$(LOCAL_DIR)/vsoc_x86_64/\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e/aosp_cf.mk\n ...\n\n lunch \u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e\n\nDefine JSON configuration\n-------------------------\n\nTo launch the Cuttlefish device, create a JSON configuration file named\n\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e`.json` with a hierarchical structure representing\nthe device properties. For example, in the JSON configuration file, you can\nspecify options such as the RAM allocated for the VM and the display\nconfiguration. This file doesn't have to be in the AOSP tree.\nFor details on the JSON format for configurations, see\n[Canonical configurations](/docs/devices/cuttlefish/multi-tenancy#canonical-configs). \n\n {\n \"instances\":\n [\n {\n \"vm\": {\n \"memory_mb\": 40960,\n },\n \"graphics\": {\n \"displays\": [\n {\n \"width\": 7200,\n \"height\": 12800,\n \"dpi\": 320\n }\n ]\n }\n }\n ]\n }\n\nTo launch the configuration, run: \n\n cvd create --config_file=\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e.json\n\nRun launch_cvd (legacy)\n-----------------------\n\nCertain configuration properties aren't available in the hierarchical JSON\nconfiguration format. For such configurations, you can set `launch_cvd` flag\ndefault values from a single-level JSON dictionary. For a full list of all\nconfiguration options, see\n[`cf_flags_validator.cpp`](https://github.com/google/android-cuttlefish/blob/main/base/cvd/cuttlefish/host/commands/cvd/parser/cf_flags_validator.cpp).\n\nThe following describes an example of how to override the default values of the\n[`launch_cvd` flag options](/docs/devices/cuttlefish/restart#flags)\nusing a JSON configuration file and enable the Cuttlefish launcher to launch the\ncustom configuration.\n\n1. Create a JSON configuration file,\n `device/google/cuttlefish/shared/config/config_`\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e`.json`,\n with custom values.\n\n {\n \"x_res\": 7200,\n \"y_res\": 12800,\n \"dpi\": 320,\n \"memory_mb\": 40960,\n \"ddr_mem_mb\": 49150,\n }\n\n2. For the Cuttlefish launcher to launch the `big_phone` config, ensure it has\n access to the\n `device/google/cuttlefish/shared/config/config_`\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e`.json`\n file by doing the following:\n\n 1. Declare the JSON artifact as a build artifact by adding the\n `prebuilt_etc_host` stanza in the\n `device/google/cuttlefish/shared/config/Android.bp` file.\n\n prebuilt_etc_host {\n name: \"cvd_config_\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e.json\",\n src: \"config_\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e.json\",\n sub_dir: \"cvd_config\",\n }\n\n 2. Add the resulting build artifact declaration into the Cuttlefish\n launcher by running the following in\n `device/google/cuttlefish/shared/device.mk`.\n\n $(call soong_config_append,cvd,launch_configs,cvd_config_\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e)\n\n 3. Create an `android_info.txt` file and tie the `big_phone` config to the\n file by adding the following line to\n `device/google/cuttlefish/vsoc_x86_64/`\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e`/aosp_cf.mk`:\n\n TARGET_BOARD_INFO_FILE := device/google/cuttlefish/vsoc_x86_64/\u003cvar\u003ebig_phone\u003c/var\u003e/android-info.txt\n\n 4. Label the device type with the `big_phone` config by populating\n `device/google/cuttlefish/vsoc_x86_64/`\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e`/android-info.txt`\n with the following:\n\n config=\u003cvar translate=\"no\"\u003ebig_phone\u003c/var\u003e"]]