Yeni cihaz ekleme

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

Her yeni Android modülünde, derleme sistemini modül meta verileriyle, derleme zamanı bağımlılıklarıyla ve paketleme talimatlarıyla yönlendirecek bir yapılandırma dosyası bulunmalıdır. Android, Soong derleme sistemini kullanır. Android derleme sistemi hakkında daha fazla bilgi için Android'i derleme başlıklı makaleyi inceleyin.

Derleme katmanlarını anlama

Derleme 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şkiyle üstteki katmanla ilişkilidir. Örneğin, bir mimarinin birden fazla kartı olabilir ve her kartın birden fazla ürünü olabilir. Belirli bir katmandaki bir öğeyi, aynı katmandaki bir öğenin özellemesi olarak tanımlayabilirsiniz. Bu sayede kopyalama işlemini ortadan kaldırabilir ve bakımı basitleştirebilirsiniz.

Katman Örnek Açıklama
Ürün myProduct, myProduct_eu, myProduct_eu_fr, j2, sdk Ürün katmanı, bir kargo ürününün özellik spesifikasyonunu (ör. oluşturulacak modüller, desteklenen yerel ayarlar ve çeşitli yerel ayarlar için yapılandırma) tanımlar. Diğer bir deyişle, bu, genel ürünün adı Ürüne özel değişkenler, ürün tanımı makefile'lerinde tanımlanır. Ürünler diğer ürün tanımlarından devralınabilir. Bu, bakım işlemlerini basitleştirir. 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 varyantları oluşturmaktır. Örneğin, yalnızca radyolarında (CDMA ve GSM) farklılık gösteren iki ürün, radyo tanımlamayan aynı temel ürünü miras alabilir.
Kart/cihaz marlin, blueline, mercan Kart/cihaz katmanı, cihazdaki fiziksel plastik katmanı (yani cihazın endüstriyel tasarımını) temsil eder. Bu katman, bir ürünün temel şemalarını da temsil eder. Bunlar arasında karttaki çevre birimleri ve yapılandırmaları da bulunur. Kullanılan adlar, farklı kart/cihaz yapılandırmaları için kodlardan ibarettir.
Kemer arm, x86, arm64, x86_64 Mimari katmanı, kartta çalışan işlemci yapılandırmasını ve uygulama ikili arabirimini (ABI) açıklar.

Derleme varyantlarını kullanma

Belirli bir ürün için derleme yaparken nihai sürüm derlemesinde küçük varyasyonlar olması yararlıdır. Bir modül tanımında, modül LOCAL_MODULE_TAGS ile etiketler belirtebilir. Bu etiketler optional (varsayılan), debug ve eng değerlerinden biri veya daha fazlası olabilir.

Bir modülde etiket belirtilmezse (LOCAL_MODULE_TAGS ile) etiket varsayılan olarak optional olur. İsteğe bağlı modüller yalnızca PRODUCT_PACKAGES ile ürün yapılandırması tarafından gerekiyorsa yüklenir.

Bunlar, şu anda tanımlanmış derleme varyantlarıdır.

Varyant Açıklama
eng Bu, varsayılan lezzettir.
  • eng veya debug ile etiketlenmiş modülleri yükler.
  • Etiketlenmiş modüllere ek olarak modülleri ürün tanımı dosyalarına göre yükler.
  • ro.secure=0
  • ro.debuggable=1
  • ro.kernel.android.checkjni=1
  • adb varsayılan olarak etkindir.
user Nihai sürüm bitleri olması amaçlanan varyant.
  • user ile etiketlenmiş modülleri yükler.
  • Etiketlenmiş modüllere ek olarak modülleri ürün tanımı dosyalarına göre yükler.
  • ro.secure=1
  • ro.debuggable=0
  • adb varsayılan olarak devre dışıdır.
userdebug Aşağıdaki istisnalar dışında user ile aynıdır:
  • debug ile etiketlenmiş modülleri de yükler.
  • ro.debuggable=1
  • adb varsayılan olarak etkindir.

userdebug için yönergeler

Test sırasında userdebug derlemelerini çalıştırmak, cihaz geliştiricilerine geliştirme aşamasındaki sürümlerin performansını ve gücünü anlamalarına yardımcı olur. Cihaz geliştiricileri, kullanıcı ve userdebug derlemeleri arasında tutarlılık sağlamak ve hata ayıklama için kullanılan derlemelerde güvenilir metrikler elde etmek amacıyla aşağıdaki yönergeleri uygulamalıdır:

  • userdebug, aşağıdakiler hariç olmak üzere kök erişiminin etkin olduğu bir kullanıcı derlemesi olarak tanımlanır:
    • Yalnızca kullanıcı tarafından istek üzerine çalıştırılan yalnızca userdebug uygulamaları
    • Arka plan derlemeleri için dex2oatd yerine dex2oat kullanmak 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 etkinleştirilen/devre dışı bırakılan özellikleri dahil etmeyin. Geliştiricilerin hata ayıklama günlük kaydı veya yığın dökümü gibi pil ömrünü etkileyen herhangi bir günlük kaydı kullanmaları önerilmez.
  • userdebug'da varsayılan olarak etkinleştirilen tüm hata ayıklama özellikleri açıkça tanımlanmalı ve projede çalışan tüm geliştiricilerle paylaşılmalıdır. Hata ayıklama özelliklerini, hata ayıklama

