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.
- Statik veya dinamik olarak
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ındaproduct_available: true
bulunan modüller: kullanılabilir.product_specific: true
belirten kitaplıklar veya ikili programlar diğerproduct_specific: true
veyaproduct_available: true
belirten kitaplıklarAndroid.bp
dosyalarında.VNDK kitaplıklarının
Android.bp
dosyalarındaproduct_available: true
bulunmalıdır böyleceproduct
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:
erişim:
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ım ile). | 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.
system
bölümü için paketleri tanımlayan bir makefile oluşturun. Örneğin, örnek, aşağıdaki gibi biroem_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),)
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ışına 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ü satın alma dosyalarındaki
oem_system.mk
. Böylece, yapı yolu gereksiniminin ( modüllerini de içeren bir Makefile içerisinde bulunur ve böylece "yoldaki-yapıları gerekli kıl.2. Seçenek: Modülleri
system_ext
veyaproduct
bölümüne yükleyin (vesystem
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:
PRODUCT_PRODUCT_VNDK_VERSION := current
ayarla.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 kullanılan aralar şunlardır:
product_specific: true
içerenhidl_interface
modülleri kullanılabilir. Düzeltmek içinproduct_specific: true
değerini değiştirinsystem_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çinproduct_specific: true
ayarlayarak daha fazla destek alabilirsiniz.
Derleme hatalarını düzeltin ve cihazın başarılı bir şekilde oluşturulduğundan emin olun.
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 birCANNOT 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:
veyarequired:
alanı.
- Test durumu günlüğündeki
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ınsdk_version
veya kitaplığınsdk_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