Ürün bölümü arayüzlerini zorunlu kılma

Android 11, product bölümünü gruptan çıkararak system ve vendor bölümlerinden bağımsızdır. Bu değişiklikler kapsamında, artık product bölümünün yerel ve Java'ya erişimini kontrol edebilirsiniz arayüzler (vendor için arayüz yaptırımının işleyiş şekline benzer) bölümler) için kullanılabilir.

Yerel arayüzleri zorunlu kılma

Yerel arayüzü zorunlu kılma ayarını etkinleştirmek için PRODUCT_PRODUCT_VNDK_VERSION ayarını yapın Hedef: current. (Kargo ücreti alınırken sürüm otomatik olarak current olarak ayarlanır. Hedefin API düzeyi 29'dan büyükse.) Yaptırım şunlara olanak tanır:

  • Bağlanacak product bölümündeki yerel modüller:
    • Statik veya dinamik olarak product bölümünde bulunan ve statik, paylaşılan veya başlık kitaplıklar içerebilir.
    • system bölümünde, dinamik olarak VNDK kitaplıklarına bağlanır.
  • product bölümündeki paketlenmemiş APK'larda bağlanacak JNI kitaplıkları /product/lib veya /product/lib64 için kitaplıklarını (bu, NDK kitaplıkları) için geçerlidir.

Zorunlu kılma, product dışındaki bölüm bağlantılarına izin vermez bölüm.

Derleme zamanını zorunlu kılma (Android.bp)

Android 11'de sistem modülleri bir ürün oluşturabilir. temel ve tedarikçi imajı varyantlarına ek olarak resim varyantı. Yerel olduğunda arayüz yaptırımı etkinleştirildi (PRODUCT_PRODUCT_VNDK_VERSION, current):

  • product bölümündeki yerel modüller ürün varyantında var.

  • Android.bp dosyalarında product_available: true bulunan modüller: kullanılabilir.

  • product_specific: true belirten kitaplıklar veya ikili programlar diğer product_specific: true veya product_available: true belirten kitaplıklar Android.bp dosyalarında.

  • VNDK kitaplıklarının Android.bp dosyalarında product_available: true bulunmalıdır böylece product ikili programları VNDK kitaplıklarına bağlanabilir.

Aşağıdaki tabloda resim oluşturmak için kullanılan Android.bp özellikleri özetlenmektedir için de geçerlidir.

Android.bp'deki mülkler Varyantlar oluşturuldu
Yaptırım öncesinde Uygulamadan sonra
varsayılan (hiçbiri) core
(/system, /system_ext ve /product)
core
(/system ve /system_ext dahildir ancak hariçtir) /product)
system_ext_specific: true core core
product_specific: true core ürün
vendor: true otomatik satış makinesi otomatik satış makinesi
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, tedarikçi
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, tedarikçi

Derleme zamanını zorunlu kılma (Android.mk)

Yerel arayüz yaptırımı etkinleştirildiğinde, yerel modüller product bölümünde yalnızca şunlara bağlanabilen bir native:product bağlantı türü bulunuyor: diğer native:product veya native:vndk modülünde mevcut. Herhangi birine bağlanmaya çalışılıyor diğer modüller, derleme sisteminin bir bağlantı türü denetimi oluşturmasına neden olur hatası.

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

Yerel arayüzü zorunlu kılma özelliği etkinleştirildiğinde biyonik bağlayıcı, sistem işlemlerinin product kitaplıklarını kullanmasına izin vermiyor, bağlantı oluşturamayan product işlemleri için bir product bölümü oluşturuluyor product bölümünün dışındaki kitaplıklar (ancak bu tür işlemler VNDK kitaplıkları) için geçerlidir. Çalışma zamanı bağlantı yapılandırmasını ihlal etme girişimleri, işlemi başarısız olur ve CANNOT LINK EXECUTABLE hata mesajı görüntülenir.

Java arayüzlerini zorunlu kılma

Java arayüzünü zorunlu kılmayı etkinleştirmek için PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE - true. (Değer hedefin kargo API'si düzeyi şu olduğunda otomatik olarak true değerine ayarlanır: 29'dan büyük) Etkinleştirildiğinde, yaptırım aşağıdakilere izin verir veya aşağıdakilere izin vermez: access:

API /system /system_ext /product /vendor /data
Genel API
@SystemApi
@gizle API

vendor bölümünde olduğu gibi, product içindeki bir uygulama veya Java kitaplığı bölümün yalnızca herkese açık API'leri ve sistem API'lerini kullanmasına izin verilir; bir kitaplığa bağlanıyor izin verilmez. Bu kısıtlamaya, derleme sırasında bağlantı da dahildir daha iyi anlamanızı sağlar.

Derleme zamanını zorunlu kılma

Make ve Shortg, derleme sırasında product içindeki Java modüllerinin olduğunu doğrular bölüm, platform_apis ve sdk_version alanları için geçerlidir. product bölümündeki uygulamaların sdk_version kadarı olmalıdır current, system_current veya API'nin 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 kullanarak gizli API'ları tanıtabilir. Ayrıntılar için bkz. Şu kapsamdaki kısıtlamalar: SDK olmayan bilgi edinin.

Ürün arayüzü zorunlu kılmayı etkinleştir

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

Adım Görev Zorunlu
1 system bölümünü seçin, ardından yapı yolu gereksinim kontrolünü ayarlayın (sistem dışı modüllerin yüklenmesini önlemek için)device.mk system bölümüne ekleyin. H
2 İzin verilenler listesini temizleyin. H
3 Yerel arayüzleri zorunlu kılın ve çalışma zamanı bağlantı hatalarını tanımlayın ( (Java yaptırımına paralel olarak) devam eder. Y
4 Java arayüzlerini zorunlu kılın ve çalışma zamanı davranışını doğrulayın (paralel olarak çalışabilir) yerel yaptırımla). Y
5 Çalışma zamanı davranışlarını kontrol edin. Y
6 Ürün arayüzünü zorunlu kılarak device.mk uygulamasını güncelleyin. Y

