Ürün Bölme Arayüzlerini Zorlama

Android 11, product bölümünü ayrıştırarak system ve vendor bölümlerinden bağımsız olmasını sağlar. Bu değişikliklerin bir parçası olarak, artık product bölümünün yerel ve Java arayüzlerine erişimini denetleyebilirsiniz (bu, vendor bölümleri için arayüz uygulamasının nasıl çalıştığına benzer).

Yerel arayüzleri zorunlu kılma

Yerel arayüz uygulamasını etkinleştirmek için PRODUCT_PRODUCT_VNDK_VERSION current olarak ayarlayın. (Hedef için gönderim API düzeyi 29'dan büyük olduğunda sürüm otomatik olarak current şekilde ayarlanır.) Yaptırım şunları sağlar:

  • Bağlanacak product bölümündeki yerel modüller:
    • product bölümündeki statik, paylaşılan veya başlık kitaplıkları içeren diğer modüllere statik veya dinamik olarak.
    • system bölümündeki VNDK kitaplıklarına dinamik olarak.
  • /product/lib veya /product/lib64 içindeki kitaplıklara bağlanmak için product bölümündeki ayrıştırılmış APK'lardaki JNI kitaplıkları (bu, NDK kitaplıklarına ektir).

Uygulama, product bölümü dışındaki bölümlere başka bağlantılara izin vermez.

Derleme zamanı uygulaması (Android.bp)

Android 11'de sistem modülleri, çekirdek ve satıcı görseli çeşitlerine ek olarak bir ürün görseli çeşidi de oluşturabilir. Yerel arayüz uygulaması etkinleştirildiğinde ( PRODUCT_PRODUCT_VNDK_VERSION current olarak ayarlanmıştır):

  • product bölümündeki yerel modüller, çekirdek varyant yerine ürün varyantında bulunur.

  • Android.bp dosyalarında product_available: true bulunan modüller, ürün çeşidi için mevcuttur.

  • product_specific: true belirten kitaplıklar veya ikili dosyalar, Android.bp dosyalarında product_specific: true veya product_available: true belirten diğer kitaplıklara bağlantı verebilir.

  • product ikili dosyalarının VNDK kitaplıklarına bağlanabilmesi için VNDK kitaplıklarının Android.bp dosyalarında product_available: true olması gerekir.

Aşağıdaki tablo, görüntü çeşitleri oluşturmak için kullanılan Android.bp özelliklerini özetlemektedir.

Android.bp'deki özellikler Varyantlar oluşturuldu
Yürürlükten önce Yürürlükten sonra
varsayılan (yok) çekirdek

( /system , /system_ext ve /product içerir)

çekirdek

( /system ve /system_ext içerir ancak /product içermez)

system_ext_specific: true çekirdek çekirdek
product_specific: true çekirdek ürün
vendor: true SATICI SATICI
vendor_available: true çekirdek, satıcı çekirdek, satıcı
product_available: true Yok çekirdek, ürün
vendor_available: true VE product_available: true Yok çekirdek, ürün, satıcı
system_ext_specific: true VE vendor_available: true çekirdek, satıcı çekirdek, satıcı
product_specific: true VE vendor_available: true çekirdek, satıcı ürün, satıcı

Derleme zamanı uygulaması (Android.mk)

Yerel arayüz uygulaması etkinleştirildiğinde, product bölümüne yüklenen yerel modüller, yalnızca diğer native:product veya native:vndk modüllerine bağlanabilen bir native:product bağlantı türüne sahiptir. Bunların dışındaki herhangi bir modüle bağlanmaya çalışmak, derleme sisteminin bağlantı türü kontrol hatası oluşturmasına neden olur.

Çalışma zamanı yaptırımı

Yerel arayüz uygulaması etkinleştirildiğinde, biyonik bağlayıcıya yönelik bağlayıcı yapılandırması, sistem işlemlerinin product kitaplıklarını kullanmasına izin vermez ve product bölümü dışındaki kitaplıklara bağlanamayan product işlemleri için bir product bölümü oluşturur (ancak bu tür işlemler, VNDK kütüphanelerine bağlantı). Çalışma zamanı bağlantı yapılandırmasını ihlal etme girişimleri, işlemin başarısız olmasına ve CANNOT LINK EXECUTABLE hata mesajının oluşturulmasına neden olur.

Java arayüzlerini zorlama

Java arayüzü zorlamasını etkinleştirmek için PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE öğesini true olarak ayarlayın. (Hedef için gönderim API düzeyi 29'dan büyük olduğunda değer otomatik olarak true olarak ayarlanır.) Etkinleştirildiğinde, uygulama aşağıdaki erişime izin verir/izin vermez.

API'si /sistem /system_ext /ürün /SATICI /veri
Genel API
@SystemApi
@hide API'si

vendor bölümünde olduğu gibi, product bölümündeki bir uygulamanın veya Java kitaplığının yalnızca genel ve sistem API'lerini kullanmasına izin verilir; Gizli API'leri kullanan bir kitaplığa bağlantı verilmesine izin verilmez. Bu kısıtlama, derleme zamanındaki bağlantıyı ve çalışma zamanındaki yansımayı içerir.

Zaman yaptırımı oluşturma

Derleme sırasında Make ve Soong, platform_apis ve sdk_version alanlarını kontrol ederek product bölümündeki Java modüllerinin gizli API'leri kullanmadığını doğrular. product bölümündeki uygulamaların sdk_version API'nin current , system_current veya sayısal sürümüyle doldurulmalı ve platform_apis alanı boş olmalıdır.

Çalışma zamanı yaptırımı

Android çalışma zamanı, product bölümündeki uygulamaların yansıma da dahil olmak üzere gizli API'leri kullanmadığını doğrular. Ayrıntılar için SDK olmayan arayüzlerdeki kısıtlamalar konusuna bakın.

Ürün arayüzü yaptırımını etkinleştirme

Ürün arayüzü uygulamasını etkinleştirmek için bu bölümdeki adımları kullanın.

Adım Görev Gerekli
1 system bölümü için paketleri belirten kendi sistem makefile dosyanızı tanımlayın, ardından device.mk yapıt yolu gereksinim kontrolünü ayarlayın (sistem dışı modüllerin system bölümüne yüklenmesini önlemek için). N
2 İzin verilenler listesini temizleyin. N
3 Yerel arayüzleri zorunlu kılın ve çalışma zamanı bağlantı hatalarını tanımlayın (Java uygulamasıyla paralel olarak çalışabilir). e
4 Java arayüzlerini zorunlu kılın ve çalışma zamanı davranışını doğrulayın (yerel uygulamayla paralel olarak çalışabilir). e
5 Çalışma zamanı davranışlarını kontrol edin. e
6 device.mk dosyasını ürün arayüzü uygulamasıyla güncelleyin. e

Adım 1: Makefile oluşturun ve yapı yolu denetimini etkinleştirin

Bu adımda system makefile'ını tanımlarsınız.

  1. system bölümü için paketleri tanımlayan bir makefile oluşturun. Örneğin aşağıdakileri içeren bir oem_system.mk dosyası oluşturun:

    $(call inherit-product, $(SRC_TARGET_DIR)/product/handheld_system.mk)
    $(call inherit-product, $(SRC_TARGET_DIR)/product/telephony_system.mk)
    
    # Applications
    PRODUCT_PACKAGES += \
        CommonSystemApp1 \
        CommonSystemApp2 \
        CommonSystemApp3 \
    
    # Binaries
    PRODUCT_PACKAGES += \
        CommonSystemBin1 \
        CommonSystemBin2 \
        CommonSystemBin3 \
    
    # Libraries
    PRODUCT_PACKAGES += \
        CommonSystemLib1 \
        CommonSystemLib2 \
        CommonSystemLib3 \
    
    PRODUCT_SYSTEM_NAME := oem_system
    PRODUCT_SYSTEM_BRAND := Android
    PRODUCT_SYSTEM_MANUFACTURER := Android
    PRODUCT_SYSTEM_MODEL := oem_system
    PRODUCT_SYSTEM_DEVICE := generic
    
    # For system-as-root devices, system.img should be mounted at /, so we
    # include ROOT here.
    _my_paths := \
     $(TARGET_COPY_OUT_ROOT)/ \
     $(TARGET_COPY_OUT_SYSTEM)/ \
    
    $(call require-artifacts-in-path, $(_my_paths),)
    
  2. device.mk dosyasında, system bölümü için ortak makefile dosyasını devralın ve yapı yolu gereksinimleri kontrolünü etkinleştirin. Örneğin:

    $(call inherit-product, $(SRC_TARGET_DIR)/product/oem_system.mk)
    
    # Enable artifact path requirements checking
    PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := strict
    

Yapıt yolu gereksinimleri hakkında

PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS true veya strict olarak ayarlandığında, derleme sistemi, diğer makefile dosyalarında tanımlanan paketlerin require-artifacts-in-path tanımlanan yollara kurulmasını engeller ve geçerli makefile dosyasında tanımlanan paketlerin, require-artifacts-in-path -'de tanımlanan yolların dışındaki yapıları kurmasını engeller. require-artifacts-in-path .

Yukarıdaki örnekte, PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS strict olarak ayarlandığında, oem_system.mk dışındaki makefile dosyaları root veya system bölümüne yüklenen modülleri içeremez. Bu modülleri dahil etmek için bunları oem_system.mk dosyasının kendisinde veya dahil edilen bir makefile içinde tanımlamanız gerekir. İzin verilmeyen yollara modül yükleme girişimleri derleme kesintilerine neden olur. Kesintileri düzeltmek için aşağıdakilerden birini yapın:

  • Seçenek 1: Sistem modülünü oem_system.mk dosyasındaki makefile dosyalarına ekleyin. Bu, yapay yol gereksiniminin karşılanmasını sağlar (modüller artık dahil edilen bir makefile içinde mevcut olduğundan) ve böylece 'yolda-yapıları-gerektir' içindeki yol kümesine kurulum yapılmasına izin verir.

  • Seçenek 2: Modülleri system_ext veya product bölümüne yükleyin (ve modülleri system bölümüne kurmayın).

  • 3. Seçenek: PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST modüller ekleyin. Bu, kurulmasına izin verilen modülleri listeler.

2. Adım: İzin verilenler listesini boşaltın

Bu adımda, oem_system.mk paylaşan tüm cihazların aynı zamanda tek bir system görüntüsünü de paylaşabilmesi için PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST boş bırakırsınız. İzin verilenler listesini boşaltmak için listedeki tüm modülleri system_ext veya product bölümüne taşıyın veya bunları system yapım dosyalarına ekleyin. Ürün arayüzü uygulamasını etkinleştirmek için ortak bir system görüntüsünün tanımlanması gerekmediğinden bu adım isteğe bağlıdır. Ancak izin verilenler listesinin boşaltılması, system sınırını system_ext ile tanımlamak için faydalıdır.

3. Adım: Yerel arayüzleri zorunlu kılın

Bu adımda PRODUCT_PRODUCT_VNDK_VERSION := current ayarını yapar, ardından derleme ve çalışma zamanı hatalarını arar ve bunları çözersiniz. Cihaz önyüklemesini ve günlüklerini kontrol etmek ve çalışma zamanı bağlantı hatalarını bulup düzeltmek için:

  1. PRODUCT_PRODUCT_VNDK_VERSION := current ayarlayın.

  2. Cihazı oluşturun ve derleme hatalarını arayın. Eksik ürün çeşitleri veya temel çeşitler için birkaç derleme molası görmeniz muhtemeldir. Ortak molalar şunları içerir:

    • product_specific: true sahip herhangi bir hidl_interface modülü, sistem modülleri için kullanılamaz. Düzeltmek için, product_specific: true system_ext_specfic: true ile değiştirin.
    • Modüllerde, ürün modülleri için gereken ürün çeşidi eksik olabilir. Düzeltmek için, product_available: true ayarını yaparak bu modülü product bölümünde kullanılabilir hale getirin veya product_specific: true ayarını yaparak modülü product bölümüne taşıyın.
  3. Derleme hatalarını çözün ve cihazın başarıyla oluşturulduğundan emin olun.

  4. Görüntüyü flaşlayın ve cihazın önyüklemesinde ve günlüklerinde çalışma zamanı hatalarını arayın.

    • Test senaryosu günlüğündeki linker etiketi CANNOT LINK EXECUTABLE iletisini gösteriyorsa, make dosyasında bir bağımlılık eksiktir (ve derleme sırasında yakalanmamıştır).
    • Derleme sisteminden kontrol etmek için gerekli kitaplığı shared_libs: veya required: alanına ekleyin.
  5. Yukarıda verilen kılavuzu kullanarak eksik bağımlılıkları çözün.

4. Adım: Java arayüzlerini zorunlu kılın

Bu adımda PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE := true ayarını yaparsınız, ardından ortaya çıkan derleme hatalarını bulup düzeltirsiniz. İki spesifik hata türünü arayın:

  • Bağlantı türü hataları. Bu hata, bir uygulamanın daha geniş bir sdk_version sahip Java modüllerine bağlandığını gösterir. Düzeltmek için uygulamanın sdk_version genişletebilir veya kitaplığın sdk_version kısıtlayabilirsiniz. Örnek hata:

    error: frameworks/base/packages/SystemUI/Android.bp:138:1: module "SystemUI" variant "android_common": compiles against system API, but dependency "telephony-common" is compiling against private API.Adjust sdk_version: property of the source or target module so that target module is built with the same or smaller API set than the source.
    
  • Sembol hataları. Bu hata, bir sembolün gizli bir API'de olması nedeniyle bulunamadığını gösterir. Düzeltmek için görünür (gizli olmayan) bir API kullanın veya bir alternatif bulun. Örnek hata:

    frameworks/opt/net/voip/src/java/com/android/server/sip/SipSessionGroup.java:1051: error: cannot find symbol
                ProxyAuthenticate proxyAuth = (ProxyAuthenticate)response.getHeader(
                                               ^
      symbol:   class ProxyAuthenticate
      location: class SipSessionGroup.SipSessionImpl
    

5. Adım: Çalışma zamanı davranışlarını kontrol edin

Bu adımda çalışma zamanı davranışlarının beklendiği gibi olduğunu doğrularsınız. Hata ayıklaması yapılabilen uygulamalar için, StrictMode.detectNonSdkApiUsage (uygulama gizli bir API kullandığında bir günlük oluşturur) kullanarak gizli API kullanımını günlük yoluyla izleyebilirsiniz. Alternatif olarak, kullanım türünü (bağlantı veya yansıma), kısıtlama düzeyini ve çağrı yığınını öğrenmek için veridex statik analiz aracını kullanabilirsiniz.

  • Veridex sözdizimi:

    ./art/tools/veridex/appcompat.sh --dex-file={apk file}
    
  • Örnek veridex sonucu:

    #1: Linking greylist-max-o Landroid/animation/AnimationHandler;-><init>()V use(s):
           Lcom/android/systemui/pip/phone/PipMotionHelper;-><init>(Landroid/content/Context;Landroid/app/IActivityManager;Landroid/app/IActivityTaskManager;Lcom/android/systemui/pip/phone/PipMenuActivityController;Lcom/android/internal/policy/PipSnapAlgorithm;Lcom/android/systemui/statusbar/FlingAnimationUtils;)V
    
    #1332: Reflection greylist Landroid/app/Activity;->mMainThread use(s):
           Landroidx/core/app/ActivityRecreator;->getMainThreadField()Ljava/lang/reflect/Field;
    

Veridex kullanımına ilişkin ayrıntılar için Veridex aracını kullanarak test etme bölümüne bakın.

Adım 6: Device.mk'yi güncelleyin

Tüm derleme ve çalışma zamanı hatalarını düzelttikten ve çalışma zamanı davranışlarının beklendiği gibi olduğunu doğruladıktan sonra, device.mk dosyasında aşağıdakileri ayarlayın:

  • PRODUCT_PRODUCT_VNDK_VERSION := current
  • PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE := true