Menambahkan perangkat baru

Gunakan informasi di halaman ini untuk membuat makefile untuk perangkat dan produk Anda.

Setiap modul Android baru harus memiliki file konfigurasi untuk mengarahkan sistem build dengan metadata modul, dependensi waktu kompilasi, dan petunjuk pengemasan. Android menggunakan sistem build Soong. Lihat Membangun Android untuk mengetahui informasi selengkapnya tentang sistem build Android.

Memahami lapisan build

Hierarki build mencakup lapisan abstraksi yang sesuai dengan konfigurasi fisik perangkat. Lapisan ini dijelaskan dalam tabel di bawah. Setiap lapisan terkait dengan lapisan di atasnya dalam hubungan one-to-many. Misalnya, sebuah arsitektur dapat memiliki lebih dari satu papan dan setiap papan dapat memiliki lebih dari satu produk. Anda dapat menentukan elemen dalam lapisan tertentu sebagai spesialisasi elemen dalam lapisan yang sama, yang menghilangkan penyalinan dan menyederhanakan pemeliharaan.

Layer Contoh Deskripsi
Produk myProduct, myProduct_eu, myProduct_eu_fr, j2, sdk Lapisan produk menentukan spesifikasi fitur produk pengiriman seperti modul yang akan dibuat, lokalitas yang didukung, dan konfigurasi untuk berbagai lokalitas. Dengan kata lain, ini adalah nama produk secara keseluruhan. Variabel khusus produk ditentukan dalam makefile definisi produk. Produk dapat diwariskan dari definisi produk lain, yang menyederhanakan pemeliharaan. Metode umum adalah membuat produk dasar yang berisi fitur yang berlaku untuk semua produk, lalu membuat varian produk berdasarkan produk dasar tersebut. Misalnya, dua produk yang hanya berbeda radio (CDMA versus GSM) dapat diwariskan dari produk dasar yang sama yang tidak menentukan radio.
Papan/perangkat marlin, blueline, coral Lapisan papan/perangkat mewakili lapisan fisik plastik pada perangkat (yaitu, desain industri perangkat). Lapisan ini juga merepresentasikan skema produk yang paling mendasar. Ini mencakup periferal di papan dan konfigurasinya. Nama yang digunakan hanyalah kode untuk berbagai konfigurasi board/perangkat.
Arch arm, x86, arm64, x86_64 Lapisan arsitektur menjelaskan konfigurasi prosesor dan antarmuka biner aplikasi (ABI) yang berjalan di papan.

Menggunakan varian build

Saat membangun untuk produk tertentu, sebaiknya miliki variasi kecil pada build rilis akhir. 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 (dengan LOCAL_MODULE_TAGS), tag defaultnya adalah optional. Modul opsional hanya diinstal jika diperlukan oleh konfigurasi produk dengan PRODUCT_PACKAGES.

Ini adalah varian build yang saat ini ditentukan.

Varian Deskripsi
eng Ini adalah rasa default.
  • Menginstal modul yang diberi tag eng atau debug.
  • Menginstal modul sesuai dengan file definisi produk, selain modul yang diberi tag.
  • ro.secure=0
  • ro.debuggable=1
  • ro.kernel.android.checkjni=1
  • adb diaktifkan secara default.
user Varian yang dimaksudkan untuk menjadi bit rilis akhir.
  • Menginstal modul yang diberi tag dengan user.
  • Menginstal modul sesuai dengan file definisi produk, selain modul yang diberi tag.
  • ro.secure=1
  • ro.debuggable=0
  • adb dinonaktifkan secara default.
userdebug Sama seperti user, dengan pengecualian berikut:
  • Juga menginstal modul yang diberi tag debug.
  • ro.debuggable=1
  • adb diaktifkan secara default.

Panduan untuk userdebug

Menjalankan build userdebug dalam pengujian membantu developer perangkat memahami performa dan daya rilis dalam pengembangan. Untuk menjaga konsistensi antara build pengguna dan userdebug, serta untuk mendapatkan metrik yang andal dalam build yang digunakan untuk proses debug, developer 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 saat perangkat tidak digunakan (saat mengisi daya/terisi penuh), seperti menggunakan dex2oatd versus dex2oat untuk kompilasi latar belakang
  • Jangan menyertakan fitur yang diaktifkan/dinonaktifkan secara default berdasarkan jenis build. Developer tidak disarankan untuk menggunakan bentuk logging apa pun yang memengaruhi masa pakai baterai, seperti logging debug atau heap dumping.
  • Semua fitur proses debug yang diaktifkan secara default di userdebug harus ditentukan dengan jelas dan dibagikan kepada semua developer yang mengerjakan project. Anda hanya boleh mengaktifkan fitur pen-debugan untuk jangka waktu terbatas hingga masalah yang ingin Anda debug teratasi.

Menyesuaikan build dengan overlay resource

Sistem build Android menggunakan overlay resource untuk menyesuaikan produk pada waktu build. Overlay resource menentukan file resource yang diterapkan di atas default. Untuk menggunakan overlay resource, ubah file build project untuk menetapkan PRODUCT_PACKAGE_OVERLAYS ke jalur relatif terhadap direktori level teratas Anda. Jalur tersebut menjadi root bayangan yang ditelusuri bersama dengan root saat ini saat sistem build menelusuri resource.

Setelan yang paling sering disesuaikan terdapat dalam file frameworks/base/core/res/res/values/config.xml.

Untuk menyiapkan overlay resource pada file ini, tambahkan direktori overlay ke file build project menggunakan salah satu cara berikut:

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

String atau array string apa pun yang ditemukan dalam file config.xml overlay akan menggantikan string atau array string yang ditemukan dalam file asli.

Membangun produk

Anda dapat mengatur file sumber untuk perangkat dengan berbagai cara. Berikut deskripsi singkat tentang salah satu cara untuk mengatur penerapan Pixel.

Pixel diimplementasikan dengan konfigurasi perangkat utama bernama marlin. Dari konfigurasi perangkat ini, produk dibuat dengan file make produk yang menyatakan informasi khusus produk tentang perangkat seperti nama dan model. Anda dapat melihat direktori device/google/marlin untuk melihat cara penyiapan semua ini.

Menulis file make produk

Langkah-langkah berikut menjelaskan cara menyiapkan file make produk dengan cara yang serupa dengan lini produk Pixel:

  1. Buat direktori device/<company-name>/<device-name> untuk produk Anda. Misalnya, device/google/marlin. Direktori ini akan berisi kode sumber untuk perangkat Anda beserta makefile untuk mem-buildnya.
  2. Buat makefile device.mk yang mendeklarasikan file dan modul yang diperlukan untuk perangkat. Untuk contoh, lihat device/google/marlin/device-marlin.mk.
  3. 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 diwariskan dari file device/google/marlin/device-marlin.mk dan vendor/google/marlin/device-vendor-marlin.mk melalui makefile sekaligus mendeklarasikan informasi khusus 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 Menetapkan variabel definisi produk untuk variabel spesifik produk tambahan yang dapat Anda tambahkan ke makefile.

  4. Buat file AndroidProducts.mk yang mengarah ke makefile produk. Dalam contoh ini, hanya makefile definisi produk yang diperlukan. Contoh di bawah ini berasal dari device/google/marlin/AndroidProducts.mk (yang berisi marlin, Pixel, dan sailfish, Pixel XL, yang memiliki sebagian besar konfigurasi yang sama):
    PRODUCT_MAKEFILES := \
    	$(LOCAL_DIR)/aosp_marlin.mk \
    	$(LOCAL_DIR)/aosp_sailfish.mk
    
    COMMON_LUNCH_CHOICES := \
    	aosp_marlin-userdebug \
    	aosp_sailfish-userdebug
    
  5. Buat makefile BoardConfig.mk yang berisi konfigurasi khusus papan. Untuk contoh, lihat device/google/marlin/BoardConfig.mk.
  6. Khusus Android 9 dan yang lebih rendah saja, buat file vendorsetup.sh untuk menambahkan produk Anda (kombinasi makan siang) ke build bersama dengan varian build yang dipisahkan dengan tanda hubung. Contoh:
    add_lunch_combo <product-name>-userdebug
    
  7. Pada tahap ini, Anda dapat membuat lebih banyak varian produk berdasarkan perangkat yang sama.

Menetapkan variabel definisi produk

Variabel khusus produk ditentukan dalam makefile produk. Tabel ini menunjukkan beberapa variabel yang dipertahankan dalam file definisi produk.

Variabel Deskripsi Contoh
PRODUCT_AAPT_CONFIG Konfigurasi aapt yang akan digunakan saat membuat paket.
PRODUCT_BRAND Merek (misalnya, operator) yang perangkat lunaknya disesuaikan untuknya.
PRODUCT_CHARACTERISTICS karakteristik aapt untuk memungkinkan penambahan resource khusus varian ke paket. tablet, nosdcard
PRODUCT_COPY_FILES Daftar kata seperti source_path:destination_path. File di jalur sumber harus disalin ke jalur tujuan saat membangun produk ini. Aturan untuk langkah-langkah penyalinan ditentukan dalam config/makefile.
PRODUCT_DEVICE Nama desain industri. Ini juga merupakan nama papan, dan sistem build menggunakannya untuk menemukan BoardConfig.mk. tuna
PRODUCT_LOCALES Daftar pasangan kode bahasa dua huruf dan kode negara dua huruf yang dipisahkan dengan spasi yang menjelaskan beberapa setelan untuk pengguna, seperti bahasa UI dan format waktu, tanggal, dan mata uang. Bahasa lokal pertama yang tercantum di PRODUCT_LOCALES digunakan sebagai bahasa lokal default produk. en_GB, de_DE, es_ES, fr_CA
PRODUCT_MANUFACTURER Nama produsen. acme
PRODUCT_MODEL Nama yang terlihat oleh pengguna akhir untuk produk akhir.
PRODUCT_NAME Nama yang terlihat oleh pengguna akhir untuk produk secara keseluruhan. Muncul di layar Setelan > Tentang.
PRODUCT_OTA_PUBLIC_KEYS Daftar kunci publik over-the-air (OTA) untuk produk.
PRODUCT_PACKAGES Daftar APK dan modul yang akan diinstal. Kontak kalender
PRODUCT_PACKAGE_OVERLAYS Menunjukkan apakah akan menggunakan resource default atau menambahkan overlay khusus produk. vendor/acme/overlay
PRODUCT_SYSTEM_PROPERTIES Daftar penetapan properti sistem dalam format "key=value" untuk partisi sistem. Properti sistem untuk partisi lain dapat ditetapkan melalui PRODUCT_<PARTITION>_PROPERTIES seperti di PRODUCT_VENDOR_PROPERTIES untuk partisi vendor. Nama partisi yang didukung: SYSTEM, VENDOR, ODM, SYSTEM_EXT, dan PRODUCT.

Mengonfigurasi filter lokal dan bahasa sistem default

Gunakan informasi ini untuk mengonfigurasi filter bahasa default dan lokal sistem, lalu aktifkan filter lokal untuk jenis perangkat baru.

Properti

Konfigurasi bahasa default dan filter lokalitas sistem menggunakan properti sistem khusus:

  • ro.product.locale: untuk menyetel lokalitas default. Ini awalnya ditetapkan ke lokalitas pertama dalam variabel PRODUCT_LOCALES; Anda dapat mengganti nilai tersebut. (Untuk mengetahui informasi selengkapnya, lihat tabel Menetapkan variabel definisi produk.)
  • ro.localization.locale_filter: untuk menyetel filter lokalitas, menggunakan ekspresi reguler yang diterapkan ke nama lokalitas. Contoh:
    • Filter inklusif: ^(de-AT|de-DE|en|uk).* - hanya mengizinkan varian bahasa Jerman (Austria dan Jerman), semua varian bahasa Inggris, dan bahasa Ukraina
    • Filter eksklusif: ^(?!de-IT|es).* - mengecualikan Jerman (varian Italia), dan semua varian Spanyol.

Mengaktifkan filter lokalitas

Untuk mengaktifkan filter, tetapkan 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 batasan tanpa menyematkan filter ke dalam image sistem. Anda memastikan bahwa properti ini diambil dari partisi OEM dengan menambahkannya ke variabel PRODUCT_OEM_PROPERTIES seperti yang ditunjukkan di bawah:

# Delegation for OEM customization
PRODUCT_OEM_PROPERTIES += \
    ro.product.locale \
    ro.localization.locale_filter

Kemudian, dalam produksi, nilai sebenarnya ditulis ke oem/oem.prop, untuk mencerminkan persyaratan target. Dengan pendekatan ini, nilai default dipertahankan selama reset ke setelan pabrik, sehingga setelan awal terlihat persis seperti penyiapan pertama bagi pengguna.

Menetapkan 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 bukan -user) melalui adb tanpa otorisasi manual. Biasanya, adb membuat kunci autentikasi RSA unik untuk setiap komputer klien, yang akan dikirim ke perangkat yang terhubung. Ini adalah kunci RSA yang ditampilkan dalam dialog otorisasi adb. Sebagai alternatif, Anda dapat membuat kunci yang diketahui ke dalam image sistem dan membagikannya dengan klien adb. Hal ini berguna untuk pengembangan OS dan terutama untuk pengujian karena tidak perlu berinteraksi secara manual dengan dialog otorisasi adb.

Untuk membuat kunci vendor, satu orang (biasanya pengelola rilis) harus:

  1. Buat pasangan kunci menggunakan adb keygen. Untuk perangkat Google, Google membuat pasangan kunci baru untuk setiap versi OS baru.
  2. Periksa pasangan kunci di suatu tempat dalam hierarki sumber. Google menyimpannya di vendor/google/security/adb/, misalnya.
  3. Tetapkan variabel build PRODUCT_ADB_KEYS agar mengarah ke direktori kunci Anda. Google melakukannya dengan menambahkan file Android.mk di direktori kunci yang bertuliskan PRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub, yang membantu memastikan bahwa kita ingat untuk membuat pasangan kunci baru untuk setiap versi OS.

Berikut adalah makefile yang digunakan Google di direktori tempat kami menyimpan pasangan kunci yang di-check in 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, engineer hanya perlu menetapkan variabel lingkungan ADB_VENDOR_KEYS untuk mengarah ke direktori tempat pasangan kunci disimpan. Hal ini memberi tahu adb untuk mencoba kunci kanonis ini terlebih dahulu, sebelum melakukan penggantian ke kunci host yang dibuat dan memerlukan otorisasi manual. Jika adb tidak dapat terhubung ke perangkat yang tidak sah, pesan error akan menyarankan agar Anda menyetel ADB_VENDOR_KEYS jika belum disetel.