Kaynak yer paylaşımlarıyla derlemeyi özelleştirme

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

En sık özelleştirilen ayarlar frameworks/base/core/res/res/values/config.xml dosyasında bulunur.

Bu dosyada bir kaynak yer paylaşımı oluşturmak 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, dizin için bir yer paylaşımı dosyası ekleyin. Örneğin:

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

Yer paylaşımı config.xml dosyasında bulunan tüm dize veya dize dizileri, orijinal dosyada bulunanların yerini alır.

Ürün oluşturma

Cihazınızın kaynak dosyalarını birçok farklı şekilde düzenleyebilirsiniz. Pixel uygulamasını düzenlemenin bir yolunun kısa bir açıklamasını aşağıda bulabilirsiniz.

Pixel, marlin adlı bir ana cihaz yapılandırmasıyla uygulanır. Bu cihaz yapılandırmasından, cihazla ilgili ürüne özgü bilgileri (ör. ad ve model) açıklayan bir ürün tanımı makefile ile 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'leri yazma

Aşağıdaki adımlarda, ürün makefile'lerinin Pixel ürün serisine benzer şekilde nasıl ayarlanacağı açıklanmaktadır:

  1. Ürününüz için bir device/<company-name>/<device-name> dizin oluşturun. Örneğin, device/google/marlin. Bu dizin, cihazınızın kaynak kodunu ve bu kodu derlemek için gereken makefile'leri içerir.
  2. Cihaz için gereken dosyaları ve modülleri açıklayan bir device.mk makefile oluşturun. Örnek için bkz. device/google/marlin/device-marlin.mk.
  3. Cihaza göre belirli bir ürün oluşturmak için ürün tanımı makefile'i oluşturun. Aşağıdaki makefile, örnek olarak device/google/marlin/aosp_marlin.mk'ten 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 devraldığına ve ad, marka ve model gibi ürüne özgü bilgileri de beyan ettiğine dikkat edin.
    # 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
    

    Derleme dosyalarınıza ekleyebileceğiniz ürüne özgü diğer değişkenler için Ürün tanımı değişkenlerini ayarlama bölümüne bakın.

  4. Ürünün makefile'lerini işaret eden bir AndroidProducts.mk dosyası oluşturun. Bu örnekte, yalnızca ürün tanımı makefile'i gereklidir. Aşağıdaki örnek, device/google/marlin/AndroidProducts.mk (hem marlin (Pixel) hem de sailfish (Pixel XL) cihazları içerir. Bu cihazlar, yapılandırmalarının büyük bir kısmını paylaşır.) cihazından alınmıştır:
    PRODUCT_MAKEFILES := \
    	$(LOCAL_DIR)/aosp_marlin.mk \
    	$(LOCAL_DIR)/aosp_sailfish.mk
    
    COMMON_LUNCH_CHOICES := \
    	aosp_marlin-userdebug \
    	aosp_sailfish-userdebug
    
  5. Karta özgü yapılandırmaları içeren bir BoardConfig.mk makefile oluşturun. Örnek için bkz. device/google/marlin/BoardConfig.mk.
  6. Yalnızca Android 9 ve önceki sürümler için ürününüzü derleme varyantıyla birlikte tire ile ayrılmış bir vendorsetup.sh dosyasıyla derlemeye ekleyin. Örnek:
    add_lunch_combo <product-name>-userdebug
    
  7. Bu noktada, aynı cihaza dayalı daha fazla ürün varyantı 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. Tabloda, ürün tanımı dosyasında tutulan değişkenlerden bazıları gösterilmektedir.

