Yeni bir cihaz ekleme

Cihazınız ve ürününüz için makefile'lar oluşturmak için bu sayfadaki bilgileri kullanın.

Her yeni Android modülünün, derleme sistemini modül meta verileri, derleme zamanı bağımlılıkları ve paketleme talimatlarıyla yönlendirmek için bir yapılandırma dosyası olması gerekir. Android, Soong derleme sistemini kullanıyor. Android derleme sistemi hakkında daha fazla bilgi için bkz. Android Oluşturma .

Yapı katmanlarını anlama

Yapı hiyerarşisi, bir cihazın fiziksel yapısına karşılık gelen soyutlama katmanlarını içerir. Bu katmanlar aşağıdaki tabloda açıklanmıştır. Her katman, bire-çok ilişkisiyle bir üstteki katmanla ilişkilidir. Örneğin bir mimaride birden fazla pano bulunabilir ve her panoda birden fazla ürün bulunabilir. Belirli bir katmandaki bir öğeyi, aynı katmandaki bir öğenin özelleştirilmesi olarak tanımlayabilirsiniz; bu, kopyalamayı ortadan kaldırır ve bakımı kolaylaştırır.

Katman Örnek Tanım
Ürün myProduct, myProduct_eu, myProduct_eu_fr, j2, sdk Ürün katmanı, oluşturulacak modüller, desteklenen yerel ayarlar ve çeşitli yerel ayarlar için yapılandırma gibi bir nakliye ürününün özellik spesifikasyonunu tanımlar. Başka bir deyişle bu, ürünün genel adıdır . Ürüne özgü değişkenler ürün tanımı makefile'larında tanımlanır. Bir ürün, bakımı kolaylaştıran diğer ürün tanımlarından miras alabilir. Yaygın bir yöntem, tüm ürünler için geçerli olan özellikleri içeren bir temel ürün oluşturmak ve ardından bu temel ürüne dayalı ürün çeşitleri oluşturmaktır. Örneğin, yalnızca radyoları bakımından farklılık gösteren iki ürün (CDMA ve GSM), radyoyu tanımlamayan aynı temel üründen miras alabilir.
Kart/cihaz marlin, blueline, mercan Kart/cihaz katmanı, cihaz üzerindeki fiziksel plastik katmanını (yani cihazın endüstriyel tasarımını) temsil eder. Bu katman aynı zamanda bir ürünün çıplak şemalarını da temsil eder. Bunlar, karttaki çevre birimlerini ve bunların konfigürasyonunu içerir. Kullanılan adlar yalnızca farklı kart/cihaz konfigürasyonlarına yönelik kodlardır.
Kemer kol, x86, arm64, x86_64 Mimari katmanı, kartta çalışan işlemci yapılandırmasını ve uygulama ikili arayüzünü (ABI) açıklar.

Derleme değişkenlerini kullanma

Belirli bir ürün için geliştirme yaparken, son sürüm yapısında küçük farklılıklar olması yararlı olur. Bir modül tanımında modül, optional bağlı (varsayılan), debug ve eng değerlerinin bir veya daha fazla değeri olabilen LOCAL_MODULE_TAGS içeren etiketleri belirtebilir.

Bir modül bir etiket belirtmezse ( LOCAL_MODULE_TAGS ile), etiketi varsayılan olarak optional olur. İsteğe bağlı bir modül yalnızca PRODUCT_PACKAGES ile ürün yapılandırması gerektiriyorsa takılır.

Bunlar şu anda tanımlanmış yapı çeşitleridir.

Varyant Tanım
eng Bu varsayılan lezzettir.
  • eng veya debug ile etiketlenen modülleri yükler.
  • Etiketli modüllere ek olarak ürün tanım dosyalarına göre modülleri yükler.
  • ro.secure=0
  • ro.debuggable=1
  • ro.kernel.android.checkjni=1
  • adb varsayılan olarak etkindir.
user Varyant, son sürüm bitleri olarak tasarlandı.
  • user ile etiketlenen modülleri yükler.
  • Etiketli modüllere ek olarak ürün tanım dosyalarına göre modülleri yükler.
  • ro.secure=1
  • ro.debuggable=0
  • adb varsayılan olarak devre dışıdır.
userdebug Şu istisnalar dışında user ile aynıdır:
  • Ayrıca debug ile etiketlenen modülleri de yükler.
  • ro.debuggable=1
  • adb varsayılan olarak etkindir.

Kullanıcı hata ayıklama yönergeleri

