Yeni Bir Cihaz Ekleme

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

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

Derleme 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, bir-çok ilişkisi içinde üstündeki katmanla ilişkilidir. Örneğin, bir mimaride birden fazla pano olabilir ve her panoda birden fazla ürün olabilir. Belirli bir katmandaki bir öğeyi, aynı katmandaki bir öğenin uzmanlaşması 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 sevkıyat ürününün özellik özelliklerini tanımlar. Başka bir deyişle, bu genel ürünün adıdır . Ürüne özel değişkenler, ürün tanımı makefilelerinde tanımlanır. Bir ürün, bakımı basitleştiren 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 telsizlerine göre farklılık gösteren iki ürün (CDMA'ya karşı GSM), bir telsizi tanımlamayan aynı temel üründen miras alabilir.
kart/cihaz marlin, mavi çizgi, 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 konfigürasyonlarını içerir. Kullanılan adlar yalnızca farklı kart/cihaz konfigürasyonları için kodlardır.
Kemer kol, x86, kol64, x86_64 Mimari katmanı, kart üzerinde çalışan işlemci yapılandırmasını ve uygulama ikili arabirimini (ABI) tanımlar.

Yapı varyantlarını kullanma

Belirli bir ürün için derleme yaparken, son sürüm derlemesinde küçük değişiklikler yapmak yararlıdır. Modül tanımında modül, optional (varsayılan), debug ve eng değerlerinden biri veya daha fazlası olabilen LOCAL_MODULE_TAGS ile etiketler belirtebilir.

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

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

varyant Tanım
eng Bu varsayılan lezzettir.
  • eng veya debug ile etiketlenmiş modülleri kurar.
  • Etiketli modüllere ek olarak ürün tanım dosyalarına göre modülleri kurar.
  • 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 etiketlenmiş modülleri kurar.
  • Etiketli modüllere ek olarak ürün tanım dosyalarına göre modülleri kurar.
  • ro.secure=1
  • ro.debuggable=0
  • adb varsayılan olarak devre dışıdır.
userdebug Bu istisnalar dışında user ile aynı:
  • Ayrıca debug ile etiketlenmiş modülleri de yükler.
  • ro.debuggable=1
  • adb varsayılan olarak etkindir.

Kullanıcı hata ayıklama yönergeleri

Testte userdebug derlemelerini çalıştırmak, cihaz geliştiricilerinin geliştirme aşamasındaki sürümlerin performansını ve gücünü anlaması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ştiricileri şu yönergeleri izlemelidir:

  • userdebug, aşağıdakiler dışında, root erişimi etkinleştirilmiş bir kullanıcı derlemesi 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 plan derlemeleri için dex2oatd karşı dex2oat kullanımı gibi yalnızca boşta bakım sırasında (şarj cihazında/tam şarjlıyken) çalışan işlemler
  • Yapı 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üğü 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 etkinleştirilen hata ayıklama özellikleri açıkça tanımlanmalı ve proje üzerinde çalışan tüm geliştiricilerle paylaşılmalıdır. Hata ayıklama özelliklerini, hata ayıklamaya çalıştığınız sorun çözülene kadar yalnızca sınırlı bir süre için etkinleştirmelisiniz.

Derlemeyi kaynak bindirmeleri ile özelleştirme

Android derleme sistemi, bir ürünü derleme zamanında özelleştirmek için kaynak bindirmeleri kullanır. Kaynak bindirmeleri, varsayılanların üzerine uygulanan kaynak dosyalarını belirtir. Kaynak kaplamaları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 mevcut 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 yerleşimi ayarlamak için, aşağıdakilerden birini kullanarak yerleşim 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 bindirme dosyası ekleyin, örneğin:

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

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

Bir ürün inşa etmek

Cihazınız için kaynak dosyaları birçok farklı şekilde düzenleyebilirsiniz. Bir Pixel uygulamasını organize etmenin bir yolunun kısa bir açıklaması burada.

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

Ürün makefile yazma

Aşağıdaki adımlarda, Pixel ürün serisine benzer bir şekilde ürün oluşturma dosyalarının 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şturacak makefile dosyalarını içerecektir.
  2. Cihaz için gereken dosyaları ve modülleri bildiren bir device.mk makefile oluşturun. Örnek için device/google/marlin/device-marlin.mk .
  3. Cihaza dayalı olarak belirli bir ürün oluşturmak için bir ürün tanımı makefile oluşturun. Aşağıdaki makefile örnek olarak device/google/marlin/aosp_marlin.mk . Ü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ığına ve ayrıca ad, marka, 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 bkz. Ürün tanımı değişkenlerini ayarlama .

  4. Ürünün makefile'lerine işaret eden bir AndroidProducts.mk dosyası oluşturun. Bu örnekte, yalnızca ürün tanımı makefile gereklidir. Aşağıdaki örnek device/google/marlin/AndroidProducts.mk (hem marlin, hem Pixel hem de yelken balığı, çoğu yapılandırmayı paylaşan Pixel XL 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 özel konfigürasyonları içeren bir BoardConfig.mk makefile oluşturun. Örnek için device/google/marlin/BoardConfig.mk .
  6. Yalnızca Android 9 ve önceki sürümler için, ürününüzü ("öğle yemeği kombosu") ve bir tire ile ayrılmış bir yapı varyantı ile birlikte yapıya eklemek için bir vendorsetup.sh dosyası oluşturun. Örneğin:
    add_lunch_combo <product-name>-userdebug
    
  7. Bu noktada, aynı cihaza dayalı 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 bazı değişkenleri gösterir.

Değişken Tanım Örnek
PRODUCT_AAPT_CONFIG paketler oluştururken kullanılacak aapt yapılandırmaları.
PRODUCT_BRAND Varsa, yazılımın özelleştirildiği marka (örneğin, taşıyıcı).
PRODUCT_CHARACTERISTICS aapt özellikleri, bir pakete varyanta özel kaynaklar eklenmesine izin verir. 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ı için kurallar config/makefile içinde tanımlanmıştır.
PRODUCT_DEVICE Endüstriyel tasarımın adı. Bu aynı zamanda pano adıdır ve yapı sistemi bunu BoardConfig.mk bulmak için kullanır. tuna
PRODUCT_LOCALES Kullanıcı için UI dili ve saat, tarih ve para birimi biçimlendirmesi gibi çeşitli ayarları açıklayan iki harfli dil kodu, iki harfli ülke kodu çiftlerinden oluşan boşlukla ayrılmış bir liste. PRODUCT_LOCALES içinde listelenen ilk yerel ayar, ürünün varsayılan yerel ayarı olarak kullanılır. en_GB , fr_CA , de_DE , es_ES
PRODUCT_MANUFACTURER Üreticinin adı. acme
PRODUCT_MODEL Son ürün için son kullanıcı tarafından görülebilen ad.
PRODUCT_NAME Genel ürün 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 için kablosuz (OTA) genel anahtarlarının listesi.
PRODUCT_PACKAGES Kurulacak APK'lerin ve modüllerin listesi. Takvim kişileri
PRODUCT_PACKAGE_OVERLAYS Varsayılan kaynakları mı kullanacağınızı veya ürüne özel kaplamalar mı ekleyeceğinizi 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ümler için sistem özellikleri, satıcı bölümü için PRODUCT_VENDOR_PROPERTIES içinde 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.

Özellikleri

Ö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 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 adlarına uygulanan normal bir ifade kullanarak bir yerel ayar filtresi ayarlamak için. Örneğin:
    • Kapsayıcı filtre: ^(de-AT|de-DE|en|uk).* - yalnızca Almanca (Avusturya ve Almanya varyantları), tüm İngilizce İngilizce ve Ukraynaca varyantlarına izin verir
    • Özel filtre: ^(?!de-IT|es).* - Almanca (İtalya varyantı) ve İspanyolca'nın tüm türevlerini 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 kalibrasyonu sırasında oem/oem.prop aracılığıyla filtre özelliği değerini ve varsayılan dili ayarlayarak, filtreyi sistem görüntüsüne 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ğlarsınız:

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

Daha sonra üretimde, hedef gereksinimleri yansıtmak için gerçek değerler oem/oem.prop yazılır. Bu yaklaşımla, fabrika ayarlarına sıfırlama sırasında varsayılan değerler korunur, böylece ilk 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 hata ayıklanabilir yapılara (-userdebug ve -eng, ancak -user değil) adb üzerinden manuel yetkilendirme olmadan erişmesini sağlar. Normalde adb, her istemci bilgisayar için bağlı herhangi bir cihaza göndereceği benzersiz bir RSA kimlik doğrulama anahtarı oluşturur. Bu, adb yetkilendirme iletişim kutusunda gösterilen RSA anahtarıdır. Alternatif olarak, bilinen anahtarları sistem görüntüsüne ekleyebilir ve bunları adb istemcisi ile paylaşabilirsiniz. Bu, işletim sistemi geliştirme ve özellikle test etme için yararlıdır çünkü adb yetkilendirme iletişim kutusuyla manuel olarak etkileşime girme ihtiyacını ortadan kaldırır.

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

  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 bir yerinde anahtar çiftlerini kontrol edin. Google bunları, örneğin, vendor/google/security/adb/ içinde saklar.
  3. PRODUCT_ADB_KEYS oluşturma değişkenini, 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, her bir 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:

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 gösterecek şekilde ayarlaması gerekir. Bu, adb manuel yetkilendirme gerektiren oluşturulan ana bilgisayar anahtarına geri dönmeden önce bu kurallı anahtarları denemesini söyler. adb , yetkisiz bir cihaza bağlanamadığında, hata mesajı, önceden ayarlanmamışsa ADB_VENDOR_KEYS ayarlamanızı önerir.