Değişken Açıklama Örnek
PRODUCT_AAPT_CONFIG Paket oluştururken kullanılacak aapt yapılandırmaları.
PRODUCT_BRAND Yazılımın özelleştirildiği marka (ör. operatör).
PRODUCT_CHARACTERISTICS aapt özelliklerini kullanarak pakete varyanta özel kaynaklar ekleyebilirsiniz. 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 adresinde tanımlanmıştır.
PRODUCT_DEVICE Endüstriyel tasarımın adı. Bu aynı zamanda kart adıdır ve derleme sistemi BoardConfig.mk'ü bulmak için bu adı kullanır. tuna
PRODUCT_LOCALES Kullanıcının çeşitli ayarlarını (ör. kullanıcı arayüzü dili, saat, tarih ve para birimi biçimlendirmesi) açıklayan, iki harfli dil kodu ve iki harfli ülke kodu çiftlerinin boşlukla ayrılmış listesi. PRODUCT_LOCALES içinde 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ün son kullanıcı tarafından görülebilen adı.
PRODUCT_NAME Ürünün tamamı için son kullanıcı tarafından görülebilen ad. Ayarlar > Hakkında ekranında görünür.
PRODUCT_OTA_PUBLIC_KEYS Ürünün kablosuz (OTA) açık anahtarlarının listesi.
PRODUCT_PACKAGES Yüklenecek APK'ların ve modüllerin listesi. Takvim kişileri
PRODUCT_PACKAGE_OVERLAYS Varsayılan kaynakların kullanılıp kullanılmayacağını veya ürüne özel yer paylaşımları eklenip eklenmeyeceğini belirtir. vendor/acme/overlay
PRODUCT_SYSTEM_PROPERTIES Sistem bölümü için "key=value" biçiminde sistem özelliği atamalarının listesi. Diğer bölümlerin sistem özellikleri, tedarikçi firma bölümü için PRODUCT_VENDOR_PROPERTIES'te olduğu gibi PRODUCT_<PARTITION>_PROPERTIES üzerinden 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 dil 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 değer başlangıçta PRODUCT_LOCALES değişkenindeki ilk yerel ayara ayarlanı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 filtresi ayarlamak için yerel ayar adlarına uygulanan bir normal ifadeyi kullanır. Örneğin:
    • Kapsayıcı filtre: ^(de-AT|de-DE|en|uk).* - yalnızca Almanca (Avusturya ve Almanya varyantları), İngilizcenin tüm varyantları ve Ukraynaca'ya izin verir
    • Münhasır filtre: ^(?!de-IT|es).* - Almanca (İtalya varyantı) ve İspanyolca'nın tüm varyantlarını hariç tutar.

Yerel ayar filtresini etkinleştirme

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

Fabrika kalibrasyonunda oem/oem.prop aracılığıyla filtre özelliği değerini ve varsayılan dili ayarlayarak filtreyi sistem resmine yerleştirmeden kısıtlamaları yapılandırabilirsiniz. Aşağıda belirtildiği gibi PRODUCT_OEM_PROPERTIES değişkenine ekleyerek bu özelliklerin OEM bölümünden alınmasını sağlayabilirsiniz:

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

Ardından üretimde, hedef gereksinimleri yansıtmak için gerçek değerler oem/oem.prop alanına yazılır. Bu yaklaşımda, fabrika ayarlarına sıfırlama sırasında varsayılan değerler korunur. Böylece, ilk ayarlar kullanıcı için tam olarak ilk kurulum gibi görünür.

USB üzerinden bağlanmak için ADB_VENDOR_KEYS ayarını yapma

ADB_VENDOR_KEYS ortam değişkeni, cihaz üreticilerinin manuel yetkilendirme olmadan adb üzerinden hata ayıklama yapılabilir 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 bu anahtarı bağlı tüm cihazlara gönderir. Bu, adb yetkilendirme iletişim kutusunda gösterilen RSA anahtarıdır. Alternatif olarak, bilinen anahtarları sistem resmine ekleyebilir ve adb istemciyle paylaşabilirsiniz. Bu, adb yetkilendirme iletişim kutusuyla manuel olarak etkileşim kurmayı önlediği için işletim sistemi geliştirme ve özellikle test için yararlıdır.

Tedarikçi anahtarları oluşturmak için bir kişi (genellikle sürüm yöneticisi) şunları yapmalıdır:

  1. adb keygen kullanarak bir anahtar çifti oluşturun. Google, Google cihazlar için her yeni işletim sistemi sürümü için yeni bir anahtar çifti oluşturur.
  2. Kaynak ağacında bir yerdeki anahtar çiftlerini kontrol edin. Google bunları vendor/google/security/adb/ gibi bir yerde depolar.
  3. Derleme değişkeni PRODUCT_ADB_KEYS'yi anahtar dizininizi 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 dosya, her işletim sistemi sürümü için yeni bir anahtar çifti oluşturmayı hatırlamamıza yardımcı olur.

Google'ın her sürüm için teslim edilen anahtar çiftlerimizi depoladığımız dizinde kullandığı makefile 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 tedarikçi anahtarlarını kullanmak için mühendisin tek yapması gereken, ADB_VENDOR_KEYS ortam değişkenini anahtar çiftlerinin depolandığı dizine yönlendirmektir. Bu, adb'e manuel yetkilendirme gerektiren oluşturulan ana makine anahtarına geçmeden önce bu standart anahtarları denemesini söyler. adb, yetkisiz bir cihaza bağlanamadığında hata mesajında, henüz ayarlanmamışsa ADB_VENDOR_KEYS'yi ayarlamanızı önerir.