1. Adım: Yapma dosyası oluşturun ve yapı yolu kontrolünü etkinleştirin

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

  1. system bölümü için paketleri tanımlayan bir makefile oluşturun. Örneğin, örnek, aşağıdaki gibi 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 için ortak oluşturma dosyasını devral Bölümlendirme ve yapı yolu gereksinimleri kontrolünü etkinleştirme. Örnek:

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

Yapı 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 içinde tanımlanan yollar ve paketleri engeller mevcut oluşturma dosyasında yolların dışındaki yapıların yüklenmesinden tanımlanır require-artifacts-in-path adresinde tanımlanmıştır.

Yukarıdaki örnekte, PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS değeri şu şekilde ayarlanmıştır: strict, oem_system.mk dışındaki oluşturma dosyaları şu klasöre yüklenmiş modül içeremez: root veya system bölümü. Bu modülleri dahil etmek için: bunları oem_system.mk dosyasının kendisinde veya eklenen bir hazır dosyasında tanımlamanızı öneririz. İzin verilmeyen yollara modül yükleme denemeleri, derleme aralarına neden olur. Düzeltmek için aşağıdakilerden birini yapın:

  • 1. Seçenek: Sistem modülünü Google Etiket Yöneticisi'ndeki Makefiles'e oem_system.mk. Böylece, yapı yolu gereksiniminin ( modüllerini de içeren bir Makefile içerisinde mevcuttur) ve böylece, "yoldaki-yapıları gerekli kıl.

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

  • 3. Seçenek: PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST. Bu listede izin verilen modüller var yüklenecek.

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

Bu adımda PRODUCT_ARTIFACT_PATH_REQUIREMENT_ALLOWED_LIST boş olduğundan, oem_system.mk paylaşan tüm cihazlar da tek bir system paylaşabilir görüntüsüdür. İzin verilenler listesini boşaltmak için listedeki modülleri system_ext veya product bölümünü ya da system dosya oluşturmak için bu bölümleri ekleyin. Bu adım isteğe bağlıdır çünkü genel bir system görüntüsü tanımlamak ürün arayüzü yaptırımını etkinleştirin. Ancak izin verilenler listesinin boşaltılması system_ext ile system sınırını 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 adlı bir cihaz ayarlıyorsunuz ve derleme ve çalışma zamanı hatalarını düzeltme ve çözme. Cihaz başlatma işlemini ve günlükleri kontrol etmek için ve çalışma zamanı bağlantısı hatalarını bulup düzeltin:

  1. PRODUCT_PRODUCT_VNDK_VERSION := current ayarla.

  2. Cihazı oluşturun ve yapı hatalarını arayın. Gemini'ın başarılı olması için Eksik ürün varyantları veya temel varyantlar için aralar. Sık karşılaşılan aralar şunlardır:

    • product_specific: true içeren hidl_interface modülleri kullanılabilir. Düzeltmek için product_specific: true değerini değiştirin system_ext_specific: true ile.
    • Modüllerde ürün için gereken ürün varyantı eksik olabilir modüllerinde yer alır. Bu sorunu düzeltmek için şu modülü product bölümünde kullanılabilir hale getirin: product_available: true ayarlanıyor veya modülü product bölümlendirmek için product_specific: true değerini ayarlamanız gerekir.
  3. Derleme hatalarını düzeltin ve cihazın başarılı bir şekilde oluşturulduğundan emin olun.

  4. Görüntüyü güncelleyip cihaz başlatma ve günlüklerde çalışma zamanı hatalarını bulun.

    • Test durumu günlüğündeki linker etiketi bir CANNOT LINK EXECUTABLE gösteriyorsa mesajını görüyorsanız, yap dosyasında bir bağımlılık eksiktir (ve derleme zamanı) ekleyebilirsiniz.
    • Bunu derleme sisteminden kontrol etmek için gerekli kitaplığı shared_libs: veya required: alanı.
  5. Yukarıda verilen rehberden yararlanarak 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, ve oluşan yapı hatalarını bulup düzeltin. İki belirli hata türüne bakın:

  • Bağlantı türü hataları. Bu hata, bir uygulamanın Java modüllerine bağlandığını gösterir daha geniş bir sdk_version aralığına sahip. Bu sorunu düzeltmek için uygulamanın sdk_version veya kitaplığın sdk_version özelliğini kısıtlayın. Ö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 simgenin bulunamadığını gösterir. gizli bir API'dedir. Düzeltmek için görünür (gizli olmayan) bir API kullanın veya alternatifidir. Ö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. Aşağıdaki özelliklere sahip uygulamalar için: hata ayıklaması yapabilirsiniz. Gizli API kullanımını StrictMode.detectNonSdkApiUsage (uygulamada gizli API) kaldırın. Alternatif olarak, veridex kullanım türünü (bağlantı oluşturma veya düşünme) öğrenmek için bir statik analiz aracı kısıtlama seviyesi ve çağrı yığını.

  • Veridex söz dizimi:

    ./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ıyla ilgili ayrıntılar için, Veridex aracını kullanarak test etme aracını kullanın.

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

Tüm derleme ve çalışma zamanı hatalarını düzelttikten ve çalışma zamanını doğruladıktan sonra beklendiği gibi olduğunda device.mk içinde aşağıdakileri ayarlayın:

  • PRODUCT_PRODUCT_VNDK_VERSION := current
  • PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE := true