Gunakan informasi di halaman ini untuk membuat makefile untuk perangkat dan produk Anda.
Setiap modul Android baru harus memiliki file konfigurasi untuk mengarahkan sistem pembangunan dengan metadata modul, dependensi waktu kompilasi, dan instruksi pengemasan. Android menggunakan sistem pembangunan Soong . Lihat Membangun Android untuk informasi selengkapnya tentang sistem pembangunan Android.
Memahami membangun lapisan
Hirarki build mencakup lapisan abstraksi yang sesuai dengan susunan fisik perangkat. Lapisan-lapisan ini dijelaskan dalam tabel di bawah ini. Setiap lapisan berhubungan dengan satu di atasnya dalam hubungan satu-ke-banyak. Misalnya, sebuah arsitektur dapat memiliki lebih dari satu papan dan setiap papan dapat memiliki lebih dari satu produk. Anda dapat mendefinisikan elemen di lapisan tertentu sebagai spesialisasi elemen di lapisan yang sama, yang menghilangkan penyalinan dan menyederhanakan perawatan.
Lapisan | Contoh | Keterangan |
---|---|---|
Produk | myProduct, myProduct_eu, myProduct_eu_fr, j2, sdk | Lapisan produk mendefinisikan spesifikasi fitur produk pengiriman seperti modul yang akan dibuat, lokal yang didukung, dan konfigurasi untuk berbagai lokal. Dengan kata lain, ini adalah nama produk secara keseluruhan. Variabel khusus produk didefinisikan dalam makefile definisi produk. Sebuah produk dapat mewarisi dari definisi produk lain, yang menyederhanakan perawatan. Cara yang umum dilakukan adalah dengan membuat produk dasar yang berisi fitur-fitur yang berlaku untuk semua produk, kemudian membuat varian produk berdasarkan produk dasar tersebut. Misalnya, dua produk yang hanya berbeda radionya (CDMA versus GSM) dapat mewarisi dari produk dasar yang sama yang tidak mendefinisikan radio. |
Papan/perangkat | marlin, garis biru, karang | Lapisan papan/perangkat mewakili lapisan fisik plastik pada perangkat (yaitu, desain industri perangkat). Lapisan ini juga mewakili skema telanjang suatu produk. Ini termasuk periferal di papan dan konfigurasinya. Nama yang digunakan hanyalah kode untuk konfigurasi papan/perangkat yang berbeda. |
Lengkungan | lengan, x86, lengan64, x86_64 | Lapisan arsitektur menjelaskan konfigurasi prosesor dan antarmuka biner aplikasi (ABI) yang berjalan di papan. |
Menggunakan varian build
Saat membangun untuk produk tertentu, ada gunanya memiliki sedikit variasi pada versi rilis final. Dalam definisi modul, modul dapat menentukan tag dengan LOCAL_MODULE_TAGS
, yang dapat berupa satu atau beberapa nilai optional
(default), debug
, dan eng
.
Jika modul tidak menentukan tag (oleh LOCAL_MODULE_TAGS
), default tagnya adalah optional
. Modul opsional dipasang hanya jika diperlukan oleh konfigurasi produk dengan PRODUCT_PACKAGES
.
Ini adalah varian build yang saat ini ditentukan.
Varian | Keterangan |
---|---|
eng | Ini adalah rasa default.
|
user | Varian dimaksudkan sebagai bit rilis final.
|
userdebug | Sama seperti user , dengan pengecualian ini:
|
Pedoman untuk debug pengguna
Menjalankan pengujian build userdebug membantu pengembang perangkat memahami kinerja dan kekuatan rilis dalam pengembangan. Untuk menjaga konsistensi antara build pengguna dan userdebug, dan untuk mencapai metrik yang andal dalam build yang digunakan untuk debugging, pengembang perangkat harus mengikuti panduan berikut:
- userdebug didefinisikan sebagai build pengguna dengan akses root diaktifkan, kecuali:
- aplikasi khusus userdebug yang hanya dijalankan sesuai permintaan oleh pengguna
- Operasi yang hanya berjalan selama pemeliharaan idle (dengan pengisi daya/terisi penuh), seperti menggunakan
dex2oatd
versusdex2oat
untuk kompilasi latar belakang
- Jangan sertakan fitur yang diaktifkan/dinonaktifkan secara default berdasarkan tipe build. Pengembang tidak disarankan untuk menggunakan segala bentuk pencatatan yang memengaruhi masa pakai baterai, seperti pencatatan debug atau pembuangan tumpukan.
- Setiap fitur debugging yang diaktifkan secara default di userdebug harus didefinisikan dengan jelas dan dibagikan dengan semua pengembang yang mengerjakan proyek. Anda harus mengaktifkan fitur debug hanya dalam waktu terbatas hingga masalah yang Anda coba debug teratasi.
Menyesuaikan bangunan dengan hamparan sumber daya
Sistem build Android menggunakan overlay sumber daya untuk menyesuaikan produk pada waktu build. Overlay sumber daya menentukan file sumber daya yang diterapkan di atas default. Untuk menggunakan hamparan sumber daya, ubah file pembangunan proyek untuk menyetel PRODUCT_PACKAGE_OVERLAYS
ke jalur yang relatif terhadap direktori tingkat atas Anda. Jalur itu menjadi akar bayangan yang dicari bersama dengan akar saat ini ketika sistem pembangunan mencari sumber daya.
Pengaturan yang paling umum disesuaikan terdapat dalam file frameworks/base/core/res/res/values/config.xml .
Untuk menyiapkan overlay sumber daya pada file ini, tambahkan direktori overlay ke file build proyek menggunakan salah satu dari berikut ini:
PRODUCT_PACKAGE_OVERLAYS := device/device-implementer/device-name/overlay
atau
PRODUCT_PACKAGE_OVERLAYS := vendor/vendor-name/overlay
Kemudian, tambahkan file overlay ke direktori, misalnya:
vendor/foobar/overlay/frameworks/base/core/res/res/values/config.xml
Setiap string atau array string yang ditemukan di file config.xml
overlay menggantikan yang ditemukan di file asli.
Membangun produk
Anda dapat mengatur file sumber untuk perangkat Anda dengan berbagai cara. Berikut adalah deskripsi singkat tentang salah satu cara untuk mengatur implementasi Pixel.
Pixel diimplementasikan dengan konfigurasi perangkat utama bernama marlin
. Dari konfigurasi perangkat ini, produk dibuat dengan makefile definisi produk yang menyatakan informasi spesifik produk tentang perangkat seperti nama dan model. Anda dapat melihat direktori device/google/marlin
untuk melihat bagaimana semua ini diatur.
Menulis makefile produk
Langkah-langkah berikut menjelaskan cara menyiapkan makefile produk dengan cara yang mirip dengan lini produk Pixel:
- Buat direktori
device/ <company-name> / <device-name>
untuk produk Anda. Misalnya,device/google/marlin
. Direktori ini akan berisi kode sumber untuk perangkat Anda bersama dengan makefile untuk membuatnya. - Buat makefile
device.mk
yang mendeklarasikan file dan modul yang dibutuhkan untuk perangkat. Sebagai contoh, lihatdevice/google/marlin/device-marlin.mk
. - Buat makefile definisi produk untuk membuat produk tertentu berdasarkan perangkat. Makefile berikut diambil dari
device/google/marlin/aosp_marlin.mk
sebagai contoh. Perhatikan bahwa produk mewarisi dari filedevice/google/marlin/device-marlin.mk
danvendor/google/marlin/device-vendor-marlin.mk
melalui makefile sambil juga mendeklarasikan informasi spesifik produk seperti nama, merek, dan model.# Inherit from the common Open Source product configuration $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk) PRODUCT_NAME := aosp_marlin PRODUCT_DEVICE := marlin PRODUCT_BRAND := Android PRODUCT_MODEL := AOSP on msm8996 PRODUCT_MANUFACTURER := Google PRODUCT_RESTRICT_VENDOR_FILES := true PRODUCT_COPY_FILES += device/google/marlin/fstab.common:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.marlin $(call inherit-product, device/google/marlin/device-marlin.mk) $(call inherit-product-if-exists, vendor/google_devices/marlin/device-vendor-marlin.mk) PRODUCT_PACKAGES += \ Launcher3QuickStep \ WallpaperPicker
Lihat Mengatur variabel definisi produk untuk variabel khusus produk tambahan yang dapat Anda tambahkan ke file make Anda.
- Buat file
AndroidProducts.mk
yang mengarah ke file make produk. Dalam contoh ini, hanya makefile definisi produk yang diperlukan. Contoh di bawah ini berasal daridevice/google/marlin/AndroidProducts.mk
(yang berisi marlin, Pixel, dan sailfish, Pixel XL, yang berbagi konfigurasi paling banyak):PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/aosp_marlin.mk \ $(LOCAL_DIR)/aosp_sailfish.mk COMMON_LUNCH_CHOICES := \ aosp_marlin-userdebug \ aosp_sailfish-userdebug
- Buat makefile
BoardConfig.mk
yang berisi konfigurasi khusus papan. Sebagai contoh, lihatdevice/google/marlin/BoardConfig.mk
. - Hanya untuk Android 9 dan yang lebih rendah , buat file
vendorsetup.sh
untuk menambahkan produk Anda ("kombo makan siang") ke build bersama dengan varian build yang dipisahkan oleh tanda hubung. Misalnya:add_lunch_combo <product-name>-userdebug
- Pada titik ini, Anda dapat membuat lebih banyak varian produk berdasarkan perangkat yang sama.
Mengatur variabel definisi produk
Variabel khusus produk didefinisikan dalam makefile produk. Tabel menunjukkan beberapa variabel yang dipertahankan dalam file definisi produk.
Variabel | Keterangan | Contoh |
---|---|---|
PRODUCT_AAPT_CONFIG | konfigurasi aapt untuk digunakan saat membuat paket. | |
PRODUCT_BRAND | Merek (misalnya, operator) perangkat lunak disesuaikan untuk, jika ada. | |
PRODUCT_CHARACTERISTICS | karakteristik aapt untuk memungkinkan penambahan sumber daya khusus varian ke paket. | tablet , nosdcard |
PRODUCT_COPY_FILES | Daftar kata-kata seperti source_path:destination_path . File di jalur sumber harus disalin ke jalur tujuan saat membuat produk ini. Aturan untuk langkah penyalinan didefinisikan dalam config/makefile . | |
PRODUCT_DEVICE | Nama desain industri. Ini juga merupakan nama papan, dan sistem pembangunan menggunakannya untuk menemukan BoardConfig.mk . | tuna |
PRODUCT_LOCALES | Daftar kode bahasa dua huruf yang dipisahkan spasi, pasangan kode negara dua huruf yang menjelaskan beberapa pengaturan untuk pengguna, seperti bahasa UI dan waktu, tanggal, dan pemformatan mata uang. Lokal pertama yang tercantum di PRODUCT_LOCALES digunakan sebagai lokal default produk. | en_GB , de_DE , es_ES , fr_CA |
PRODUCT_MANUFACTURER | Nama pabrikan. | acme |
PRODUCT_MODEL | Nama yang terlihat oleh pengguna akhir untuk produk akhir. | |
PRODUCT_NAME | Nama yang terlihat oleh pengguna akhir untuk keseluruhan produk. Muncul di layar Pengaturan > Tentang . | |
PRODUCT_OTA_PUBLIC_KEYS | Daftar kunci publik over-the-air (OTA) untuk produk. | |
PRODUCT_PACKAGES | Daftar APK dan modul yang akan dipasang. | Kontak kalender |
PRODUCT_PACKAGE_OVERLAYS | Menunjukkan apakah akan menggunakan sumber daya default atau menambahkan hamparan khusus produk apa pun. | vendor/acme/overlay |
PRODUCT_SYSTEM_PROPERTIES | Daftar penetapan properti sistem dalam format "key=value" untuk partisi sistem. Properti sistem untuk partisi lain dapat disetel melalui PRODUCT_<PARTITION>_PROPERTIES seperti dalam PRODUCT_VENDOR_PROPERTIES untuk partisi vendor. Nama partisi yang didukung: SYSTEM , VENDOR , ODM , SYSTEM_EXT , dan PRODUCT . |
Mengonfigurasi bahasa sistem default dan filter lokal
Gunakan informasi ini untuk mengonfigurasi bahasa default dan filter lokal sistem, lalu aktifkan filter lokal untuk jenis perangkat baru.
Properti
Konfigurasikan bahasa default dan filter lokal sistem menggunakan properti sistem khusus:
-
ro.product.locale
: untuk mengatur lokal default. Ini awalnya disetel ke lokal pertama dalam variabelPRODUCT_LOCALES
; Anda dapat mengganti nilai itu. (Untuk informasi selengkapnya, lihat tabel Mengatur variabel definisi produk .) -
ro.localization.locale_filter
: untuk menyetel filter lokal, menggunakan ekspresi reguler yang diterapkan ke nama lokal. Sebagai contoh:- Filter inklusif:
^(de-AT|de-DE|en|uk).*
- hanya mengizinkan bahasa Jerman (varian Austria dan Jerman), semua varian bahasa Inggris dari bahasa Inggris, dan Ukraina - Filter eksklusif:
^(?!de-IT|es).*
- tidak termasuk bahasa Jerman (varian Italia), dan semua varian bahasa Spanyol.
- Filter inklusif:
Mengaktifkan filter lokal
Untuk mengaktifkan filter, setel nilai string properti sistem ro.localization.locale_filter
.
Dengan menyetel nilai properti filter dan bahasa default melalui oem/oem.prop
selama kalibrasi pabrik, Anda dapat mengonfigurasi pembatasan tanpa memasukkan filter ke dalam citra sistem. Anda memastikan bahwa properti ini diambil dari partisi OEM dengan menambahkannya ke variabel PRODUCT_OEM_PROPERTIES
seperti yang ditunjukkan di bawah ini:
# Delegation for OEM customization PRODUCT_OEM_PROPERTIES += \ ro.product.locale \ ro.localization.locale_filter
Kemudian dalam produksi, nilai aktual ditulis ke oem/oem.prop
, untuk mencerminkan persyaratan target. Dengan pendekatan ini, nilai default dipertahankan selama pengaturan ulang pabrik, sehingga pengaturan awal terlihat persis seperti pengaturan pertama bagi pengguna.
Menyetel ADB_VENDOR_KEYS untuk terhubung melalui USB
Variabel lingkungan ADB_VENDOR_KEYS
memungkinkan produsen perangkat mengakses build yang dapat di-debug (-userdebug dan -eng, tetapi tidak -user) melalui adb tanpa otorisasi manual. Biasanya adb menghasilkan kunci autentikasi RSA unik untuk setiap komputer klien, yang akan dikirim ke perangkat apa pun yang terhubung. Ini adalah kunci RSA yang ditampilkan dalam dialog otorisasi adb. Sebagai alternatif, Anda dapat membuat kunci yang dikenal ke dalam citra sistem dan membaginya dengan klien adb. Ini berguna untuk pengembangan OS dan khususnya untuk pengujian karena menghindari kebutuhan untuk berinteraksi secara manual dengan dialog otorisasi adb.
Untuk membuat kunci vendor, satu orang (biasanya manajer rilis) harus:
- Hasilkan pasangan kunci menggunakan
adb keygen
. Untuk perangkat Google, Google membuat pasangan kunci baru untuk setiap versi OS baru. - Periksa pasangan kunci, di suatu tempat di pohon sumber. Google menyimpannya di
vendor/google/security/adb/
, misalnya. - Setel variabel build
PRODUCT_ADB_KEYS
untuk menunjuk ke direktori kunci Anda. Google melakukan ini dengan menambahkan fileAndroid.mk
di direktori kunci yang bertuliskanPRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub
, yang membantu memastikan bahwa kita ingat untuk membuat pasangan kunci baru untuk setiap versi OS.
Inilah makefile yang digunakan Google di direktori tempat kami menyimpan pasangan kunci check-in kami untuk setiap rilis:
PRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub ifeq ($(wildcard $(PRODUCT_ADB_KEYS)),) $(warning ========================) $(warning The adb key for this release) $(warning ) $(warning $(PRODUCT_ADB_KEYS)) $(warning ) $(warning does not exist. Most likely PLATFORM_VERSION in build/core/version_defaults.mk) $(warning has changed and a new adb key needs to be generated.) $(warning ) $(warning Please run the following commands to create a new key:) $(warning ) $(warning make -j8 adb) $(warning LOGNAME=android-eng HOSTNAME=google.com adb keygen $(patsubst %.pub,%,$(PRODUCT_ADB_KEYS))) $(warning ) $(warning and upload/review/submit the changes) $(warning ========================) $(error done) endif
Untuk menggunakan kunci vendor ini, seorang insinyur hanya perlu menyetel variabel lingkungan ADB_VENDOR_KEYS
untuk menunjuk ke direktori tempat pasangan kunci disimpan. Ini memberitahu adb
untuk mencoba kunci kanonik ini terlebih dahulu, sebelum kembali ke kunci host yang dihasilkan yang memerlukan otorisasi manual. Saat adb
tidak dapat terhubung ke perangkat yang tidak sah, pesan kesalahan akan menyarankan Anda menyetel ADB_VENDOR_KEYS
jika belum disetel.