Userdebug derlemelerini test sırasında çalıştırmak, cihaz geliştiricilerinin geliştirme aşamasındaki sürümlerin performansını ve gücünü anlamalarına yardımcı olur. Kullanıcı ve kullanıcı hata ayıklama yapıları arasında tutarlılığı korumak ve hata ayıklama için kullanılan yapılarda güvenilir ölçümler elde etmek için cihaz geliştiricilerinin şu yönergeleri izlemesi gerekir:

  • userdebug, aşağıdakiler hariç, root erişiminin etkin olduğu bir kullanıcı yapısı olarak tanımlanır:
    • yalnızca kullanıcı tarafından isteğe bağlı olarak çalıştırılan, yalnızca kullanıcı hata ayıklama uygulamaları
    • Arka planda derlemeler için dex2oatd ve dex2oat kullanımı gibi yalnızca boşta bakım sırasında (şarj cihazında/tam şarjlı) çalışan işlemler
  • Derleme türüne göre varsayılan olarak etkin/devre dışı olan özellikleri eklemeyin. Geliştiricilerin, hata ayıklama günlüğü veya yığın boşaltma gibi pil ömrünü etkileyen herhangi bir günlük kaydı biçimini kullanmaları önerilmez.
  • Userdebug'da varsayılan olarak etkin olan tüm hata ayıklama özellikleri açıkça tanımlanmalı ve proje üzerinde çalışan tüm geliştiricilerle paylaşılmalıdır. Hata ayıklamaya çalıştığınız sorun çözülene kadar hata ayıklama özelliklerini yalnızca sınırlı bir süre için etkinleştirmelisiniz.

Yapıyı kaynak katmanlarıyla özelleştirme

Android derleme sistemi, bir ürünü derleme sırasında özelleştirmek için kaynak katmanlarını kullanır. Kaynak katmanları, varsayılanların üzerine uygulanan kaynak dosyalarını belirtir. Kaynak katmanlarını kullanmak için proje derleme dosyasını, PRODUCT_PACKAGE_OVERLAYS üst düzey dizininize göre bir yola ayarlayacak şekilde değiştirin. Bu yol, yapı sistemi kaynakları aradığında geçerli kökle birlikte aranan bir gölge kök haline gelir.

En yaygın olarak özelleştirilmiş ayarlar frameworks/base/core/res/res/values/config.xml dosyasında bulunur.

Bu dosyada bir kaynak yer paylaşımı ayarlamak için aşağıdakilerden birini kullanarak yer paylaşımı dizinini proje derleme dosyasına ekleyin:

PRODUCT_PACKAGE_OVERLAYS := device/device-implementer/device-name/overlay

veya

PRODUCT_PACKAGE_OVERLAYS := vendor/vendor-name/overlay

Ardından dizine bir kaplama dosyası ekleyin, örneğin:

vendor/foobar/overlay/frameworks/base/core/res/res/values/config.xml

Kaplama config.xml dosyasında bulunan tüm dizeler veya dize dizileri, orijinal dosyada bulunanların yerine geçer.

Bir ürün oluşturmak

Cihazınızın kaynak dosyalarını birçok farklı şekilde düzenleyebilirsiniz. Burada Pixel uygulamasını organize etmenin bir yolunun kısa bir açıklaması bulunmaktadır.

Pixel, marlin adlı bir ana cihaz yapılandırmasıyla uygulanır. Bu cihaz konfigürasyonundan, isim ve model gibi cihaz hakkında ürüne özel bilgileri bildiren ürün tanımı makefile dosyasına sahip bir ürün oluşturulur. Tüm bunların nasıl ayarlandığını görmek için device/google/marlin dizinini görüntüleyebilirsiniz.

Ürün makefile'larının yazılması

Aşağıdaki adımlarda ürün marka dosyalarının Pixel ürün serisindekine benzer şekilde nasıl kurulacağı açıklanmaktadır:

  1. Ürününüz için bir device/ <company-name> / <device-name> dizini oluşturun. Örneğin, device/google/marlin . Bu dizin, cihazınızın kaynak kodunu ve bunları oluşturmak için gerekli makefile dosyalarını içerecektir.
  2. Aygıt için gereken dosyaları ve modülleri bildiren bir device.mk makefile dosyası oluşturun. Örnek için, bkz. device/google/marlin/device-marlin.mk .
  3. Cihaza dayalı olarak belirli bir ürün oluşturmak için ürün tanımı makefile dosyası oluşturun. Aşağıdaki makefile örnek olarak device/google/marlin/aosp_marlin.mk adresinden alınmıştır. Ürünün, makefile aracılığıyla device/google/marlin/device-marlin.mk ve vendor/google/marlin/device-vendor-marlin.mk dosyalarından miras aldığını ve aynı zamanda ad, marka gibi ürüne özgü bilgileri de bildirdiğine dikkat edin. ve modeli.
    # 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
    

    Makefile dosyalarınıza ekleyebileceğiniz ürüne özel ek değişkenler için Ürün tanımı değişkenlerini ayarlama konusuna bakın.

  4. Ürünün makefile dosyalarına işaret eden bir AndroidProducts.mk dosyası oluşturun. Bu örnekte yalnızca ürün tanımı makefile dosyasına ihtiyaç duyulmaktadır. Aşağıdaki örnek device/google/marlin/AndroidProducts.mk alınmıştır (hem marlin'i, Pixel'i hem de yelken balığını, çoğu yapılandırmayı paylaşan Pixel XL'i içerir):
    PRODUCT_MAKEFILES := \
    	$(LOCAL_DIR)/aosp_marlin.mk \
    	$(LOCAL_DIR)/aosp_sailfish.mk
    
    COMMON_LUNCH_CHOICES := \
    	aosp_marlin-userdebug \
    	aosp_sailfish-userdebug
    
  5. Panoya özgü konfigürasyonları içeren bir BoardConfig.mk makefile dosyası oluşturun. Örnek için, bkz. device/google/marlin/BoardConfig.mk .
  6. Yalnızca Android 9 ve daha düşük sürümler için , ürününüzü ("öğle yemeği kombinasyonu") kısa çizgiyle ayrılmış bir yapı varyantıyla birlikte yapıya eklemek için bir vendorsetup.sh dosyası oluşturun. Örneğin:
    add_lunch_combo <product-name>-userdebug
    
  7. Bu noktada aynı cihazı temel alarak daha fazla ürün çeşidi oluşturabilirsiniz.

Ürün tanımı değişkenlerini ayarlama

Ürüne özel değişkenler ürünün makefile dosyasında tanımlanır. Tablo, bir ürün tanımı dosyasında tutulan değişkenlerden bazılarını göstermektedir.

Değişken Tanım Örnek
PRODUCT_AAPT_CONFIG Paketleri oluştururken kullanılacak aapt yapılandırmalar.
PRODUCT_BRAND Yazılımın özelleştirildiği marka (örneğin operatör).
PRODUCT_CHARACTERISTICS Bir pakete varyanta özgü kaynakların eklenmesine izin veren aapt özellikleri. tablet , nosdcard
PRODUCT_COPY_FILES source_path:destination_path gibi kelimelerin listesi. Bu ürün oluşturulurken kaynak yoldaki dosya hedef yola kopyalanmalıdır. Kopyalama adımlarına ilişkin kurallar config/makefile dosyasında tanımlanmıştır.
PRODUCT_DEVICE Endüstriyel tasarımın adı. Bu aynı zamanda pano adıdır ve yapı sistemi BoardConfig.mk bulmak için bunu kullanır. tuna
PRODUCT_LOCALES Kullanıcı arayüzü dili ve saat, tarih ve para birimi biçimlendirmesi gibi kullanıcı için çeşitli ayarları açıklayan, iki harfli dil kodu ve iki harfli ülke kodu çiftlerinden oluşan, boşluklarla ayrılmış bir liste. PRODUCT_LOCALES listelenen ilk yerel ayar, ürünün varsayılan yerel ayarı olarak kullanılır. en_GB , de_DE , es_ES , fr_CA
PRODUCT_MANUFACTURER Üreticinin adı. acme
PRODUCT_MODEL Son ürün için son kullanıcının görebileceği ad.
PRODUCT_NAME Ürünün geneli için son kullanıcının görebileceği ad. Ayarlar > Hakkında ekranında görünür.
PRODUCT_OTA_PUBLIC_KEYS Ürün için kablosuz (OTA) genel anahtarların listesi.
PRODUCT_PACKAGES Yüklenecek APK'ların ve modüllerin listesi. Takvim kişileri
PRODUCT_PACKAGE_OVERLAYS Varsayılan kaynakların mı kullanılacağını yoksa ürüne özel katmanların mı ekleneceğini belirtir. vendor/acme/overlay
PRODUCT_SYSTEM_PROPERTIES Sistem bölümü için "key=value" biçimindeki sistem özelliği atamalarının listesi. Diğer bölümlere ilişkin sistem özellikleri, satıcı bölümü için PRODUCT_VENDOR_PROPERTIES olduğu gibi PRODUCT_<PARTITION>_PROPERTIES aracılığıyla ayarlanabilir. Desteklenen bölüm adları: SYSTEM , VENDOR , ODM , SYSTEM_EXT ve PRODUCT .

Varsayılan sistem dilini ve yerel ayar filtresini yapılandırma

Varsayılan dili ve sistem yerel ayar filtresini yapılandırmak için bu bilgileri kullanın, ardından yeni bir cihaz türü için yerel ayar filtresini etkinleştirin.

Özellikler

Özel sistem özelliklerini kullanarak hem varsayılan dili hem de sistem yerel ayar filtresini yapılandırın:

  • ro.product.locale : varsayılan yerel ayarı ayarlamak için. Bu, başlangıçta PRODUCT_LOCALES değişkenindeki ilk yerel ayara ayarlanmıştır; bu değeri geçersiz kılabilirsiniz. (Daha fazla bilgi için Ürün tanımı değişkenlerini ayarlama tablosuna bakın.)
  • ro.localization.locale_filter : yerel ayar adlarına uygulanan normal ifadeyi kullanarak bir yerel ayar filtresi ayarlamak için. Örneğin:
    • Kapsamlı filtre: ^(de-AT|de-DE|en|uk).* - yalnızca Almanca'ya (Avusturya ve Almanya varyantları), İngilizce'nin tüm İngilizce varyantlarına ve Ukraynaca'ya izin verir
    • Özel filtre: ^(?!de-IT|es).* - Almanca (İtalya varyantı) ve İspanyolcanın tüm varyantlarını hariç tutar.

Yerel filtreyi etkinleştirme

Filtreyi etkinleştirmek için ro.localization.locale_filter sistem özelliği dize değerini ayarlayın.

Fabrika kalibrasyonu sırasında filtre özelliği değerini ve varsayılan dili oem/oem.prop aracılığıyla ayarlayarak, filtreyi sistem görüntüsüne yerleştirmeden kısıtlamaları yapılandırabilirsiniz. Bu özellikleri aşağıda belirtildiği gibi PRODUCT_OEM_PROPERTIES değişkenine ekleyerek OEM bölümünden alındığından emin olursunuz:

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

Daha sonra üretimde gerçek değerler, hedef gereksinimleri yansıtacak şekilde oem/oem.prop dosyasına yazılır. Bu yaklaşımla, fabrika ayarlarına sıfırlama sırasında varsayılan değerler korunur, böylece başlangıç ​​ayarları kullanıcıya tam olarak ilk kurulum gibi görünür.

ADB_VENDOR_KEYS USB üzerinden bağlanacak şekilde ayarlanıyor

ADB_VENDOR_KEYS ortam değişkeni, cihaz üreticilerinin manuel yetkilendirme olmadan adb üzerinden hata ayıklanabilir derlemelere (-userdebug ve -eng, ancak -user değil) erişmesine olanak tanır. Normalde adb, her istemci bilgisayar için benzersiz bir RSA kimlik doğrulama anahtarı oluşturur ve bunu bağlı herhangi bir cihaza gönderir. Bu, adb yetkilendirme iletişim kutusunda gösterilen RSA anahtarıdır. Alternatif olarak, bilinen anahtarları sistem görüntüsüne oluşturabilir ve bunları adb istemcisiyle paylaşabilirsiniz. Bu, işletim sistemi geliştirme ve özellikle test etme açısından kullanışlıdır çünkü adb yetkilendirme iletişim kutusuyla manuel olarak etkileşim kurma ihtiyacını ortadan kaldırır.

Satıcı anahtarları oluşturmak için bir kişinin (genellikle sürüm yöneticisinin) şunları yapması gerekir:

  1. adb keygen kullanarak bir anahtar çifti oluşturun. Google cihazları için Google, her yeni işletim sistemi sürümü için yeni bir anahtar çifti oluşturur.
  2. Kaynak ağacın herhangi bir yerindeki anahtar çiftlerini kontrol edin. Google bunları örneğin vendor/google/security/adb/ dizininde saklar.
  3. PRODUCT_ADB_KEYS yapı değişkenini anahtar dizininize işaret edecek şekilde ayarlayın. Google bunu, anahtar dizinine PRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub yazan bir Android.mk dosyası ekleyerek yapar; bu, her işletim sistemi sürümü için yeni bir anahtar çifti oluşturmayı hatırlamamıza yardımcı olur.

Her sürüm için teslim edilen anahtar çiftlerimizi sakladığımız dizinde Google'ın kullandığı makefile dosyası aşağıda verilmiştir:

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

Bu satıcı anahtarlarını kullanmak için bir mühendisin yalnızca ADB_VENDOR_KEYS ortam değişkenini anahtar çiftlerinin depolandığı dizini işaret edecek şekilde ayarlaması gerekir. Bu, adb , manuel yetkilendirme gerektiren oluşturulan ana bilgisayar anahtarına geri dönmeden önce ilk önce bu kurallı anahtarları denemesini söyler. adb , yetkisiz bir cihaza bağlanamadığında hata mesajı, önceden ayarlanmamışsa ADB_VENDOR_KEYS ayarlamanızı önerecektir.